Windows 8 覆盖IXMLHTTPRequest2的默认标头

Windows 8 覆盖IXMLHTTPRequest2的默认标头,windows-8,Windows 8,我试图在Windows 8上使用IXMLHTTPRequest2对象发送HTTP请求,我想将传出的Accept编码头自定义为默认值“gzip,deflate”以外的值。当我尝试使用SetRequestHeader方法设置Accept Encoding标头时,方法调用成功,但发送请求时仍然使用默认标头值,而不是我提供的值(通过使用Wireshark捕获HTTP请求进行验证) 示例代码(斜面简化): Wireshark捕获已发出的请求: GET /users/me/id HTTP/1.1 Accep

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

示例代码(斜面简化):

Wireshark捕获已发出的请求:

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

根据,它只是一个追加操作。您得到了gzip接受编码,因此我认为它按预期工作。但是,我没有看到删除默认标题的方法

似乎可以将IXMLHTTPRequest2::SetProperty()与XHR_PROP_NO_DEFAULT_头一起使用来抑制默认头


请参阅:

似乎
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;
标头的值被标记为可选(
\uuuuurpc\uuuu in\uopt\u string
)并且可以为空

因此,如果您真的想设置头的值,使用
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
    header,或者可以删除您自己的标题),则可以完成删除这些标题
  • 您可以更改,但不能删除某些标题(例如,
    User-Agent
    header)
  • 您根本无法更改某些标题(例如,
    Accept Encoding
    header)
当您在
IXMLHTTPRequest2
上调用->
Send
时,他们会在内部无条件地将
Accept Encoding
设置为他们想要使用的任何内容。这意味着您不能添加一些替代编码,如不借助黑客和自定义头


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

我尝试了这个“句柄->设置属性(XHR\u PROP\u NO\u DEFAULT\u HEADERS,1);”但是它没有从头中删除Accept编码:gzip,deflate。
m_pXHR->SetRequestHeader(L"Accept-Encoding", L"");