お知らせ

電子会議

ライブラリ

パレット

Delphi FAQ検索

Delphi FAQ一覧

サンプル蔵





FDelphi FAQ
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