覆盖IXMLHTTPRequest2的默认标头

时间:2013-01-11 11:40:03

标签: windows-8

我正在尝试使用IXMLHTTPRequest2对象在Windows 8上发送HTTP请求,并且我想将传出的Accept-Encoding标头自定义为默认值“gzip,deflate”以外的其他标头。当我尝试使用SetRequestHeader方法设置Accept-Encoding标头时,方法调用成功,但仍然使用默认标头值而不是我提供的值发送请求(通过使用Wireshark验证以捕获HTTP请求)。

示例代码(针对严重性进行了简化):

::CoCreateInstance( CLSID_FreeThreadedXMLHTTP60, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS( &m_pXHR ));
m_pXHR->Open( "GET", "http://192.168.0.100/test", m_pXHRCallback.Get(), NULL, NULL, NULL,NULL );
m_pXHR->SetRequestHeader( L"Accept-Encoding", L"gzip" );
m_pXHR->Send( NULL, 0 );

Wireshark捕获的请求:

GET /users/me/id HTTP/1.1
Accept: */*
Host: 192.168.0.100
Accept-Encoding: gzip, deflate
Connection: Keep-Alive

3 个答案:

答案 0 :(得分:1)

根据docs for SetRequestHeader,它只是一个追加操作。您正在获取gzip Accept-Encoding,因此我认为它正在按预期工作。但是,我没有看到删除默认标头的方法。

答案 1 :(得分:0)

您似乎可以使用IXMLHTTPRequest2 :: SetProperty()和XHR_PROP_NO_DEFAULT_HEADERS来禁止默认标头。

请参阅:http://msdn.microsoft.com/en-us/library/windows/desktop/hh831167(v=vs.85).aspx

答案 2 :(得分:0)

似乎IXMLHTTPRequest2 API明显被破坏,因为它没有办法删除标头。或者,也许文档被破坏了,因为它没有提到传递空字符串或NULL会删除标题。

另外,根据IXMLHTTPRequest2::SetRequestHeader声明:

virtual HRESULT STDMETHODCALLTYPE SetRequestHeader(
    /* [ref][string][in] */ __RPC__in_string const WCHAR *pwszHeader,
    /* [unique][string][in] */ __RPC__in_opt_string const WCHAR *pwszValue) = 0;

标题的值被标记为可选(__RPC__in_opt_string)并且可以为NULL。

因此,如果您确实要设置标头的值,那么与IXMLHTTPRequest2一起使用的唯一正确方法就是:

m_pXHR->SetRequestHeader(L"SomeMyHeader", L"");
m_pXHR->SetRequestHeader(L"SomeMyHeader", L"value");

这样您就可以删除或更改一些默认标题:

m_pXHR->SetRequestHeader(L"Accept-Language", L"");

由于没有记录,因此在某些特定版本的Windows上某些时候,这可能适用于您,也可能不适用。如果你试图大量使用IXMLHTTPRequest2,你会得到与我相同的结论:它只是破碎的废话。例如,这不起作用:

m_pXHR->SetRequestHeader(L"Accept-Encoding", L"");

似乎有些实施IXMLHTTPRequest2的家伙在那里放了很多未记载的逻辑:

  • 如果您将其设置为NULL或空字符串(例如,Accept-Language标题,或者您自己的标题可以删除),则可以完成删除某些标题。
  • 您可以更改,但不能删除一些标题(例如,User-Agent标题)。
  • 您根本无法更改某些标头(例如,Accept-Encoding标头)。

当您在Send上致电 - > IXMLHTTPRequest2时,他们会在内部无条件地将Accept-Encoding设置为他们想要使用的内容。这意味着您无法在不诉诸黑客和自定义标头的情况下添加一些替代编码,例如brotli

他们应该开始使用libcurl并公开其API而不是暴露IXMLHTTPRequest2可耻的质量。