JSDBのhttp取得・おかわり
2007-05-07


しつこいなぁ > 自分

いいかげん誰も興味がないだろうが、JSDBのhttp取得をさらに調べた。

Keep-Aliveかい!?

ローカルホストに環境変数を返す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() ); }
で、最初のリクエストに対する応答を全部読み込み終わった時点でループを脱出する。

まとめ

といった感じだろうか。はぁ。
[JavaScript]
[JSDB]

コメント(全3件)
コメントをする


記事を書く
powered by ASAHIネット