为C ++ WinHttp设置useUnsafeHeaderParsing

时间:2015-09-03 15:26:13

标签: c++ c winapi winhttp

我试图访问嵌入式设备上的网页。 我在Win32上使用WinHttp。 在尝试阅读响应时,我收到错误

  

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

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

  

服务器提交了协议违规。第= ResponseHeader   细节= CR必须后跟LF

因此,根据以下解决方案,我将useUnsafeHeaderParsing设置为true。它运作良好。

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

由于我无法使用C#,我需要找到一种方法,使用win32 C ++将WinUttp的useUnsafeHeaderParsing设置为true

非常感谢

2 个答案:

答案 0 :(得分:1)

我已经简要地查看了option flagsWinHttpSetOption并找到了以下条目:

  

<强> 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说它保留供内部使用,因此功能可能在将来发生变化(或者过去已经发生过变化)。但值得一试......祝你好运!

答案 1 :(得分:0)

此后看来,选项的名称必须已更改:对于当前的SDK,其名称为WINHTTP_OPTION_UNSAFE_HEADER_PARSING。另外,我通过直接检查汇编代码来验证:

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

很显然,由于未记录,因此可能会发生变化。