2017-04-09 12 views
-1

私は彼にバックACK(HTTP1/1 200 OK)を期待しているデバイスからデータを取得します。 ヘッダを受け取った後の私のhttpserverは自動的に400 Bad Request(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サーバーに接続していますか?問題のあるコードはどこにありますか?あなたのログの 'アクセス違反'エラーに気付きましたか?あなたのログはどこから来たのですか? –

+0

デバイスを接続するサーバーを作成します。問題はこの問題に記載されています。私のサーバは、私との通信を停止したデバイスにエラーを返します。コードの別の部分を切り捨てたので、ここでは関係のない違反エラーにアクセスしてください。 idHttpServer.Interceptからのログ –

答えて

5

は、HTTPクライアントがHTTP 1.1リクエストを送信しているが、必要Host要求ヘッダーを送信していません。

クライアントは、すべてのHTTP/1.1リクエストメッセージにHostヘッダフィールドを含まなければならない:RFC 2616 Section 14.23あたり。要求されたURIに、要求されているサービスのインターネットホスト名が含まれていない場合は、Hostヘッダーフィールドに空の値を指定する必要があります。 HTTP/1.1プロキシは、それが転送する要求メッセージに、プロキシによって要求されているサービスを識別する適切なHostヘッダーフィールドが含まれていることを保証しなければならない(MUST)。 すべてのインターネットベースのHTTP/1.1サーバは、ホストヘッダーフィールドがないHTTP/1.1要求メッセージに対して、400(Bad Request)ステータスコードで応答しなければならない。

TIdHTTPServerは、HostヘッダーのないHTTP 1.1要求を受信すると400応答を返します。上記のように、400の応答はHTTP 1.1仕様で必須です。デバイスの製造元に連絡し、不足しているHostヘッダーに関するバグを報告することをお勧めします。おそらく、ファームウェアアップデートをリリースすることができます。一方

、あなたはそれが欠落している場合はダミーHostヘッダを挿入するためにTIdHTTPServer.OnHeadersAvailableイベントを使用することができますあなたのログについては

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イベントハンドラで発生したアクセス違反を示し、アクセスされているnilポインタに渡します。このイベントは、クライアントHostヘッダーが見つからない場合にトリガーされません。したがって、この問題に関係なく、コードには明らかに2番目の問題があります。

+0

私はこれを理解しているので、おそらくデバイスが正しくクエリを構築していないと書いています。問題は、デバイスが私と通信するのを停止するため、エラーを返すかどうかを決定できますか? –

+0

コードの別の部分を切り捨てたので、ここではアクセス違反のエラーとは関係ありません。デバイスがACKを受信しない場合は、リクエストを繰り返してください。だから私はすべて同じデータを取得することはできません。 –

+0

@StoyanToskov私は私の答えを更新しました。ありがとうレミー。 –