IWebBrowser2的HTTP响应标头



与这个问题非常相似,我试图在响应标头中获得一个特定的值。它引用了一个使用异步可插拔协议(APP)处理程序的直通解决方案,但由于该解决方案已经过时,因此链接已失效。

也许我处理这个问题不正确。

概述:我正在扩展我用C++(桌面应用程序)编写的OAuth2库,该库适用于谷歌API,现在可以与微软进行谈判。正如此网站上引用的那样(在"登录成功后重定向请求"下),身份验证代码将在响应标头的"位置"字段中返回。使用HTTP调试器,我可以看到发送的值(见下文)。

当试图从IHTMLDocument2获取IHTMLLocation接口时,没有任何属性包含我可以使用HTTP调试器看到的值,并且即使响应标头中不存在"Location"字段,这些调用也会成功地使用各种值(这显然不是必需的)。

这是唯一的问题。所有后续的调用和请求,我都使用WinHTTPAPI,响应头都很容易访问。然而,这个阶段仍然是用户可以在浏览器中正确验证和授权应用程序的地方。我感谢你的时间和帮助。

更新:响应类似于以下内容:

HTTP/1.1 302 Found
Cache-Control: private
Content-Type: text/html; charset=utf-8
Content-Encoding: gzip
Location: urn:ietf:wg:oauth:2.0:oob?code=[VALUE]

在这种情况下,不需要获取响应标头。身份验证代码也作为查询参数传递给重定向url。

实现DWebBrowserEvents2,并在Invoke函数中获取url:

HRESULT __stdcall DWebBrowserEvents2::Invoke(_In_ DISPID dispIdMember,
                                             _In_ REFIID riid,
                                             _In_ LCID lcid,
                                             _In_ WORD flags,
                                             _In_ DISPPARAMS *pDispParams,
                                             _Out_opt_ VARIANT *pVarResult,
                                             _Out_opt_ EXCEPINFO *pExcepInfo,
                                             _Out_opt_ UINT *puArgErr);

时检测

// new document goes ReadyState_Complete
dispIdMember == DISPID_DOCUMENTCOMPLETE  [ 259 ]

url是位于此处的变体:

VARIANT *vurl = pDispParams->rgvarg[0].pvarVal; // <-- not bstrVal

转换为BSTR,然后字符串:

BSTR url = (vurl->vt & VT_BYREF) ? *vurl->pbstrVal : vurl->bstrVal;
std::wstring ws(url, SysStringLen(url));
// url will look similar to the following:
// http://localhost/?code=[...]&session_state=[...]

相关内容

  • 没有找到相关文章

最新更新