ごとうゆうぞうです。 対応が遅くなって済みません。 In message <87d5q5xicd.fsf / m17n.org>, `Tanaka Akira <akr / m17n.org>' wrote: > NetBSD 2.0 で WEBrick を使って HTTP サーバを動かした場合、クライアント > がリクエストした後データを受け取らないことにより、サーバプロセス全体を > ブロックさせてしまうことができるようです。 > まぁ、よーするに write でブロックしてるわけですが... デフォルトでソケットにO_NONBLOCKを設定するようにしようと思い ます。 この影響なのですが、1.9については[ruby-dev:25101]にあるように、 nonblocking mode で IO#read を使用した場合、EAGAIN に出会っ ても即座には返らず、blocking mode と同様に指定した長さに達 するまで読むようになりました。これは[ruby-dev:17866] での 判断とは異なります。 ということなら問題なさそうです。1.8では、[ruby-dev:17866]の * getsなど行指向入力はEWOULDBLOCKを無視 * read系はEWOULDBLOCKがきたらすでに読み込んだぶんを文字列 で返す。 に従うと、getsについては特に対処は必要なく、readについては希 望する長さのデータが得られるまで繰り返し呼び出すということに なるでしょうか。 WEBrickは (chunkedのリクエストを読む時を除いて) 既にそのよう にコーディングされているので、acecptの直後に呼ばれるフックを 利用することで現状でもこの問題を回避できそうです。 require "webrick" accept_callback = Proc.new{|sock| flag = File::NONBLOCK flag |= sock.fcntl(Fcntl::F_GETFL) if defined?(Fcntl::F_GETFL) sock.fcntl(Fcntl::F_SETFL, flag) } httpd = WEBrick::HTTPServer.new( :DocumentRoot => File::dirname(__FILE__), :Port => 10080, :AcceptCallback => accept_callback ) trap(:INT){ httpd.shutdown } httpd.start -- ごとうゆうぞう