いいかげん誰も興味がないだろうが、JSDBのhttp取得をさらに調べた。
ローカルホストに環境変数を返すasp設置して試したら、リクエストヘッダに「Connection」の指定がなかった。
ということは、Connection: keep-alive扱いですか。そうですか。
んじゃ、Connection: closeを送りつけたらどうなるかを試そうと思ったが、Streamコンストラクタにhttp://渡した場合はリクエストヘッダのカスタマイズができないぽい。リファレンス確認したら
To simply open a socket to the server and send your own headers, use a = new Stream('net://server.com:80/'); a.writeln('POST /file.cgi/ HTTP/1.1\r\n'). とか書いてあるので以下のようなコードを実行。js>var stream = new Stream("net://localhost:80") js>stream.writeln( "GET / HTTP/1.1\r\nHost: localhost\r\nConnection: close\r\n" ) 52 js>stream.canRead true js>writeln( stream.read() ) HTTP/1.1 200 OK Server: Microsoft-IIS/5.1 Date: Mon, 07 May 2007 04:25:46 GMT X-Powered-By: ASP.NET Connection: close Content-Length: 11519 Content-Type: text/html Set-Cookie: myCounter=1; path=/ Set-Cookie: ASPSESSIONIDASBRTBDS=PJEHLAFDDOAGKOAIHFNJHMNI; path=/ Cache-control: private : (略)返ってくるじゃん!!
以前のエントリ(これやこれ)でハングするだなんだぶつぶついっていたのは、HTTPキープアライブのタイムアウト待ち状態だったということのようだ。実際、IISの設定でHTTPキープアライブのタイムアウトを10秒程度にしたら、待ち時間がそのくらいで制御が帰ってきた。うあ〜、このくらいちゃんと調べろよ > 自分
まあ、このことから、「Stream#read()で一括読み込みしようとしたら、長い長いタイムアウト待ちになる可能性がある」ということになるので、webのリソースを単純に引っ張ってくるにはこの方法は向かないってことになる。
さらに恥ずかしいことに(こればっか)、最初のエントリで行単位読み込みのループがうまくいかなかったのはStream#eofを頼りにしていたからと判明。Stream#canReadはちゃんと意図した動作をするので、
while( stream.canRead ) { writeln( stream.readln() ); }で、最初のリクエストに対する応答を全部読み込み終わった時点でループを脱出する。
セコメントをする