Inno setup Inno安装程序中的WinHttpRequest不';无法发送带有身份验证标头的凭据
基于我之前看到的一些问题,我正在Inno安装程序中使用Inno setup Inno安装程序中的WinHttpRequest不';无法发送带有身份验证标头的凭据,inno-setup,winhttprequest,Inno Setup,Winhttprequest,基于我之前看到的一些问题,我正在Inno安装程序中使用WinHttpRequest向web服务器发出GET请求(localhost:8000)。在下面的最小代码中,请求发送到内置的Django调试服务器(python manage.py runserver) procedure InitializeWizard(); 变量 WinHttpReq:变体; url:string; 服务器的HTTPREQUEST\u SETCREDENTIALS\u:integer; 开始 网址:='http://l
WinHttpRequest
向web服务器发出GET
请求(localhost:8000
)。在下面的最小代码中,请求发送到内置的Django调试服务器(python manage.py runserver
)
procedure InitializeWizard();
变量
WinHttpReq:变体;
url:string;
服务器的HTTPREQUEST\u SETCREDENTIALS\u:integer;
开始
网址:='http://localhost:8000/odbc/test/';
服务器的HTTPREQUEST\u SETCREDENTIALS\u:=0;
WinHttpRequest:=CreateOleObject('WinHttp.WinHttpRequest.5.1');
WinHttpReq.Open('GET',url,false);
WinHttpReq.SetRequestHeader('Accept','application/json');
WinHttpReq.SetCredentials('username','password',HTTPREQUEST\u SetCredentials\u用于\u服务器);
WinHttpReq.Send();
MsgBox(WinHttpReq.Status,MB信息,MB_OK);
MsgBox(WinHttpReq.ResponseText,mbInformation,MB_OK);
结束;
这给了我一个403,未提供身份验证凭据
相反,Python请求库中的这段代码工作得很成功
导入请求
>>r=请求。获取('http://localhost:8000/odbc/test/,auth=('username','password'))
>>r.状态代码
200
我是否误解了WinHttpRequest
对象的工作原理?因为Wireshark确认了一个授权:Basic*hashstring*
头是在Python请求的头中发送的,而不是在WinHttpRequest
案例中发送的。一个可能的解决方法是自己为WinHttpRequest
对象设置头,但我只是好奇我是否做错了什么
数据包捕获的要点:
Wireshark截图:
我猜这是WinHttpRequest和“Django调试服务器”之间的不兼容
WinHttpRequest
仅在服务器使用WWW-Authenticate
报头质询后发送Authenticate
报头
来自服务器的403响应中没有这样的头。因此,WinHttpRequest
不会发送Authorization
头
解决办法是:
- 让您的服务器返回
头(理想情况下是401状态-尽管WWW-Authenticate
不需要这样做)WinHttpRequest
- 通过以下方式明确发送
标题:Authenticate
WinHttpReq.SetRequestHeader('Authorization','Basic??');
WinHttpRequest
发送两个HTTP请求。第一次,没有身份验证,然后在接收401之后,它发送第二个带有授权的请求。因此,我们需要查看这两个请求,包括来自服务器的响应。我看不到您在哪里看到来自WinHttpRequest
的两个请求。它们不在您的捕获中,因为您的服务器没有发送WWW-Authenticate
头。但是,当我在我的(Apache)服务器上测试您的代码时,我可以看到它们。如果我将我的服务器配置为与您的行为相同(无WWW-Authenticate
header),我将获得与您相同的行为(仅一个请求,无Authenticate
header)。您能否澄清“响应头不在捕获中”的含义?你是说它们不是由django调试服务器发送的,还是说我从wireshark导出它们失败了?你是说“从wireshark导出它们失败了”。