2017-04-09 118 views
-1

我从预计他回ACK(HTTP1/1 200 OK)的设备获取数据。 我的HTTP服务器在收到标题后自动返回400错误请求(我在WareShark上看到)。 也许设备没有正确构建他的请求。 如何停止服务器不返回错误?所以我将能够继续与设备沟通。Delphi&Indy httpServer如何停止发送400错误请求

感谢


LOG: 192.168.1.141:57565 Stat Connected. 

HTTP Connect 192.168.1.141 
LOG: 192.168.1.141:57565 Recv 10.4.2017 г. 00:18:43: POST/HTTP/1.1<EOL> 

LOG: 192.168.1.141:57565 Recv 10.4.2017 г. 00:18:43: Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/msword, application/x-shockwave-flash, text/*, */*<EOL>Accept-Language: en-us<EOL>Content-Type: application/x-www-form-urlencoded<EOL>Accept-Encoding: gzip, deflate<EOL>User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.0.3705)<EOL>Content-Length: 579<EOL>Connection: Keep-Alive<EOL><EOL><?xml version="1.0"?><EOL><Metrics SiteId="BG-001" Sitename="office Pazardjik"><EOL><Properties><EOL><MacAddress>00:b0:9d:7f:b7:b2</MacAddress><EOL><IpAddress>0.0.0.0</IpAddress><EOL><Timezone>2</Timezone><EOL><DST>1</DST><EOL><DeviceType>0</DeviceType><EOL><SerialNumber>8370098</SerialNumber><EOL></Properties><EOL><ReportData Interval="1"><EOL><Report Date="2017-04-06"><EOL><Object Id="0" DeviceId="BG-001-01" Devicename="Main Entrance" ObjectType="0" Name="Main Entrance"><EOL><Count StartTime="05:31:00" EndTime="05:32:00" Enters="0" Exits="0" Status="0"/><EOL></Object><EOL></Report><EOL></ReportData><EOL></Metrics><EOL> 

HTTP Header 
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/msword, application/x-shockwave-flash, text/*, */* 
Accept-Language: en-us 
Content-Type: application/x-www-form-urlencoded 
Accept-Encoding: gzip, deflate 
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.0.3705) 
Content-Length: 579 
Connection: Keep-Alive 

LOG: 192.168.1.141:57565 Sent 10.4.2017 г. 00:18:43: HTTP/1.1 400 Bad Request<EOL>Connection: close<EOL>Content-Length: 0<EOL>Date: Sun, 09 Apr 2017 21:18:43 GMT<EOL><EOL> 


LOG: 192.168.1.141:57565 Stat Disconnected. 
LOG: 0.0.0.0:0 Stat Disconnected. 
+1

你的问题很混乱。请[编辑]您的问题,使其更加清晰,供我们理解。我不明白你的HTTP服务器在哪一边。你正在写一个设备连接到的HTTP服务器吗?或者你的代码连接到设备上的HTTP服务器?你有问题的代码在哪里?你有没有注意到你日志中的“Access Violation”错误?你的日志从哪里来的? –

+0

我创建设备连接的服务器。问题描述在问题中。我的服务器向其停止与我通信的设备返回错误。由于我切断了另一部分代码,因此访问冲突错误与此无关。 LOG从idHttpServer.Intercept –

回答

5

的HTTP客户端发送的HTTP 1.1请求,但不能发送所需Host请求报头。每RFC 2616 Section 14.23

客户端必须包括在所有HTTP/1.1请求消息主机报头字段。如果请求的URI不包含所请求服务的Internet主机名,则Host头域必须赋予一个空值。 HTTP/1.1代理必须确保它转发的任何请求消息都包含一个合适的主机头字段,用于标识代理请求的服务。 所有基于Internet的HTTP/1.1服务器都必须响应一个400(错误请求)状态码给任何HTTP/1.1请求消息,该请求消息缺少Host头字段

TIdHTTPServer如果收到HTTP 1.1请求而没有Host标头,则返回400响应。正如您在上面看到的那样,HTTP 1.1规范强制使用400响应。我建议你联系设备制造商,并报告关于缺少Host标题的错误,也许他们可以发布固件更新。

在此期间,您可以使用TIdHTTPServer.OnHeadersAvailable事件插入一个虚拟Host头如果是丢失:

procedure httpServerHeadersAvailable(AContext: TIdContext; const AUri: string; AHeaders: TIdHeaderList; var VContinueProcessing: Boolean); 
begin 
    if AHeaders.Values['Host'] = '' then 
    AHeaders.Values['Host'] = 'myserver'; 
    VContinueProcessing := true; 
end; 

至于你的日志,它显示在您的OnCommandGet事件处理程序中发生的访问冲突,由于到被访问的零指针。在客户端Host标头丢失的情况下,该事件不会被触发。所以你在代码中显然有第二个问题,与这个问题无关。

+0

好的。我明白这一点,所以我写道,也许设备没有正确构建查询。问题是,我可以决定是否返回错误,因为它会阻止设备与我通信 –

+0

访问冲突错误与此处无关,因为我切断了另一部分代码。当设备未收到ACK时,请重复您的请求。所以我无法获得所有的数据,只是一样。 –

+0

@StoyanToskov我更新了我的答案。 –