ReactOS 0.4.17-dev-573-g8315b8c
http.c File Reference
#include "urlmon_main.h"
#include "wininet.h"
#include "shlwapi.h"
#include "wine/debug.h"
Include dependency graph for http.c:

Go to the source code of this file.

Classes

struct  HttpProtocol
 

Macros

#define NO_SHLWAPI_REG
 

Functions

 WINE_DEFAULT_DEBUG_CHANNEL (urlmon)
 
static HttpProtocolimpl_from_IUnknown (IUnknown *iface)
 
static HttpProtocolimpl_from_IInternetProtocolEx (IInternetProtocolEx *iface)
 
static HttpProtocolimpl_from_IInternetPriority (IInternetPriority *iface)
 
static HttpProtocolimpl_from_IWinInetHttpInfo (IWinInetHttpInfo *iface)
 
static LPWSTR query_http_info (HttpProtocol *This, DWORD option)
 
static BOOL set_security_flag (HttpProtocol *This, DWORD flags)
 
static HRESULT internet_error_to_hres (DWORD error)
 
static HRESULT handle_http_error (HttpProtocol *This, DWORD error)
 
static ULONG send_http_request (HttpProtocol *This)
 
static HttpProtocolimpl_from_Protocol (Protocol *prot)
 
static HRESULT HttpProtocol_open_request (Protocol *prot, IUri *uri, DWORD request_flags, HINTERNET internet_session, IInternetBindInfo *bind_info)
 
static HRESULT HttpProtocol_end_request (Protocol *protocol)
 
static BOOL is_redirect_response (DWORD status_code)
 
static HRESULT HttpProtocol_start_downloading (Protocol *prot)
 
static void HttpProtocol_close_connection (Protocol *prot)
 
static void HttpProtocol_on_error (Protocol *prot, DWORD error)
 
static HRESULT WINAPI HttpProtocolUnk_QueryInterface (IUnknown *iface, REFIID riid, void **ppv)
 
static ULONG WINAPI HttpProtocolUnk_AddRef (IUnknown *iface)
 
static ULONG WINAPI HttpProtocolUnk_Release (IUnknown *iface)
 
static HRESULT WINAPI HttpProtocol_QueryInterface (IInternetProtocolEx *iface, REFIID riid, void **ppv)
 
static ULONG WINAPI HttpProtocol_AddRef (IInternetProtocolEx *iface)
 
static ULONG WINAPI HttpProtocol_Release (IInternetProtocolEx *iface)
 
static HRESULT WINAPI HttpProtocol_Start (IInternetProtocolEx *iface, LPCWSTR szUrl, IInternetProtocolSink *pOIProtSink, IInternetBindInfo *pOIBindInfo, DWORD grfPI, HANDLE_PTR dwReserved)
 
static HRESULT WINAPI HttpProtocol_Continue (IInternetProtocolEx *iface, PROTOCOLDATA *pProtocolData)
 
static HRESULT WINAPI HttpProtocol_Abort (IInternetProtocolEx *iface, HRESULT hrReason, DWORD dwOptions)
 
static HRESULT WINAPI HttpProtocol_Terminate (IInternetProtocolEx *iface, DWORD dwOptions)
 
static HRESULT WINAPI HttpProtocol_Suspend (IInternetProtocolEx *iface)
 
static HRESULT WINAPI HttpProtocol_Resume (IInternetProtocolEx *iface)
 
static HRESULT WINAPI HttpProtocol_Read (IInternetProtocolEx *iface, void *pv, ULONG cb, ULONG *pcbRead)
 
static HRESULT WINAPI HttpProtocol_Seek (IInternetProtocolEx *iface, LARGE_INTEGER dlibMove, DWORD dwOrigin, ULARGE_INTEGER *plibNewPosition)
 
static HRESULT WINAPI HttpProtocol_LockRequest (IInternetProtocolEx *iface, DWORD dwOptions)
 
static HRESULT WINAPI HttpProtocol_UnlockRequest (IInternetProtocolEx *iface)
 
static HRESULT WINAPI HttpProtocol_StartEx (IInternetProtocolEx *iface, IUri *pUri, IInternetProtocolSink *pOIProtSink, IInternetBindInfo *pOIBindInfo, DWORD grfPI, HANDLE *dwReserved)
 
static HRESULT WINAPI HttpPriority_QueryInterface (IInternetPriority *iface, REFIID riid, void **ppv)
 
static ULONG WINAPI HttpPriority_AddRef (IInternetPriority *iface)
 
static ULONG WINAPI HttpPriority_Release (IInternetPriority *iface)
 
static HRESULT WINAPI HttpPriority_SetPriority (IInternetPriority *iface, LONG nPriority)
 
static HRESULT WINAPI HttpPriority_GetPriority (IInternetPriority *iface, LONG *pnPriority)
 
static HRESULT WINAPI HttpInfo_QueryInterface (IWinInetHttpInfo *iface, REFIID riid, void **ppv)
 
static ULONG WINAPI HttpInfo_AddRef (IWinInetHttpInfo *iface)
 
static ULONG WINAPI HttpInfo_Release (IWinInetHttpInfo *iface)
 
static HRESULT WINAPI HttpInfo_QueryOption (IWinInetHttpInfo *iface, DWORD dwOption, void *pBuffer, DWORD *pcbBuffer)
 
static HRESULT WINAPI HttpInfo_QueryInfo (IWinInetHttpInfo *iface, DWORD dwOption, void *pBuffer, DWORD *pcbBuffer, DWORD *pdwFlags, DWORD *pdwReserved)
 
static HRESULT create_http_protocol (BOOL https, IUnknown *outer, void **ppobj)
 
HRESULT HttpProtocol_Construct (IUnknown *outer, void **ppv)
 
HRESULT HttpSProtocol_Construct (IUnknown *outer, void **ppv)
 

Variables

static const WCHAR default_headersW [] = L"Accept-Encoding: gzip, deflate"
 
static const ProtocolVtbl AsyncProtocolVtbl
 
static const IUnknownVtbl HttpProtocolUnkVtbl
 
static const IInternetProtocolExVtbl HttpProtocolVtbl
 
static const IInternetPriorityVtbl HttpPriorityVtbl
 
static const IWinInetHttpInfoVtbl WinInetHttpInfoVtbl
 

Macro Definition Documentation

◆ NO_SHLWAPI_REG

#define NO_SHLWAPI_REG

Definition at line 23 of file http.c.

Function Documentation

◆ create_http_protocol()

static HRESULT create_http_protocol ( BOOL  https,
IUnknown outer,
void **  ppobj 
)
static

Definition at line 953 of file http.c.

954{
956
957 ret = calloc(1, sizeof(HttpProtocol));
958 if(!ret)
959 return E_OUTOFMEMORY;
960
961 ret->base.vtbl = &AsyncProtocolVtbl;
962 ret->IUnknown_inner.lpVtbl = &HttpProtocolUnkVtbl;
963 ret->IInternetProtocolEx_iface.lpVtbl = &HttpProtocolVtbl;
964 ret->IInternetPriority_iface.lpVtbl = &HttpPriorityVtbl;
965 ret->IWinInetHttpInfo_iface.lpVtbl = &WinInetHttpInfoVtbl;
966
967 ret->https = https;
968 ret->ref = 1;
969 ret->outer = outer ? outer : &ret->IUnknown_inner;
970
971 *ppobj = &ret->IUnknown_inner;
972
974 return S_OK;
975}
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
static const IWinInetHttpInfoVtbl WinInetHttpInfoVtbl
Definition: http.c:945
static const IUnknownVtbl HttpProtocolUnkVtbl
Definition: http.c:686
static const IInternetPriorityVtbl HttpPriorityVtbl
Definition: http.c:890
static const ProtocolVtbl AsyncProtocolVtbl
Definition: http.c:618
static const IInternetProtocolExVtbl HttpProtocolVtbl
Definition: http.c:835
return ret
Definition: mutex.c:146
#define S_OK
Definition: intsafe.h:52
static IUnknown * outer
Definition: compobj.c:82
#define calloc
Definition: rosglue.h:14
static void URLMON_LockModule(void)
Definition: urlmon_main.h:64

Referenced by HttpProtocol_Construct(), and HttpSProtocol_Construct().

◆ handle_http_error()

static HRESULT handle_http_error ( HttpProtocol This,
DWORD  error 
)
static

Definition at line 122 of file http.c.

123{
124 IServiceProvider *serv_prov;
125 IWindowForBindingUI *wfb_ui;
128 DWORD dlg_flags;
129 HWND hwnd;
130 DWORD res;
132
133 TRACE("(%p %lu)\n", This, error);
134
135 switch(error) {
149 break;
150 default:
152 }
153
154 hres = IInternetProtocolSink_QueryInterface(This->base.protocol_sink, &IID_IServiceProvider,
155 (void**)&serv_prov);
156 if(FAILED(hres)) {
157 ERR("Failed to get IServiceProvider.\n");
158 return E_ABORT;
159 }
160
161 if(security_problem) {
162 hres = IServiceProvider_QueryService(serv_prov, &IID_IHttpSecurity, &IID_IHttpSecurity,
163 (void**)&http_security);
164 if(SUCCEEDED(hres)) {
165 hres = IHttpSecurity_OnSecurityProblem(http_security, error);
166 IHttpSecurity_Release(http_security);
167
168 TRACE("OnSecurityProblem returned %08lx\n", hres);
169
170 if(hres != S_FALSE)
171 {
172 BOOL res = FALSE;
173
174 IServiceProvider_Release(serv_prov);
175
176 if(hres == S_OK) {
183
184 if(res)
185 return RPC_E_RETRY;
186
187 FIXME("Don't know how to ignore error %ld\n", error);
188 return E_ABORT;
189 }
190
191 if(hres == E_ABORT)
192 return E_ABORT;
193 if(hres == RPC_E_RETRY)
194 return RPC_E_RETRY;
195
197 }
198 }
199 }
200
201 switch(error) {
203 if(hres != S_FALSE) {
204 /* Silently ignore the error. We will get more detailed error from wininet anyway. */
207 break;
208 }
209 /* fallthrough */
210 default:
211 hres = IServiceProvider_QueryService(serv_prov, &IID_IWindowForBindingUI, &IID_IWindowForBindingUI, (void**)&wfb_ui);
212 if(SUCCEEDED(hres)) {
213 const IID *iid_reason;
214
216 iid_reason = &IID_IHttpSecurity;
218 iid_reason = &IID_IAuthenticate;
219 else
220 iid_reason = &IID_IWindowForBindingUI;
221
222 hres = IWindowForBindingUI_GetWindow(wfb_ui, iid_reason, &hwnd);
223 IWindowForBindingUI_Release(wfb_ui);
224 }
225
226 if(FAILED(hres)) hwnd = NULL;
227
229 if(This->base.bindf & BINDF_NO_UI)
230 dlg_flags |= FLAGS_ERROR_UI_FLAGS_NO_UI;
231
232 res = InternetErrorDlg(hwnd, This->base.request, error, dlg_flags, NULL);
234 }
235
236 IServiceProvider_Release(serv_prov);
237 return hres;
238}
#define FIXME(fmt,...)
Definition: precomp.h:53
#define ERR(fmt,...)
Definition: precomp.h:57
#define ERROR_SUCCESS
Definition: deptool.c:10
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
static HRESULT internet_error_to_hres(DWORD error)
Definition: http.c:99
static BOOL set_security_flag(HttpProtocol *This, DWORD flags)
Definition: http.c:88
DWORD WINAPI InternetErrorDlg(HWND hWnd, HINTERNET hRequest, DWORD dwError, DWORD dwFlags, LPVOID *lppvData)
Definition: dialogs.c:472
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
GLuint res
Definition: glext.h:9613
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define FAILED(hr)
Definition: intsafe.h:51
#define error(str)
Definition: mkdosfs.c:1605
HRESULT hres
Definition: protocol.c:465
static IHttpSecurity http_security
Definition: protocol.c:292
static BOOL security_problem
Definition: protocol.c:165
#define TRACE(s)
Definition: solgame.cpp:4
_In_ LONG _In_ HWND hwnd
Definition: winddi.h:4023
#define S_FALSE
Definition: winerror.h:3451
#define RPC_E_RETRY
Definition: winerror.h:3557
#define E_ABORT
Definition: winerror.h:3481
#define SECURITY_FLAG_IGNORE_CERT_DATE_INVALID
Definition: winhttp.h:344
#define SECURITY_FLAG_IGNORE_UNKNOWN_CA
Definition: winhttp.h:343
#define SECURITY_FLAG_IGNORE_CERT_CN_INVALID
Definition: winhttp.h:345
#define ERROR_INTERNET_SEC_CERT_CN_INVALID
Definition: wininet.h:2026
#define ERROR_INTERNET_HTTP_TO_HTTPS_ON_REDIR
Definition: wininet.h:2027
#define ERROR_INTERNET_INVALID_CA
Definition: wininet.h:2033
#define ERROR_INTERNET_INCORRECT_PASSWORD
Definition: wininet.h:2003
#define FLAGS_ERROR_UI_FLAGS_GENERATE_DATA
Definition: wininet.h:1908
#define ERROR_INTERNET_SEC_CERT_DATE_INVALID
Definition: wininet.h:2025
#define ERROR_INTERNET_FORCE_RETRY
Definition: wininet.h:2021
#define ERROR_INTERNET_CLIENT_AUTH_CERT_NEEDED
Definition: wininet.h:2032
#define FLAGS_ERROR_UI_FLAGS_NO_UI
Definition: wininet.h:1909
#define ERROR_HTTP_REDIRECT_NEEDS_CONFIRMATION
Definition: wininet.h:2068
#define SECURITY_FLAG_IGNORE_REVOCATION
Definition: wininet.h:829
#define ERROR_INTERNET_SEC_CERT_REV_FAILED
Definition: wininet.h:2044
#define ERROR_INTERNET_SEC_CERT_REVOKED
Definition: wininet.h:2078
#define ERROR_INTERNET_SEC_CERT_NO_REV
Definition: wininet.h:2043
#define ERROR_INTERNET_SEC_CERT_ERRORS
Definition: wininet.h:2042
#define ERROR_INTERNET_HTTPS_TO_HTTP_ON_REDIR
Definition: wininet.h:2028
#define FLAGS_ERROR_UI_FLAGS_CHANGE_OPTIONS
Definition: wininet.h:1907
#define ERROR_INTERNET_SEC_INVALID_CERT
Definition: wininet.h:2077

Referenced by HttpProtocol_on_error(), and HttpProtocol_open_request().

◆ HttpInfo_AddRef()

static ULONG WINAPI HttpInfo_AddRef ( IWinInetHttpInfo iface)
static

Definition at line 904 of file http.c.

905{
907 return IInternetProtocolEx_AddRef(&This->IInternetProtocolEx_iface);
908}
static HttpProtocol * impl_from_IWinInetHttpInfo(IWinInetHttpInfo *iface)
Definition: http.c:61

◆ HttpInfo_QueryInfo()

static HRESULT WINAPI HttpInfo_QueryInfo ( IWinInetHttpInfo iface,
DWORD  dwOption,
void pBuffer,
DWORD pcbBuffer,
DWORD pdwFlags,
DWORD pdwReserved 
)
static

Definition at line 930 of file http.c.

932{
934 TRACE("(%p)->(%lx %p %p %p %p)\n", This, dwOption, pBuffer, pcbBuffer, pdwFlags, pdwReserved);
935
936 if(!This->base.request)
937 return E_FAIL;
938
939 if(!HttpQueryInfoA(This->base.request, dwOption, pBuffer, pcbBuffer, pdwFlags))
940 return S_FALSE;
941
942 return S_OK;
943}
#define E_FAIL
Definition: ddrawi.h:102
BOOL WINAPI HttpQueryInfoA(HINTERNET hHttpRequest, DWORD dwInfoLevel, LPVOID lpBuffer, LPDWORD lpdwBufferLength, LPDWORD lpdwIndex)
Definition: http.c:4018
PVOID pBuffer

◆ HttpInfo_QueryInterface()

static HRESULT WINAPI HttpInfo_QueryInterface ( IWinInetHttpInfo iface,
REFIID  riid,
void **  ppv 
)
static

Definition at line 898 of file http.c.

899{
901 return IInternetProtocolEx_QueryInterface(&This->IInternetProtocolEx_iface, riid, ppv);
902}
REFIID riid
Definition: atlbase.h:39
REFIID LPVOID * ppv
Definition: atlbase.h:39

◆ HttpInfo_QueryOption()

static HRESULT WINAPI HttpInfo_QueryOption ( IWinInetHttpInfo iface,
DWORD  dwOption,
void pBuffer,
DWORD pcbBuffer 
)
static

Definition at line 916 of file http.c.

918{
920 TRACE("(%p)->(%lx %p %p)\n", This, dwOption, pBuffer, pcbBuffer);
921
922 if(!This->base.request)
923 return E_FAIL;
924
925 if(!InternetQueryOptionW(This->base.request, dwOption, pBuffer, pcbBuffer))
926 return S_FALSE;
927 return S_OK;
928}
BOOL WINAPI InternetQueryOptionW(HINTERNET hInternet, DWORD dwOption, LPVOID lpBuffer, LPDWORD lpdwBufferLength)
Definition: internet.c:2697

◆ HttpInfo_Release()

static ULONG WINAPI HttpInfo_Release ( IWinInetHttpInfo iface)
static

Definition at line 910 of file http.c.

911{
913 return IInternetProtocolEx_Release(&This->IInternetProtocolEx_iface);
914}

◆ HttpPriority_AddRef()

static ULONG WINAPI HttpPriority_AddRef ( IInternetPriority iface)
static

Definition at line 858 of file http.c.

859{
861 return IInternetProtocolEx_AddRef(&This->IInternetProtocolEx_iface);
862}
static HttpProtocol * impl_from_IInternetPriority(IInternetPriority *iface)
Definition: http.c:56

◆ HttpPriority_GetPriority()

static HRESULT WINAPI HttpPriority_GetPriority ( IInternetPriority iface,
LONG pnPriority 
)
static

Definition at line 880 of file http.c.

881{
883
884 TRACE("(%p)->(%p)\n", This, pnPriority);
885
886 *pnPriority = This->base.priority;
887 return S_OK;
888}

◆ HttpPriority_QueryInterface()

static HRESULT WINAPI HttpPriority_QueryInterface ( IInternetPriority iface,
REFIID  riid,
void **  ppv 
)
static

Definition at line 852 of file http.c.

853{
855 return IInternetProtocolEx_QueryInterface(&This->IInternetProtocolEx_iface, riid, ppv);
856}

◆ HttpPriority_Release()

static ULONG WINAPI HttpPriority_Release ( IInternetPriority iface)
static

Definition at line 864 of file http.c.

865{
867 return IInternetProtocolEx_Release(&This->IInternetProtocolEx_iface);
868}

◆ HttpPriority_SetPriority()

static HRESULT WINAPI HttpPriority_SetPriority ( IInternetPriority iface,
LONG  nPriority 
)
static

Definition at line 870 of file http.c.

871{
873
874 TRACE("(%p)->(%ld)\n", This, nPriority);
875
876 This->base.priority = nPriority;
877 return S_OK;
878}

◆ HttpProtocol_Abort()

static HRESULT WINAPI HttpProtocol_Abort ( IInternetProtocolEx iface,
HRESULT  hrReason,
DWORD  dwOptions 
)
static

Definition at line 744 of file http.c.

746{
748
749 TRACE("(%p)->(%08lx %08lx)\n", This, hrReason, dwOptions);
750
751 return protocol_abort(&This->base, hrReason);
752}
static HttpProtocol * impl_from_IInternetProtocolEx(IInternetProtocolEx *iface)
Definition: http.c:51
HRESULT protocol_abort(Protocol *protocol, HRESULT reason)
Definition: protocol.c:518
DWORD dwOptions
Definition: solitaire.cpp:25

◆ HttpProtocol_AddRef()

static ULONG WINAPI HttpProtocol_AddRef ( IInternetProtocolEx iface)
static

Definition at line 699 of file http.c.

700{
702 TRACE("(%p)\n", This);
703 return IUnknown_AddRef(This->outer);
704}

◆ HttpProtocol_close_connection()

static void HttpProtocol_close_connection ( Protocol prot)
static

Definition at line 581 of file http.c.

582{
584
585 if(This->http_negotiate) {
586 IHttpNegotiate_Release(This->http_negotiate);
587 This->http_negotiate = NULL;
588 }
589
590 free(This->full_header);
591 This->full_header = NULL;
592}
#define free
Definition: debug_ros.c:5
static HttpProtocol * impl_from_Protocol(Protocol *prot)
Definition: http.c:282

◆ HttpProtocol_Construct()

HRESULT HttpProtocol_Construct ( IUnknown outer,
void **  ppv 
)

Definition at line 977 of file http.c.

978{
979 TRACE("(%p %p)\n", outer, ppv);
980
982}
static HRESULT create_http_protocol(BOOL https, IUnknown *outer, void **ppobj)
Definition: http.c:953

◆ HttpProtocol_Continue()

static HRESULT WINAPI HttpProtocol_Continue ( IInternetProtocolEx iface,
PROTOCOLDATA *  pProtocolData 
)
static

Definition at line 735 of file http.c.

736{
738
739 TRACE("(%p)->(%p)\n", This, pProtocolData);
740
741 return protocol_continue(&This->base, pProtocolData);
742}
HRESULT protocol_continue(Protocol *protocol, PROTOCOLDATA *data)
Definition: protocol.c:355

◆ HttpProtocol_end_request()

static HRESULT HttpProtocol_end_request ( Protocol protocol)
static

Definition at line 478 of file http.c.

479{
480 BOOL res;
481
482 res = HttpEndRequestW(protocol->request, NULL, 0, 0);
483 if(!res && GetLastError() != ERROR_IO_PENDING) {
484 FIXME("HttpEndRequest failed: %lu\n", GetLastError());
485 return E_FAIL;
486 }
487
488 return S_OK;
489}
#define ERROR_IO_PENDING
Definition: dderror.h:15
BOOL WINAPI HttpEndRequestW(HINTERNET hRequest, LPINTERNET_BUFFERSW lpBuffersOut, DWORD dwFlags, DWORD_PTR dwContext)
Definition: http.c:5389
DWORD WINAPI GetLastError(void)
Definition: except.c:1042

◆ HttpProtocol_LockRequest()

static HRESULT WINAPI HttpProtocol_LockRequest ( IInternetProtocolEx iface,
DWORD  dwOptions 
)
static

Definition at line 796 of file http.c.

797{
799
800 TRACE("(%p)->(%08lx)\n", This, dwOptions);
801
802 return protocol_lock_request(&This->base);
803}
HRESULT protocol_lock_request(Protocol *protocol)
Definition: protocol.c:498

◆ HttpProtocol_on_error()

static void HttpProtocol_on_error ( Protocol prot,
DWORD  error 
)
static

Definition at line 594 of file http.c.

595{
598
599 TRACE("(%p) %ld\n", prot, error);
600
602 FIXME("Not handling error %ld\n", error);
603 return;
604 }
605
608
610 return;
611 }
612
613 protocol_abort(prot, hres);
615 return;
616}
static ULONG send_http_request(HttpProtocol *This)
Definition: http.c:240
static HRESULT handle_http_error(HttpProtocol *This, DWORD error)
Definition: http.c:122
void protocol_close_connection(Protocol *protocol)
Definition: protocol.c:531
DWORD flags
Definition: urlmon_main.h:104
#define FLAG_FIRST_CONTINUE_COMPLETE
Definition: urlmon_main.h:149

◆ HttpProtocol_open_request()

static HRESULT HttpProtocol_open_request ( Protocol prot,
IUri uri,
DWORD  request_flags,
HINTERNET  internet_session,
IInternetBindInfo bind_info 
)
static

Definition at line 287 of file http.c.

289{
291 WCHAR *addl_header = NULL, *post_cookie = NULL, *rootdoc_url = NULL;
293 IHttpNegotiate2 *http_negotiate2 = NULL;
295 LPOLESTR accept_mimes[257];
296 const WCHAR **accept_types;
297 BYTE security_id[512];
299 ULONG num, error;
300 BOOL res, b;
302
303 static const WCHAR wszBindVerb[BINDVERB_CUSTOM][5] =
304 {L"GET",
305 L"POST",
306 L"PUT"};
307
308 hres = IUri_GetPort(uri, &port);
309 if(FAILED(hres))
310 return hres;
311
312 hres = IUri_GetHost(uri, &host);
313 if(FAILED(hres))
314 return hres;
315
316 hres = IUri_GetUserName(uri, &user);
317 if(SUCCEEDED(hres)) {
318 hres = IUri_GetPassword(uri, &pass);
319
320 if(SUCCEEDED(hres)) {
321 This->base.connection = InternetConnectW(internet_session, host, port, user, pass,
324 }
326 }
328 if(FAILED(hres))
329 return hres;
330 if(!This->base.connection) {
331 WARN("InternetConnect failed: %ld\n", GetLastError());
333 }
334
335 num = 0;
336 hres = IInternetBindInfo_GetBindString(bind_info, BINDSTRING_ROOTDOC_URL, &rootdoc_url, 1, &num);
337 if(hres == S_OK && num) {
338 FIXME("Use root doc URL %s\n", debugstr_w(rootdoc_url));
339 CoTaskMemFree(rootdoc_url);
340 }
341
342 num = ARRAY_SIZE(accept_mimes) - 1;
343 hres = IInternetBindInfo_GetBindString(bind_info, BINDSTRING_ACCEPT_MIMES, accept_mimes, num, &num);
344 if(hres == INET_E_USE_DEFAULT_SETTING) {
345 static const WCHAR *default_accept_mimes[] = {L"*/*", NULL};
346
347 accept_types = default_accept_mimes;
348 num = 0;
349 }else if(hres == S_OK) {
350 accept_types = (const WCHAR**)accept_mimes;
351 }else {
352 WARN("GetBindString BINDSTRING_ACCEPT_MIMES failed: %08lx\n", hres);
354 }
355 accept_mimes[num] = 0;
356
357 if(This->https)
359
360 hres = IUri_GetPathAndQuery(uri, &path);
361 if(SUCCEEDED(hres)) {
362 This->base.request = HttpOpenRequestW(This->base.connection,
363 This->base.bind_info.dwBindVerb < BINDVERB_CUSTOM
364 ? wszBindVerb[This->base.bind_info.dwBindVerb] : This->base.bind_info.szCustomVerb,
365 path, NULL, NULL, accept_types, request_flags, (DWORD_PTR)&This->base);
367 }
368 while(num--)
369 CoTaskMemFree(accept_mimes[num]);
370 if(FAILED(hres))
371 return hres;
372 if (!This->base.request) {
373 WARN("HttpOpenRequest failed: %ld\n", GetLastError());
375 }
376
377 hres = IInternetProtocolSink_QueryInterface(This->base.protocol_sink, &IID_IServiceProvider,
378 (void **)&service_provider);
379 if (hres != S_OK) {
380 WARN("IInternetProtocolSink_QueryInterface IID_IServiceProvider failed: %08lx\n", hres);
381 return hres;
382 }
383
384 hres = IServiceProvider_QueryService(service_provider, &IID_IHttpNegotiate,
385 &IID_IHttpNegotiate, (void **)&This->http_negotiate);
386 if (hres != S_OK) {
387 WARN("IServiceProvider_QueryService IID_IHttpNegotiate failed: %08lx\n", hres);
388 IServiceProvider_Release(service_provider);
389 return hres;
390 }
391
392 hres = IUri_GetAbsoluteUri(uri, &url);
393 if(FAILED(hres)) {
394 IServiceProvider_Release(service_provider);
395 return hres;
396 }
397
398 hres = IHttpNegotiate_BeginningTransaction(This->http_negotiate, url, default_headersW,
399 0, &addl_header);
401 if(hres != S_OK) {
402 WARN("IHttpNegotiate_BeginningTransaction failed: %08lx\n", hres);
403 IServiceProvider_Release(service_provider);
404 return hres;
405 }
406
407 len = addl_header ? lstrlenW(addl_header) : 0;
408
409 This->full_header = malloc(len * sizeof(WCHAR) + sizeof(default_headersW));
410 if(!This->full_header) {
411 IServiceProvider_Release(service_provider);
412 return E_OUTOFMEMORY;
413 }
414
415 if(len)
416 memcpy(This->full_header, addl_header, len*sizeof(WCHAR));
417 CoTaskMemFree(addl_header);
418 memcpy(This->full_header+len, default_headersW, sizeof(default_headersW));
419
420 hres = IServiceProvider_QueryService(service_provider, &IID_IHttpNegotiate2,
421 &IID_IHttpNegotiate2, (void **)&http_negotiate2);
422 IServiceProvider_Release(service_provider);
423 if(hres != S_OK) {
424 WARN("IServiceProvider_QueryService IID_IHttpNegotiate2 failed: %08lx\n", hres);
425 /* No goto done as per native */
426 }else {
427 len = ARRAY_SIZE(security_id);
428 hres = IHttpNegotiate2_GetRootSecurityId(http_negotiate2, security_id, &len, 0);
429 IHttpNegotiate2_Release(http_negotiate2);
430 if (hres != S_OK)
431 WARN("IHttpNegotiate2_GetRootSecurityId failed: %08lx\n", hres);
432 }
433
434 /* FIXME: Handle security_id. Native calls undocumented function IsHostInProxyBypassList. */
435
436 if(This->base.bind_info.dwBindVerb == BINDVERB_POST) {
437 num = 0;
438 hres = IInternetBindInfo_GetBindString(bind_info, BINDSTRING_POST_COOKIE, &post_cookie, 1, &num);
439 if(hres == S_OK && num) {
441 post_cookie, lstrlenW(post_cookie)))
442 WARN("InternetSetOption INTERNET_OPTION_SECONDARY_CACHE_KEY failed: %ld\n", GetLastError());
443 CoTaskMemFree(post_cookie);
444 }
445 }
446
449 if(!res)
450 WARN("InternetSetOption(INTERNET_OPTION_ERROR_MASK) failed: %lu\n", GetLastError());
451
452 b = TRUE;
453 res = InternetSetOptionW(This->base.request, INTERNET_OPTION_HTTP_DECODING, &b, sizeof(b));
454 if(!res)
455 WARN("InternetSetOption(INTERNET_OPTION_HTTP_DECODING) failed: %lu\n", GetLastError());
456
457 do {
459
460 switch(error) {
461 case ERROR_IO_PENDING:
462 return S_OK;
463 case ERROR_SUCCESS:
464 /*
465 * If sending response ended synchronously, it means that we have the whole data
466 * available locally (most likely in cache).
467 */
468 return protocol_syncbinding(&This->base);
469 default:
471 }
472 } while(hres == RPC_E_RETRY);
473
474 WARN("HttpSendRequest failed: %ld\n", error);
475 return hres;
476}
void user(int argc, const char *argv[])
Definition: cmds.c:1350
#define ARRAY_SIZE(A)
Definition: main.h:20
#define WARN(fmt,...)
Definition: precomp.h:61
#define malloc
Definition: debug_ros.c:4
void WINAPI CoTaskMemFree(void *ptr)
Definition: malloc.c:389
OLECHAR * BSTR
Definition: compat.h:2293
#define lstrlenW
Definition: compat.h:750
static const WCHAR default_headersW[]
Definition: http.c:66
HRESULT protocol_syncbinding(Protocol *protocol)
Definition: protocol.c:101
static HINTERNET internet_session
Definition: protocol.c:288
USHORT port
Definition: uri.c:210
HINTERNET WINAPI HttpOpenRequestW(HINTERNET hHttpSession, LPCWSTR lpszVerb, LPCWSTR lpszObjectName, LPCWSTR lpszVersion, LPCWSTR lpszReferrer, LPCWSTR *lpszAcceptTypes, DWORD dwFlags, DWORD_PTR dwContext)
Definition: http.c:3469
HINTERNET WINAPI InternetConnectW(HINTERNET hInternet, LPCWSTR lpszServerName, INTERNET_PORT nServerPort, LPCWSTR lpszUserName, LPCWSTR lpszPassword, DWORD dwService, DWORD dwFlags, DWORD_PTR dwContext)
Definition: internet.c:1258
BOOL WINAPI InternetSetOptionW(HINTERNET hInternet, DWORD dwOption, LPVOID lpBuffer, DWORD dwBufferLength)
Definition: internet.c:2837
#define L(x)
Definition: resources.c:13
GLboolean GLboolean GLboolean b
Definition: glext.h:6204
GLbitfield flags
Definition: glext.h:7161
GLuint GLuint num
Definition: glext.h:9618
GLenum GLsizei len
Definition: glext.h:6722
#define b
Definition: ke_i.h:79
#define debugstr_w
Definition: kernel32.h:32
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
static const WCHAR url[]
Definition: encode.c:1384
static IServiceProvider service_provider
Definition: mimeole.c:1286
static IInternetBindInfo bind_info
Definition: mimeole.c:1246
const WCHAR * uri
Definition: sec_mgr.c:1564
void WINAPI DECLSPEC_HOTPATCH SysFreeString(BSTR str)
Definition: oleaut.c:273
short WCHAR
Definition: pedump.c:58
Definition: txthost.c:37
uint32_t DWORD_PTR
Definition: typedefs.h:65
uint32_t ULONG
Definition: typedefs.h:59
pass
Definition: typegen.h:25
#define INET_E_NO_VALID_MEDIA
Definition: winerror.h:4660
#define INET_E_RESOURCE_NOT_FOUND
Definition: winerror.h:4655
#define INET_E_CANNOT_CONNECT
Definition: winerror.h:4654
request_flags
#define INTERNET_ERROR_MASK_COMBINED_SEC_CERT
Definition: wininet.h:125
#define INTERNET_OPTION_SECONDARY_CACHE_KEY
Definition: wininet.h:747
#define INTERNET_FLAG_SECURE
Definition: wininet.h:71
#define INTERNET_OPTION_ERROR_MASK
Definition: wininet.h:755
#define INTERNET_OPTION_HTTP_DECODING
Definition: wininet.h:758
#define INTERNET_SERVICE_HTTP
Definition: wininet.h:562
unsigned char BYTE
Definition: xxhash.c:193

◆ HttpProtocol_QueryInterface()

static HRESULT WINAPI HttpProtocol_QueryInterface ( IInternetProtocolEx iface,
REFIID  riid,
void **  ppv 
)
static

Definition at line 692 of file http.c.

693{
695 TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv);
696 return IUnknown_QueryInterface(This->outer, riid, ppv);
697}
#define debugstr_guid
Definition: kernel32.h:35

◆ HttpProtocol_Read()

static HRESULT WINAPI HttpProtocol_Read ( IInternetProtocolEx iface,
void pv,
ULONG  cb,
ULONG pcbRead 
)
static

Definition at line 778 of file http.c.

780{
782
783 TRACE("(%p)->(%p %lu %p)\n", This, pv, cb, pcbRead);
784
785 return protocol_read(&This->base, pv, cb, pcbRead);
786}
static MonoProfilerRuntimeShutdownBeginCallback cb
Definition: metahost.c:118
static int protocol_read
Definition: htmldoc.c:205

◆ HttpProtocol_Release()

static ULONG WINAPI HttpProtocol_Release ( IInternetProtocolEx iface)
static

Definition at line 706 of file http.c.

707{
709 TRACE("(%p)\n", This);
710 return IUnknown_Release(This->outer);
711}

◆ HttpProtocol_Resume()

static HRESULT WINAPI HttpProtocol_Resume ( IInternetProtocolEx iface)
static

Definition at line 771 of file http.c.

772{
774 FIXME("(%p)\n", This);
775 return E_NOTIMPL;
776}
#define E_NOTIMPL
Definition: ddrawi.h:99

◆ HttpProtocol_Seek()

static HRESULT WINAPI HttpProtocol_Seek ( IInternetProtocolEx iface,
LARGE_INTEGER  dlibMove,
DWORD  dwOrigin,
ULARGE_INTEGER plibNewPosition 
)
static

Definition at line 788 of file http.c.

790{
792 FIXME("(%p)->(%ld %ld %p)\n", This, dlibMove.LowPart, dwOrigin, plibNewPosition);
793 return E_NOTIMPL;
794}
ULONG LowPart
Definition: typedefs.h:106

◆ HttpProtocol_Start()

static HRESULT WINAPI HttpProtocol_Start ( IInternetProtocolEx iface,
LPCWSTR  szUrl,
IInternetProtocolSink pOIProtSink,
IInternetBindInfo pOIBindInfo,
DWORD  grfPI,
HANDLE_PTR  dwReserved 
)
static

Definition at line 713 of file http.c.

716{
718 IUri *uri;
720
721 TRACE("(%p)->(%s %p %p %08lx %Ix)\n", This, debugstr_w(szUrl), pOIProtSink,
722 pOIBindInfo, grfPI, dwReserved);
723
724 hres = CreateUri(szUrl, 0, 0, &uri);
725 if(FAILED(hres))
726 return hres;
727
728 hres = IInternetProtocolEx_StartEx(&This->IInternetProtocolEx_iface, uri, pOIProtSink,
729 pOIBindInfo, grfPI, (HANDLE*)dwReserved);
730
731 IUri_Release(uri);
732 return hres;
733}
HRESULT WINAPI CreateUri(LPCWSTR pwzURI, DWORD dwFlags, DWORD_PTR dwReserved, IUri **ppURI)
Definition: uri.c:5382
_In_ HANDLE _In_ DWORD _In_ DWORD _Inout_opt_ LPOVERLAPPED _In_opt_ LPTRANSMIT_FILE_BUFFERS _In_ DWORD dwReserved
Definition: mswsock.h:95

◆ HttpProtocol_start_downloading()

static HRESULT HttpProtocol_start_downloading ( Protocol prot)
static

Definition at line 503 of file http.c.

504{
507 DWORD len = sizeof(DWORD);
509 BOOL res;
511
512 if(!This->http_negotiate) {
513 WARN("Expected IHttpNegotiate pointer to be non-NULL\n");
514 return S_OK;
515 }
516
518 &status_code, &len, NULL);
519 if(res) {
520 WCHAR *response_headers;
521
522 if((This->base.bind_info.dwOptions & BINDINFO_OPTIONS_DISABLEAUTOREDIRECTS) && is_redirect_response(status_code)) {
524
525 TRACE("Got redirect with disabled auto redirects\n");
526
529 IInternetProtocolSink_ReportResult(This->base.protocol_sink, INET_E_REDIRECT_FAILED, 0, location);
530 free(location);
532 }
533
535 if(response_headers) {
536 hres = IHttpNegotiate_OnResponse(This->http_negotiate, status_code, response_headers,
537 NULL, NULL);
538 free(response_headers);
539 if (hres != S_OK) {
540 WARN("IHttpNegotiate_OnResponse failed: %08lx\n", hres);
541 return S_OK;
542 }
543 }
544 }else {
545 WARN("HttpQueryInfo failed: %ld\n", GetLastError());
546 }
547
549 if(ranges) {
550 IInternetProtocolSink_ReportProgress(This->base.protocol_sink, BINDSTATUS_ACCEPTRANGES, NULL);
551 free(ranges);
552 }
553
555 if(content_type) {
556 /* remove the charset, if present */
557 LPWSTR p = wcschr(content_type, ';');
558 if (p) *p = '\0';
559
560 IInternetProtocolSink_ReportProgress(This->base.protocol_sink,
561 (This->base.bindf & BINDF_FROMURLMON)
562 ? BINDSTATUS_MIMETYPEAVAILABLE : BINDSTATUS_RAWMIMETYPE,
565 }else {
566 WARN("HttpQueryInfo failed: %ld\n", GetLastError());
567 IInternetProtocolSink_ReportProgress(This->base.protocol_sink,
568 (This->base.bindf & BINDF_FROMURLMON)
569 ? BINDSTATUS_MIMETYPEAVAILABLE : BINDSTATUS_RAWMIMETYPE, L"text/html");
570 }
571
573 if(content_length) {
574 This->base.content_length = wcstol(content_length, NULL, 10);
576 }
577
578 return S_OK;
579}
#define wcschr
Definition: compat.h:17
_ACRTIMP __msvcrt_long __cdecl wcstol(const wchar_t *, wchar_t **, int)
Definition: wcs.c:2752
static LPWSTR query_http_info(HttpProtocol *This, DWORD option)
Definition: http.c:68
static BOOL is_redirect_response(DWORD status_code)
Definition: http.c:491
BOOL WINAPI HttpQueryInfoW(HINTERNET hHttpRequest, DWORD dwInfoLevel, LPVOID lpBuffer, LPDWORD lpdwBufferLength, LPDWORD lpdwIndex)
Definition: http.c:3870
GLfloat GLfloat p
Definition: glext.h:8902
#define location(file, line)
Definition: kmtest.h:18
static BSTR content_type
static DWORD64 content_length
Definition: http.c:2127
#define DWORD
Definition: nt_native.h:44
uint16_t * LPWSTR
Definition: typedefs.h:56
#define FLAG_LAST_DATA_REPORTED
Definition: urlmon_main.h:152
#define FLAG_RESULT_REPORTED
Definition: urlmon_main.h:153
#define INET_E_REDIRECT_FAILED
Definition: winerror.h:4667
#define HTTP_QUERY_RAW_HEADERS_CRLF
Definition: wininet.h:1545
#define HTTP_QUERY_FLAG_NUMBER
Definition: wininet.h:1606
#define HTTP_QUERY_ACCEPT_RANGES
Definition: wininet.h:1565
#define HTTP_QUERY_CONTENT_TYPE
Definition: wininet.h:1524
#define HTTP_QUERY_LOCATION
Definition: wininet.h:1556
#define HTTP_QUERY_STATUS_CODE
Definition: wininet.h:1542
#define HTTP_QUERY_CONTENT_LENGTH
Definition: wininet.h:1528

◆ HttpProtocol_StartEx()

static HRESULT WINAPI HttpProtocol_StartEx ( IInternetProtocolEx iface,
IUri pUri,
IInternetProtocolSink pOIProtSink,
IInternetBindInfo pOIBindInfo,
DWORD  grfPI,
HANDLE dwReserved 
)
static

Definition at line 814 of file http.c.

817{
819 DWORD scheme = 0;
821
822 TRACE("(%p)->(%p %p %p %08lx %p)\n", This, pUri, pOIProtSink,
823 pOIBindInfo, grfPI, dwReserved);
824
825 hres = IUri_GetScheme(pUri, &scheme);
826 if(FAILED(hres))
827 return hres;
828 if(scheme != (This->https ? URL_SCHEME_HTTPS : URL_SCHEME_HTTP))
829 return MK_E_SYNTAX;
830
831 return protocol_start(&This->base, (IInternetProtocol*)&This->IInternetProtocolEx_iface, pUri,
832 pOIProtSink, pOIBindInfo);
833}
#define protocol_start(p, u, e)
Definition: protocol.c:303
@ URL_SCHEME_HTTPS
Definition: shlwapi.h:555
@ URL_SCHEME_HTTP
Definition: shlwapi.h:546
DWORD scheme
#define MK_E_SYNTAX
Definition: winerror.h:3896

◆ HttpProtocol_Suspend()

static HRESULT WINAPI HttpProtocol_Suspend ( IInternetProtocolEx iface)
static

Definition at line 764 of file http.c.

765{
767 FIXME("(%p)\n", This);
768 return E_NOTIMPL;
769}

◆ HttpProtocol_Terminate()

static HRESULT WINAPI HttpProtocol_Terminate ( IInternetProtocolEx iface,
DWORD  dwOptions 
)
static

Definition at line 754 of file http.c.

755{
757
758 TRACE("(%p)->(%08lx)\n", This, dwOptions);
759
761 return S_OK;
762}

◆ HttpProtocol_UnlockRequest()

static HRESULT WINAPI HttpProtocol_UnlockRequest ( IInternetProtocolEx iface)
static

Definition at line 805 of file http.c.

806{
808
809 TRACE("(%p)\n", This);
810
811 return protocol_unlock_request(&This->base);
812}
HRESULT protocol_unlock_request(Protocol *protocol)
Definition: protocol.c:506

◆ HttpProtocolUnk_AddRef()

static ULONG WINAPI HttpProtocolUnk_AddRef ( IUnknown iface)
static

Definition at line 661 of file http.c.

662{
665 TRACE("(%p) ref=%ld\n", This, ref);
666 return ref;
667}
#define InterlockedIncrement
Definition: armddk.h:53
static HttpProtocol * impl_from_IUnknown(IUnknown *iface)
Definition: http.c:46
long LONG
Definition: pedump.c:60
Definition: send.c:48

◆ HttpProtocolUnk_QueryInterface()

static HRESULT WINAPI HttpProtocolUnk_QueryInterface ( IUnknown iface,
REFIID  riid,
void **  ppv 
)
static

Definition at line 626 of file http.c.

627{
629
631 TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
632 *ppv = &This->IUnknown_inner;
633 }else if(IsEqualGUID(&IID_IInternetProtocolRoot, riid)) {
634 TRACE("(%p)->(IID_IInternetProtocolRoot %p)\n", This, ppv);
635 *ppv = &This->IInternetProtocolEx_iface;
636 }else if(IsEqualGUID(&IID_IInternetProtocol, riid)) {
637 TRACE("(%p)->(IID_IInternetProtocol %p)\n", This, ppv);
638 *ppv = &This->IInternetProtocolEx_iface;
639 }else if(IsEqualGUID(&IID_IInternetProtocolEx, riid)) {
640 TRACE("(%p)->(IID_IInternetProtocolEx %p)\n", This, ppv);
641 *ppv = &This->IInternetProtocolEx_iface;
642 }else if(IsEqualGUID(&IID_IInternetPriority, riid)) {
643 TRACE("(%p)->(IID_IInternetPriority %p)\n", This, ppv);
644 *ppv = &This->IInternetPriority_iface;
645 }else if(IsEqualGUID(&IID_IWinInetInfo, riid)) {
646 TRACE("(%p)->(IID_IWinInetInfo %p)\n", This, ppv);
647 *ppv = &This->IWinInetHttpInfo_iface;
648 }else if(IsEqualGUID(&IID_IWinInetHttpInfo, riid)) {
649 TRACE("(%p)->(IID_IWinInetHttpInfo %p)\n", This, ppv);
650 *ppv = &This->IWinInetHttpInfo_iface;
651 }else {
652 *ppv = NULL;
653 WARN("not supported interface %s\n", debugstr_guid(riid));
654 return E_NOINTERFACE;
655 }
656
657 IUnknown_AddRef((IUnknown*)*ppv);
658 return S_OK;
659}
const GUID IID_IUnknown
#define IsEqualGUID(rguid1, rguid2)
Definition: guiddef.h:147
#define E_NOINTERFACE
Definition: winerror.h:3479

◆ HttpProtocolUnk_Release()

static ULONG WINAPI HttpProtocolUnk_Release ( IUnknown iface)
static

Definition at line 669 of file http.c.

670{
673
674 TRACE("(%p) ref=%ld\n", This, ref);
675
676 if(!ref) {
678 free(This);
679
681 }
682
683 return ref;
684}
#define InterlockedDecrement
Definition: armddk.h:52
static void URLMON_UnlockModule(void)
Definition: urlmon_main.h:65

◆ HttpSProtocol_Construct()

HRESULT HttpSProtocol_Construct ( IUnknown outer,
void **  ppv 
)

Definition at line 984 of file http.c.

985{
986 TRACE("(%p %p)\n", outer, ppv);
987
989}

◆ impl_from_IInternetPriority()

static HttpProtocol * impl_from_IInternetPriority ( IInternetPriority iface)
inlinestatic

Definition at line 56 of file http.c.

57{
58 return CONTAINING_RECORD(iface, HttpProtocol, IInternetPriority_iface);
59}
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260

Referenced by HttpPriority_AddRef(), HttpPriority_GetPriority(), HttpPriority_QueryInterface(), HttpPriority_Release(), and HttpPriority_SetPriority().

◆ impl_from_IInternetProtocolEx()

◆ impl_from_IUnknown()

static HttpProtocol * impl_from_IUnknown ( IUnknown iface)
inlinestatic

Definition at line 46 of file http.c.

47{
48 return CONTAINING_RECORD(iface, HttpProtocol, IUnknown_inner);
49}

Referenced by HttpProtocolUnk_AddRef(), HttpProtocolUnk_QueryInterface(), and HttpProtocolUnk_Release().

◆ impl_from_IWinInetHttpInfo()

static HttpProtocol * impl_from_IWinInetHttpInfo ( IWinInetHttpInfo iface)
inlinestatic

Definition at line 61 of file http.c.

62{
63 return CONTAINING_RECORD(iface, HttpProtocol, IWinInetHttpInfo_iface);
64}

Referenced by HttpInfo_AddRef(), HttpInfo_QueryInfo(), HttpInfo_QueryInterface(), HttpInfo_QueryOption(), and HttpInfo_Release().

◆ impl_from_Protocol()

static HttpProtocol * impl_from_Protocol ( Protocol prot)
inlinestatic

◆ internet_error_to_hres()

static HRESULT internet_error_to_hres ( DWORD  error)
inlinestatic

◆ is_redirect_response()

static BOOL is_redirect_response ( DWORD  status_code)
static

Definition at line 491 of file http.c.

492{
493 switch(status_code) {
498 return TRUE;
499 }
500 return FALSE;
501}
#define HTTP_STATUS_REDIRECT_KEEP_VERB
Definition: winhttp.h:315
#define HTTP_STATUS_REDIRECT
Definition: winhttp.h:311
#define HTTP_STATUS_MOVED
Definition: winhttp.h:310
#define HTTP_STATUS_REDIRECT_METHOD
Definition: winhttp.h:312

Referenced by HttpProtocol_start_downloading().

◆ query_http_info()

static LPWSTR query_http_info ( HttpProtocol This,
DWORD  option 
)
static

Definition at line 68 of file http.c.

69{
70 LPWSTR ret = NULL;
71 DWORD len = 0;
72 BOOL res;
73
74 res = HttpQueryInfoW(This->base.request, option, NULL, &len, NULL);
76 ret = malloc(len);
77 res = HttpQueryInfoW(This->base.request, option, ret, &len, NULL);
78 }
79 if(!res) {
80 TRACE("HttpQueryInfoW(%ld) failed: %08lx\n", option, GetLastError());
81 free(ret);
82 return NULL;
83 }
84
85 return ret;
86}
#define ERROR_INSUFFICIENT_BUFFER
Definition: dderror.h:10
Definition: getopt.h:109

Referenced by HttpProtocol_start_downloading().

◆ send_http_request()

static ULONG send_http_request ( HttpProtocol This)
static

Definition at line 240 of file http.c.

241{
243 BOOL res;
244
245 send_buffer.lpcszHeader = This->full_header;
246 send_buffer.dwHeadersLength = send_buffer.dwHeadersTotal = lstrlenW(This->full_header);
247
248 if(This->base.bind_info.dwBindVerb != BINDVERB_GET) {
249 switch(This->base.bind_info.stgmedData.tymed) {
250 case TYMED_HGLOBAL:
251 /* Native does not use GlobalLock/GlobalUnlock, so we won't either */
252 send_buffer.lpvBuffer = This->base.bind_info.stgmedData.hGlobal;
253 send_buffer.dwBufferLength = send_buffer.dwBufferTotal = This->base.bind_info.cbstgmedData;
254 break;
255 case TYMED_ISTREAM: {
257
258 send_buffer.dwBufferTotal = This->base.bind_info.cbstgmedData;
259 if(!This->base.post_stream) {
260 This->base.post_stream = This->base.bind_info.stgmedData.pstm;
261 IStream_AddRef(This->base.post_stream);
262 }
263
264 offset.QuadPart = 0;
265 IStream_Seek(This->base.post_stream, offset, STREAM_SEEK_SET, NULL);
266 break;
267 }
268 default:
269 FIXME("Unsupported This->base.bind_info.stgmedData.tymed %ld\n", This->base.bind_info.stgmedData.tymed);
270 }
271 }
272
273 if(This->base.post_stream)
274 res = HttpSendRequestExW(This->base.request, &send_buffer, NULL, 0, 0);
275 else
276 res = HttpSendRequestW(This->base.request, send_buffer.lpcszHeader, send_buffer.dwHeadersLength,
277 send_buffer.lpvBuffer, send_buffer.dwBufferLength);
278
279 return res ? 0 : GetLastError();
280}
BOOL WINAPI HttpSendRequestW(HINTERNET hHttpRequest, LPCWSTR lpszHeaders, DWORD dwHeaderLength, LPVOID lpOptional, DWORD dwOptionalLength)
Definition: http.c:5595
BOOL WINAPI HttpSendRequestExW(HINTERNET hRequest, LPINTERNET_BUFFERSW lpBuffersIn, LPINTERNET_BUFFERSW lpBuffersOut, DWORD dwFlags, DWORD_PTR dwContext)
Definition: http.c:5500
GLintptr offset
Definition: glext.h:5920
static const char * send_buffer
Definition: http.c:2198
struct _INTERNET_BUFFERSW INTERNET_BUFFERSW

Referenced by HttpProtocol_on_error(), and HttpProtocol_open_request().

◆ set_security_flag()

static BOOL set_security_flag ( HttpProtocol This,
DWORD  flags 
)
inlinestatic

Definition at line 88 of file http.c.

89{
90 BOOL res;
91
93 if(!res)
94 ERR("Failed to set security flags: %lx\n", flags);
95
96 return res;
97}
#define INTERNET_OPTION_SECURITY_FLAGS
Definition: wininet.h:725

Referenced by handle_http_error().

◆ WINE_DEFAULT_DEBUG_CHANNEL()

WINE_DEFAULT_DEBUG_CHANNEL ( urlmon  )

Variable Documentation

◆ AsyncProtocolVtbl

const ProtocolVtbl AsyncProtocolVtbl
static
Initial value:
= {
}
static HRESULT HttpProtocol_open_request(Protocol *prot, IUri *uri, DWORD request_flags, HINTERNET internet_session, IInternetBindInfo *bind_info)
Definition: http.c:287
static HRESULT HttpProtocol_start_downloading(Protocol *prot)
Definition: http.c:503
static void HttpProtocol_on_error(Protocol *prot, DWORD error)
Definition: http.c:594
static void HttpProtocol_close_connection(Protocol *prot)
Definition: http.c:581
static HRESULT HttpProtocol_end_request(Protocol *protocol)
Definition: http.c:478

Definition at line 618 of file http.c.

Referenced by create_http_protocol().

◆ default_headersW

const WCHAR default_headersW[] = L"Accept-Encoding: gzip, deflate"
static

Definition at line 66 of file http.c.

Referenced by HttpProtocol_open_request().

◆ HttpPriorityVtbl

const IInternetPriorityVtbl HttpPriorityVtbl
static
Initial value:
= {
}
static HRESULT WINAPI HttpPriority_SetPriority(IInternetPriority *iface, LONG nPriority)
Definition: http.c:870
static HRESULT WINAPI HttpPriority_GetPriority(IInternetPriority *iface, LONG *pnPriority)
Definition: http.c:880
static HRESULT WINAPI HttpPriority_QueryInterface(IInternetPriority *iface, REFIID riid, void **ppv)
Definition: http.c:852
static ULONG WINAPI HttpPriority_AddRef(IInternetPriority *iface)
Definition: http.c:858
static ULONG WINAPI HttpPriority_Release(IInternetPriority *iface)
Definition: http.c:864

Definition at line 890 of file http.c.

Referenced by create_http_protocol().

◆ HttpProtocolUnkVtbl

const IUnknownVtbl HttpProtocolUnkVtbl
static
Initial value:
= {
}
static HRESULT WINAPI HttpProtocolUnk_QueryInterface(IUnknown *iface, REFIID riid, void **ppv)
Definition: http.c:626
static ULONG WINAPI HttpProtocolUnk_AddRef(IUnknown *iface)
Definition: http.c:661
static ULONG WINAPI HttpProtocolUnk_Release(IUnknown *iface)
Definition: http.c:669

Definition at line 686 of file http.c.

Referenced by create_http_protocol().

◆ HttpProtocolVtbl

const IInternetProtocolExVtbl HttpProtocolVtbl
static
Initial value:
= {
}
static ULONG WINAPI HttpProtocol_AddRef(IInternetProtocolEx *iface)
Definition: http.c:699
static ULONG WINAPI HttpProtocol_Release(IInternetProtocolEx *iface)
Definition: http.c:706
static HRESULT WINAPI HttpProtocol_QueryInterface(IInternetProtocolEx *iface, REFIID riid, void **ppv)
Definition: http.c:692
static HRESULT WINAPI HttpProtocol_LockRequest(IInternetProtocolEx *iface, DWORD dwOptions)
Definition: http.c:796
static HRESULT WINAPI HttpProtocol_Abort(IInternetProtocolEx *iface, HRESULT hrReason, DWORD dwOptions)
Definition: http.c:744
static HRESULT WINAPI HttpProtocol_Suspend(IInternetProtocolEx *iface)
Definition: http.c:764
static HRESULT WINAPI HttpProtocol_UnlockRequest(IInternetProtocolEx *iface)
Definition: http.c:805
static HRESULT WINAPI HttpProtocol_Seek(IInternetProtocolEx *iface, LARGE_INTEGER dlibMove, DWORD dwOrigin, ULARGE_INTEGER *plibNewPosition)
Definition: http.c:788
static HRESULT WINAPI HttpProtocol_Continue(IInternetProtocolEx *iface, PROTOCOLDATA *pProtocolData)
Definition: http.c:735
static HRESULT WINAPI HttpProtocol_Start(IInternetProtocolEx *iface, LPCWSTR szUrl, IInternetProtocolSink *pOIProtSink, IInternetBindInfo *pOIBindInfo, DWORD grfPI, HANDLE_PTR dwReserved)
Definition: http.c:713
static HRESULT WINAPI HttpProtocol_Read(IInternetProtocolEx *iface, void *pv, ULONG cb, ULONG *pcbRead)
Definition: http.c:778
static HRESULT WINAPI HttpProtocol_Resume(IInternetProtocolEx *iface)
Definition: http.c:771
static HRESULT WINAPI HttpProtocol_StartEx(IInternetProtocolEx *iface, IUri *pUri, IInternetProtocolSink *pOIProtSink, IInternetBindInfo *pOIBindInfo, DWORD grfPI, HANDLE *dwReserved)
Definition: http.c:814
static HRESULT WINAPI HttpProtocol_Terminate(IInternetProtocolEx *iface, DWORD dwOptions)
Definition: http.c:754

Definition at line 835 of file http.c.

Referenced by create_http_protocol().

◆ WinInetHttpInfoVtbl

const IWinInetHttpInfoVtbl WinInetHttpInfoVtbl
static
Initial value:
= {
}
static HRESULT WINAPI HttpInfo_QueryOption(IWinInetHttpInfo *iface, DWORD dwOption, void *pBuffer, DWORD *pcbBuffer)
Definition: http.c:916
static ULONG WINAPI HttpInfo_Release(IWinInetHttpInfo *iface)
Definition: http.c:910
static HRESULT WINAPI HttpInfo_QueryInterface(IWinInetHttpInfo *iface, REFIID riid, void **ppv)
Definition: http.c:898
static ULONG WINAPI HttpInfo_AddRef(IWinInetHttpInfo *iface)
Definition: http.c:904
static HRESULT WINAPI HttpInfo_QueryInfo(IWinInetHttpInfo *iface, DWORD dwOption, void *pBuffer, DWORD *pcbBuffer, DWORD *pdwFlags, DWORD *pdwReserved)
Definition: http.c:930

Definition at line 945 of file http.c.

Referenced by create_http_protocol().