|
16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル
"TNMHttpで自らDisconnect"
付録でついてくるNetManageのTNMHttpコンポは便利ですが、Http 1.0 仕様
なので(Helpには1.1と書いてあるが実際は1.0)サーバがコネクションを
切るまでGetが制御を戻してきません。WinInetもいじってみたものの、
私にはいまいちしっくりきません。
そこで、レスポンスヘッダにContent-Lengthが含まれている場合に取り込んだ
データの長さを判断して、全部来ていたらそこで切ってしまう方法を紹介します。
下記のPacketRecvdをNMHttpコンポのOnPacketRecvdイベントにアタッチします。
レスポンスHeaderにContent-Length行があれば、データがそろった時点でサーバ
がKeepAliveしていても、Getから即リターンします。
Content-Lengthがない場合は、他の方法で長さを確定できる場合を除き切って
もらうまで待つしかありませんが、論理的にここで終わりだと判断できる場合には
そのロジックを入れ込むことも不可能ではないでしょう。
uses PSock, NMHttp
var
FContentLength: integer;
procedure TForm1.PacketRecvd(Sender: TObject);
var
St: TStringList;
i: integer;
Http: TNMHttp;
begin
Http := Sender as TNMHttp;
if Http.Header <> '' then begin
St := TStringList.Create;
try
St.Text := AnsiUpperCase(Http.Header);
for i := 0 to St.Count-1 do begin
if Pos('CONTENT-LENGTH', St[i]) <> 0 then begin
FContentLength := StrtoInt(NthWord(St[i],':', 2));
break;
end;
end;
finally
St.Free;
end;
if (FRecvdContentLength >= 0)
and (Length(Body) >= FRecvdContentLength)
then
Http.Disconnect;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
FContentLength := -1;
NMHttp1.Get('http://www.aaa.co.jp/abcd/efg.htm');
end;
TN(CQJ01721)
- FDELPHI MES(16):玉石混淆みんなで作るSample蔵【見本蓄積】 01/02/13 -
Original document by TN 氏 ID:(CQJ01721)
ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。
Copyright 1996-2002 Delphi Users' Forum
|