static HRESULT WINAPI BSCHttpNegotiate_OnResponse(IHttpNegotiate2 *iface, DWORD dwResponseCode, LPCWSTR szResponseHeaders, LPCWSTR szRequestHeaders, LPWSTR *pszAdditionalRequestHeaders) { BindStatusCallback *This = impl_from_IHttpNegotiate2(iface); LPWSTR additional_headers = NULL; IHttpNegotiate *http_negotiate; HRESULT hres = S_OK; TRACE("(%p)->(%d %s %s %p)\n", This, dwResponseCode, debugstr_w(szResponseHeaders), debugstr_w(szRequestHeaders), pszAdditionalRequestHeaders); http_negotiate = get_callback_iface(This, &IID_IHttpNegotiate); if(http_negotiate) { hres = IHttpNegotiate_OnResponse(http_negotiate, dwResponseCode, szResponseHeaders, szRequestHeaders, &additional_headers); IHttpNegotiate_Release(http_negotiate); } if(pszAdditionalRequestHeaders) *pszAdditionalRequestHeaders = additional_headers; else if(additional_headers) CoTaskMemFree(additional_headers); return hres; }
static HRESULT navigate_hlink(DocHost *This, IMoniker *mon, IBindCtx *bindctx, IBindStatusCallback *callback) { IHttpNegotiate *http_negotiate; BindStatusCallback *bsc; PBYTE post_data = NULL; ULONG post_data_len = 0; LPWSTR headers = NULL, url; BINDINFO bindinfo; DWORD bindf = 0; HRESULT hres; TRACE("\n"); hres = IMoniker_GetDisplayName(mon, 0, NULL, &url); if(FAILED(hres)) FIXME("GetDisplayName failed: %08x\n", hres); hres = IBindStatusCallback_QueryInterface(callback, &IID_IHttpNegotiate, (void**)&http_negotiate); if(SUCCEEDED(hres)) { static const WCHAR null_string[] = {0}; IHttpNegotiate_BeginningTransaction(http_negotiate, null_string, null_string, 0, &headers); IHttpNegotiate_Release(http_negotiate); } memset(&bindinfo, 0, sizeof(bindinfo)); bindinfo.cbSize = sizeof(bindinfo); hres = IBindStatusCallback_GetBindInfo(callback, &bindf, &bindinfo); dump_BINDINFO(&bindinfo); if(bindinfo.dwBindVerb == BINDVERB_POST) { post_data_len = bindinfo.cbstgmedData; if(post_data_len) post_data = bindinfo.stgmedData.u.hGlobal; } if(This->doc_navigate) { hres = async_doc_navigate(This, url, headers, post_data, post_data_len, FALSE); }else { bsc = create_callback(This, url, post_data, post_data_len, headers); hres = navigate_bsc(This, bsc, mon); IBindStatusCallback_Release(&bsc->IBindStatusCallback_iface); } CoTaskMemFree(url); CoTaskMemFree(headers); ReleaseBindInfo(&bindinfo); return hres; }
static void HttpProtocol_close_connection(Protocol *prot) { HttpProtocol *This = impl_from_Protocol(prot); if(This->http_negotiate) { IHttpNegotiate_Release(This->http_negotiate); This->http_negotiate = NULL; } heap_free(This->full_header); This->full_header = NULL; }
static void HttpProtocol_close_connection(Protocol *prot) { HttpProtocol *This = ASYNCPROTOCOL_THIS(prot); if(This->http_negotiate) { IHttpNegotiate_Release(This->http_negotiate); This->http_negotiate = 0; } if(This->full_header) { if(This->full_header != wszHeaders) heap_free(This->full_header); This->full_header = 0; } }
static HRESULT WINAPI BSCHttpNegotiate_BeginningTransaction(IHttpNegotiate2 *iface, LPCWSTR szURL, LPCWSTR szHeaders, DWORD dwReserved, LPWSTR *pszAdditionalHeaders) { BindStatusCallback *This = impl_from_IHttpNegotiate2(iface); IHttpNegotiate *http_negotiate; HRESULT hres = S_OK; TRACE("(%p)->(%s %s %d %p)\n", This, debugstr_w(szURL), debugstr_w(szHeaders), dwReserved, pszAdditionalHeaders); *pszAdditionalHeaders = NULL; http_negotiate = get_callback_iface(This, &IID_IHttpNegotiate); if(http_negotiate) { hres = IHttpNegotiate_BeginningTransaction(http_negotiate, szURL, szHeaders, dwReserved, pszAdditionalHeaders); IHttpNegotiate_Release(http_negotiate); } return hres; }
static ULONG WINAPI BindStatusCallback_Release(IBindStatusCallback *iface) { BindStatusCallback *This = STATUSCLB_THIS(iface); LONG ref = InterlockedDecrement(&This->ref); TRACE("(%p) ref = %d\n", This, ref); if(!ref) { if(This->serv_prov) IServiceProvider_Release(This->serv_prov); if(This->http_negotiate) IHttpNegotiate_Release(This->http_negotiate); if(This->http_negotiate2) IHttpNegotiate2_Release(This->http_negotiate2); if(This->authenticate) IAuthenticate_Release(This->authenticate); IBindStatusCallback_Release(This->callback); heap_free(This); } return ref; }
static void test_HlinkCreateExtensionServices(void) { IAuthenticate *authenticate; IHttpNegotiate *http_negotiate; LPWSTR password, username, headers; HWND hwnd; HRESULT hres; static const WCHAR usernameW[] = {'u','s','e','r',0}; static const WCHAR passwordW[] = {'p','a','s','s',0}; static const WCHAR headersW[] = {'h','e','a','d','e','r','s',0}; static const WCHAR headersexW[] = {'h','e','a','d','e','r','s','\r','\n',0}; hres = HlinkCreateExtensionServices(NULL, NULL, NULL, NULL, NULL, &IID_IAuthenticate, (void**)&authenticate); ok(hres == S_OK, "HlinkCreateExtensionServices failed: %08x\n", hres); ok(authenticate != NULL, "HlinkCreateExtensionServices returned NULL\n"); password = username = (void*)0xdeadbeef; hwnd = (void*)0xdeadbeef; hres = IAuthenticate_Authenticate(authenticate, &hwnd, &username, &password); ok(hres == S_OK, "Authenticate failed: %08x\n", hres); ok(!hwnd, "hwnd != NULL\n"); ok(!username, "username != NULL\n"); ok(!password, "password != NULL\n"); hres = IAuthenticate_QueryInterface(authenticate, &IID_IHttpNegotiate, (void**)&http_negotiate); ok(hres == S_OK, "Could not get IHttpNegotiate interface: %08x\n", hres); headers = (void*)0xdeadbeef; hres = IHttpNegotiate_BeginningTransaction(http_negotiate, (void*)0xdeadbeef, (void*)0xdeadbeef, 0, &headers); ok(hres == S_OK, "BeginningTransaction failed: %08x\n", hres); ok(headers == NULL, "headers != NULL\n"); hres = IHttpNegotiate_BeginningTransaction(http_negotiate, (void*)0xdeadbeef, (void*)0xdeadbeef, 0, NULL); ok(hres == E_INVALIDARG, "BeginningTransaction failed: %08x, expected E_INVALIDARG\n", hres); headers = (void*)0xdeadbeef; hres = IHttpNegotiate_OnResponse(http_negotiate, 200, (void*)0xdeadbeef, (void*)0xdeadbeef, &headers); ok(hres == S_OK, "OnResponse failed: %08x\n", hres); ok(headers == NULL, "headers != NULL\n"); IHttpNegotiate_Release(http_negotiate); IAuthenticate_Release(authenticate); hres = HlinkCreateExtensionServices(headersW, (HWND)0xfefefefe, usernameW, passwordW, NULL, &IID_IAuthenticate, (void**)&authenticate); ok(hres == S_OK, "HlinkCreateExtensionServices failed: %08x\n", hres); ok(authenticate != NULL, "HlinkCreateExtensionServices returned NULL\n"); password = username = NULL; hwnd = NULL; hres = IAuthenticate_Authenticate(authenticate, &hwnd, &username, &password); ok(hres == S_OK, "Authenticate failed: %08x\n", hres); ok(hwnd == (HWND)0xfefefefe, "hwnd=%p\n", hwnd); ok(!lstrcmpW(username, usernameW), "unexpected username\n"); ok(!lstrcmpW(password, passwordW), "unexpected password\n"); CoTaskMemFree(username); CoTaskMemFree(password); password = username = (void*)0xdeadbeef; hwnd = (void*)0xdeadbeef; hres = IAuthenticate_Authenticate(authenticate, &hwnd, NULL, &password); ok(hres == E_INVALIDARG, "Authenticate failed: %08x\n", hres); ok(password == (void*)0xdeadbeef, "password = %p\n", password); ok(hwnd == (void*)0xdeadbeef, "hwnd = %p\n", hwnd); hres = IAuthenticate_QueryInterface(authenticate, &IID_IHttpNegotiate, (void**)&http_negotiate); ok(hres == S_OK, "Could not get IHttpNegotiate interface: %08x\n", hres); headers = (void*)0xdeadbeef; hres = IHttpNegotiate_BeginningTransaction(http_negotiate, (void*)0xdeadbeef, (void*)0xdeadbeef, 0, &headers); ok(hres == S_OK, "BeginningTransaction failed: %08x\n", hres); ok(!lstrcmpW(headers, headersexW), "unexpected headers \"%s\"\n", debugstr_w(headers)); CoTaskMemFree(headers); headers = (void*)0xdeadbeef; hres = IHttpNegotiate_OnResponse(http_negotiate, 200, (void*)0xdeadbeef, (void*)0xdeadbeef, &headers); ok(hres == S_OK, "OnResponse failed: %08x\n", hres); ok(headers == NULL, "unexpected headers \"%s\"\n", debugstr_w(headers)); IHttpNegotiate_Release(http_negotiate); IAuthenticate_Release(authenticate); }