【问题标题】:HTTP response header from IWebBrowser2来自 IWebBrowser2 的 HTTP 响应标头
【发布时间】:2016-02-23 09:57:34
【问题描述】:

question 非常相似,我试图在响应标头中获取特定值。它使用Asynchronous Pluggable Protocol (APP) 处理程序引用pass-through solution,但是由于解决方案已经过时,因此链接已失效。

也许我的处理方法不正确。

概述: 我正在扩展我用 C++(桌面应用程序)编写的 OAuth2 库,它适用于 Google API,现在允许与 Microsoft 协商。正如this site(在'成功登录后重定向请求'下)中所引用的那样,验证码在响应标头的Location 字段中返回。使用 HTTP 调试器,我可以看到发送的值(见下文)。

当尝试从IHTMLDocument2 获取IHTMLLocation 接口时,没有一个属性包含我可以使用 HTTP 调试器看到的值,并且即使“位置”字段不存在,这些调用也会以各种值成功响应头(这显然不是所需要的)。

这是唯一的挂断。所有后续调用和请求,我使用 WinHTTP API,响应标头为 easily accessed。然而,这个阶段仍然是用户可以在浏览器中正确验证和授权应用程序的阶段。感谢您的宝贵时间和帮助。

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

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]

【问题讨论】:

  • 如果有Location: 标头,则应该有301302 重定向响应代码,这些代码通常会自动跟随。新的响应标头不会有 Location 标头。会不会是这个?
  • 是的,我会更新问题。
  • IHTMLDocument2 不公开对 HTTP 标头的访问。 IHTMLLocation 表示当前文档中实际加载的最终 URL,因此它永远不会表示由指向该最终 URL 的 HTTP 重定向提供的任何中间 URL。对于您尝试执行的操作,您可能必须发出自己的 HTTP 请求,例如使用 WinInet/WinHTTP 或任何其他 HTTP 库,然后手动将生成的 HTML 加载到 WebBrowser 实例中(如果需要将其显示到用户。

标签: oauth-2.0 http-headers iwebbrowser2


【解决方案1】:

在这种情况下,不需要获取响应标头。验证码也作为查询参数传递给重定向 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 ]

网址是位于此处的变体:

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=[...]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-10
    相关资源
    最近更新 更多