1

基于我之前看到的一些 SO question,我正在使用WinHttpRequestInno Setup 内部GET向 Web 服务器发出请求(localhost:8000现在)。下面的最小代码,请求是到内置的 Django 调试服务器(python manage.py runserver)。

procedure InitializeWizard();
var
    WinHttpReq: Variant;
    url: string;
    HTTPREQUEST_SETCREDENTIALS_FOR_SERVER: integer;
begin
    url := 'http://localhost:8000/odbc/test/';
    HTTPREQUEST_SETCREDENTIALS_FOR_SERVER := 0;

    WinHttpReq := CreateOleObject('WinHttp.WinHttpRequest.5.1');
    WinHttpReq.Open('GET', url, false);
    WinHttpReq.SetRequestHeader('Accept','application/json');
    WinHttpReq.SetCredentials('username','password',HTTPREQUEST_SETCREDENTIALS_FOR_SERVER);
    WinHttpReq.Send();
    MsgBox(WinHttpReq.Status, mbInformation, MB_OK);
    MsgBox(WinHttpReq.ResponseText, mbInformation, MB_OK);
end;

这给了我一个 403,未提供身份验证凭据。

相反,Python requests 库中的这段代码可以成功运行。

>> import requests
>> r = requests.get('http://localhost:8000/odbc/test/', auth=('username','password'))
>> r.status_code
200

我是否误解了该WinHttpRequest对象的工作原理?因为 Wireshark 确认Authorization: Basic *hashstring*在 Python 请求的标头中发送了标头,但情况并非WinHttpRequest如此。一个可能的解决方法是自己为WinHttpRequest对象设置标题,但我只是好奇我是否做错了什么。

数据包捕获要点:https ://gist.github.com/anonymous/597468ba76b59dae4a8d7809ee1c6feb

Wireshark 截图:

Inno Setup Wireshark 捕获中的 WinHttpRequest

Python 请求库 Wireshark 捕获

4

1 回答 1

1

我的猜测是,这是WinHttpRequest和您的“Django 调试服务器”之间的不兼容。


仅在服务器用标头质询之后才WinHttpRequest发送标头。AuthenticateWWW-Authenticate

服务器的 403 响应中没有这样的标头。因此,WinHttpRequest不发送Authorization标头。

解决方案是:

  • 使您的服务器返回WWW-Authenticate标头(理想情况下是 401 状态 - 尽管这不是必需的WinHttpRequest)。

  • 通过以下方式显式发送Authenticate标头:

    WinHttpReq.SetRequestHeader('Authorization', 'Basic ???');
    
于 2016-10-19T06:02:04.003 回答