【问题标题】:Setting useUnsafeHeaderParsing for C++ WinHttp为 C++ WinHttp 设置 useUnsafeHeaderParsing
【发布时间】:2015-11-29 12:47:20
【问题描述】:

我正在尝试访问嵌入式设备上的网页。 我在 Win32 上使用 WinHttp。 尝试读取响应时出现错误

ERROR_WINHTTP_INVALID_SERVER_RESPONSE 12152 无法解析服务器响应。

但是当我使用 WireShark 捕获时,我可以看到响应即将到来。 所以为了测试我写了一个简单的 C# 程序。 GetResponse 抛出异常

服务器违反了协议。部分=响应头 Detail=CR后面必须跟LF

所以根据下面的解决方案,我将 useUnsafeHeaderParsing 设置为 true。而且效果很好。

HttpWebRequestError: The server committed a protocol violation. Section=ResponseHeader Detail=CR must be followed by LF

由于我不能使用 C#,所以我需要找到一种方法,将使用 Win32 C++ 的 WinHttp 的 useUnsafeHeaderParsing 设置为 true

非常感谢

【问题讨论】:

  • 与网络服务器的供应商交谈,请他们停止违反 HTTP 协议。
  • 问题是它显示在 Chrome IE 上,他们说因为它在浏览器上正确显示,他们声称这是标准的。但显然不是。

标签: c++ c winapi winhttp


【解决方案1】:

从那时起,该选项的名称似乎必须更改:对于当前的 SDK,它是 WINHTTP_OPTION_UNSAFE_HEADER_PARSING。此外,我验证(通过直接检查汇编代码):

  • 选项必须是DWORD-sized
  • 选项的值无关紧要,只要它不为零即可
  • 你只能启用不安全的解析;尝试禁用(通过将选项值设置为零)会导致返回错误

显然,由于这没有记录,它可能会发生变化。

【讨论】:

    【解决方案2】:

    我简要查看了WinHttpSetOptionoption flags 并找到了以下条目:

    WINHTTP_OPTION_UNSAFE_HEADER_BLOCKING 此选项保留供内部使用,不应调用。

    由于该选项看起来像一个开/关开关,我会尝试执行以下操作:

    BOOL bResult;
    BOOL bOption = FALSE;
    
    bResult = WinHttpSetOption(hInternet, 
                               WINHTTP_OPTION_UNSAFE_HEADER_BLOCKING,
                               &bOption,
                               sizeof(bOption));
    if (bResult == FALSE)
    {
        /* handle error with GetLastError() */
    }
    

    嗯,但正如 MSDN 所说,它是为内部使用而保留的,因此该功能将来可能会发生变化(或者过去已经发生了变化)。但值得一试……祝你好运!

    【讨论】:

    • 我正在尝试设置它,但它显示 WINHTTP_OPTION_UNSAFE_HEADER_BLOCKING 未声明的标识符。可能是什么问题?
    • @AFgone 嗯……我不知道。也许您需要更新版本的 Windows SDK?
    • 我有 7, 7.1 8 8.1 当我去 winhttp 我看到它来自 7.0 但在我的包含目录中我找不到 windows sdk 路径。我怎样才能改变它?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-03
    • 2014-05-24
    • 2011-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多