Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Inno setup Inno安装程序中的WinHttpRequest不';无法发送带有身份验证标头的凭据_Inno Setup_Winhttprequest - Fatal编程技术网

Inno setup Inno安装程序中的WinHttpRequest不';无法发送带有身份验证标头的凭据

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

基于我之前看到的一些问题,我正在Inno安装程序中使用
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

解决办法是:

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

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

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

适用于我(针对Apache服务器)-1)用户名/密码中是否有特殊字符?2) 对于Inno设置代码和Python代码,您是否可以尝试使用Wireshark捕获HTTP流量?把它们贴在这里?或者至少两个都有Web服务器日志。添加了wireshark捕获截图。是否有更好的格式发布wireshark捕获?当您停止捕获时,您可以将流量保存到文件中。请注意,
WinHttpRequest
发送两个HTTP请求。第一次,没有身份验证,然后在接收401之后,它发送第二个带有授权的请求。因此,我们需要查看这两个请求,包括来自服务器的响应。我看不到您在哪里看到来自
WinHttpRequest
的两个请求。它们不在您的捕获中,因为您的服务器没有发送
WWW-Authenticate
头。但是,当我在我的(Apache)服务器上测试您的代码时,我可以看到它们。如果我将我的服务器配置为与您的行为相同(无
WWW-Authenticate
header),我将获得与您相同的行为(仅一个请求,无
Authenticate
header)。您能否澄清“响应头不在捕获中”的含义?你是说它们不是由django调试服务器发送的,还是说我从wireshark导出它们失败了?你是说“从wireshark导出它们失败了”。