From: "NAKAMURA, Hiroshi" Date: 1999-11-12T23:57:02+09:00 Subject: [ruby-list:18558] [Patch] http-access.rb で state != :META まじょです.違う.なひです. > From: SETSURA [mailto:setsura@remus.dti.ne.jp] > Sent: Monday, November 01, 1999 11:44 PM > 同一hostへ連続してrequest_getを送っている時に、0バイトのデータを > get_dataで読み込むと状態遷移がうまくいかず(:DATAのままになってしまう)、 > 次回のrequest_getの後get_responseで例外 state != :META > (HTTPInvalidState)が発生します。 しちゃいますね... get_data内で,実際に読んでみずに(つまりEOFまで待たずに) 「Content-Length: 0」を根拠にしてnilを返してしまっているのが いけないと思います.ここはEOFまで読んでみて,その結果nilを返したい. ところが単純にこのget_data先頭のif文を外しただけだと, read_bodyがsocket#read(0)を読びます(そもそもこれもよくない?). 1.5系やCVSの1.4系だとOKなんだけど,現状の配布版(?)1.4.2だと, おかしなExceptionが上がるbugを踏んでしまいます. # ruby-1.4.2 -r socket -e 'TCPServer.new(0).read(0)' #=> Error 0 (Errno::E000) というわけで,そちらでもちょっと小細工が要ります. http-access-0.0.4へのPatchです. # http-accessも,そろそろ見直しが必要かも... -- NaHi, nakahiro, a.k.a. NAKAMURA, Hiroshi http://www.sarion.com Sarion Systems Research --- http-access.rb.dist Mon Sep 20 12:00:26 1999 +++ http-access.rb Fri Nov 12 23:44:25 1999 @@ -199,5 +199,5 @@ class HTTPAccess def get_data(maxbytes=nil, &block) get_response if @state == :META - return nil if eof? + return nil if @state != :DATA raise HTTPInvalidState, 'state != DATA' unless @state == :DATA data = nil @@ -242,4 +242,6 @@ class HTTPAccess @chunk_length = 0 return data + elsif @content_length == 0 + return nil elsif @content_length if @readbuf.length > 0