Delphi&Indy httpServer如何停止发送400个错误请求

Sto*_*kov -1 delphi indy httpserver

我从期望他回来ACK(HTTP1/1 200 OK)的设备获取数据.收到标题后我的httpserver会自动返回400 Bad Request(我在WareShark上看到).也许该设备没有正确构建他的请求.如何停止服务器不会返回错误?所以我将能够继续与设备通信.

谢谢


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.
Run Code Online (Sandbox Code Playgroud)

Rem*_*eau 5

HTTP客户端正在发送HTTP 1.1请求,但未发送所需的Host请求标头.根据RFC 2616第14.23节:

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

TIdHTTPServer如果收到没有Host标头的HTTP 1.1请求,则返回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;
Run Code Online (Sandbox Code Playgroud)

至于您的日志,它显示了OnCommandGet由于访问了nil指针而在事件处理程序中发生的访问冲突.在客户端Host标头丢失的情况下,不会触发该事件.因此,您的代码中显然存在第二个问题,与此问题无关.