JSDBのhttp取得・おかわり ― 2007年05月07日 13時14分13秒
しつこいなぁ > 自分
いいかげん誰も興味がないだろうが、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() ); }で、最初のリクエストに対する応答を全部読み込み終わった時点でループを脱出する。
まとめ
- JSDBのStreamをhttpで初期化するとHTTPキープアライブアプリケーションとして動作する
- リクエストヘッダをカスタマイズするにはnet://で初期化して、いちいちリクエストをwriteln()してやる必要がある
- 行単位のループ処理をする場合はcanReadプロパティをみるべし
- Stream#read()なんて不精をするとタイムアウト待ちに巻き込まれる可能性があるので注意
コメント
_ mal ― 2007年05月10日 16時41分24秒
_ dara-j ― 2007年05月10日 18時31分03秒
>HTTP/1.0 にしないと read できない、HTTP/1.1 だと行ループは出来るんだけど
これ、自分もハマりました。
そのうちなんかのエントリにまとめておこうと思ってたんですが、どうやらコンソール出力系にサイズ制限があるらしく、1.5.1のソースサイズだとそのまま出力できないようです。
ためしに var source = stream.read(); writeln( source.length ) とかしてみてください。ちゃんと文字列は取得できてるはずです。
>非同期読み込みほしいですな
あれ、JSDB(というかSpiderMonkeyかな)にsleep系の待ち合わせってありましたっけ? WSHで非同期読み込みするときなんかはWScript.Sleep使わないと勝手にスクリプト終了するし。
_ mal ― 2007年05月11日 07時01分54秒
前にも言われてましたがやっぱそれですかね。
> ちゃんと文字列は取得できてるはずです。
取れてはいるようですね。Content-Length の値より多いですが header の分ですな。
> sleep系の待ち合わせってありましたっけ?
JSDB に system.sleep(msec) があります。SM にはなし。
※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。
※なお、送られたコメントはブログの管理者が確認するまで公開されません。
トラックバック
このエントリのトラックバックURL: http://dara-j.asablo.jp/blog/2007/05/07/1490316/tb
※なお、送られたトラックバックはブログの管理者が確認するまで公開されません。
XMLHttpRequest の onreadystatechange 相当のプロパティ、というか非同期読み込みほしいですな。
しかしうちの環境だと net:// 使っても cmd.exe だと http://www.prototypejs.org/javascripts/prototype.js が HTTP/1.0 にしないと read できない、HTTP/1.1 だと行ループは出来るんだけど、 かつどっちも中途半端。なんでだろ~。普段使いの cygwin だと平気なんで気にしてないんですが。