Inno Setup中的WinHttpRequest不会使用Authenticate标头

时间:2016-10-18 17:16:53

标签: inno-setup winhttprequest

根据我之前看到的一些问题,我在Inno Setup中使用WinHttpRequest向网络服务器GET发出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请求库中的此代码可以成功运行。

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

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

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

Wireshark截图:

WinHttpRequest in Inno Setup Wireshark capture

Python requests library Wireshark capture

1 个答案:

答案 0 :(得分:1)

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

WinHttpRequest仅在受到Authenticate标头的服务器质询后才会发送WWW-Authenticate标头。

您的服务器的403响应中没有此类标头。因此WinHttpRequest不会发送Authorization标题。

解决方案是:

  • 让您的服务器返回WWW-Authenticate标题(理想情况下是401状态 - 尽管WinHttpRequest不需要这样做。)

  • 通过以下方式明确发送Authenticate标题:

    WinHttpReq.SetRequestHeader('Authorization', 'Basic ???');