我正在尝试调试一个问题,但可以使用其他遭遇类似命运的指针。问题似乎在于Windows XP SP3以及安装了证书的WinHttp库的使用。在这些条件下,WinHttp会抛出一个WindowsError(ERROR_WINHTTP_INVALID_SERVER_RESPONSE),即使Wireshark显示它收到200 / OK响应以及预期的XML数据。 WinHttp库显然正在做一些额外的错误检查,导致它认为响应不对。在Windows 7计算机上运行相同的代码,在Wireshark中生成完全相同的请求和响应,除了WinHttp不会使ERROR_WINHTTP_INVALID_SERVER_RESPONSE错误的响应失效;它似乎认为一切都很好。
我做了一些谷歌搜索,花了更多的时间比我想要改变选项。我的下一个停靠点是设置运行netcat的SSH隧道,以便我可以识别是否有任何标头导致问题。消除过程。
除非有人已经知道答案了吗?
版本
Python 2.7.3 WinHttp 5.1(Windows XP Sp3 IE 8中常用的) Windows XP Professional SP3(自动更新似乎是最新的)
注意的
这也发生在Windows Server 2003
上更新
我可以使用一个简单的脚本来伪造对服务器的连接请求来重现此问题。
脚本
(function() {
var soapXmlReq =
'<SOAP-ENV:Envelope xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ZSI="http://www.zolera.com/schemas/ZSI/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><SOAP-ENV:Header></SOAP-ENV:Header><SOAP-ENV:Body xmlns:ns1="urn:vim25"><ns1:RetrieveServiceContent><ns1:_this type="ServiceInstance">ServiceInstance</ns1:_this></ns1:RetrieveServiceContent></SOAP-ENV:Body></SOAP-ENV:Envelope>',
soapXmlReqHeaders = {
'Content-Type': 'text/xml; charset="utf-8"',
'SOAPAction': 'urn:vim25/5.1',
'User-Agent': 'VMware VI Client/5.0.0',
'Content-Length': soapXmlReq.length,
'Accept': '*/*',
'Host': 'vcenter',
'Connection': 'Keep-Alive'
};
function fakeLogin() {
WScript.StdOut.WriteLine("ActiveXObject('WinHttp.WinHttpRequest.5.1')");
var req = WScript.CreateObject("WinHttp.WinHttpRequest.5.1"),
result, header;
WScript.StdOut.WriteLine("Open('POST', 'https://vcenter/sdk', false)");
req.Open("POST", "https://vcenter/sdk", false);
for (header in soapXmlReqHeaders) {
WScript.StdOut.WriteLine("SetRequestHeader('" + header + ": " + soapXmlReqHeaders[header] + "')");
req.SetRequestHeader(header, soapXmlReqHeaders[header]);
}
//WScript.StdOut.WriteLine("Send('" + soapXmlReq + "')");
WScript.StdOut.WriteLine("Send()");
req.Send(soapXmlReq);
WScript.StdOut.WriteLine("ResponseText = " + req.ResponseText);
}
fakeLogin();
})();
只需使用CScript.exe运行脚本,输出就会出现在stdout上。
我注意到响应数据包大于MTU,因此它们会碎片化。这会与它有什么关系吗?