[Ruby] MechanizeでEOFError?
こんにちわ。ばたっちです。
WWW::Mechanizeでサイトを巡回していて、EOFErrorになることがあったので覚書。
エラーの内容は以下のとおり。
/usr/lib/ruby/1.8/net/protocol.rb:133:in `sysread': \ end of file reached (EOFError) from /usr/lib/ruby/1.8/net/protocol.rb:133:in `rbuf_fill' from /usr/lib/ruby/1.8/timeout.rb:56:in `timeout' from /usr/lib/ruby/1.8/timeout.rb:76:in `timeout' from /usr/lib/ruby/1.8/net/protocol.rb:132:in `rbuf_fill' from /usr/lib/ruby/1.8/net/protocol.rb:116:in `readuntil' from /usr/lib/ruby/1.8/net/protocol.rb:126:in `readline' from /usr/lib/ruby/1.8/net/http.rb:2017:in `read_status_line' from /usr/lib/ruby/1.8/net/http.rb:2006:in `read_new' from /usr/lib/ruby/1.8/net/http.rb:1047:in `request' from /usr/lib/ruby/gems/1.8/gems/mechanize-0.6.10/lib/\ mechanize.rb:514:in `fetch_page' from /usr/lib/ruby/gems/1.8/gems/mechanize-0.6.10/lib/\ mechanize.rb:185:in `get' from test.rb:19正確なパターンは分からないのですが、以下のようにJavaScriptファイルの取得前後でエラーになるようでした。
- 「http://~/test1.html」のように最初のページをGETする
- 相対パス指定で次のページをGETする (A)
- 相対パス指定でJavaScriptをGETする
- backメソッドで履歴を戻る
- 相対パス指定で(A)のページなどを再GETする
直接関係あるかは分かりませんが、気になった点は次のとおり。
- サーバがIIS
- Content-Typeが「application/x-javascript」(通常は text/javascript)
原因がはっきりしないので気持ち悪いですが、とりあえずうまく行きました。(^^)v
同じような現象に会った人いるかな?
コメント
同じ現象にぶつかって、keep_alive = falseで解決しました。とても助かりました。
原因はあまり調べていないので、さっぱりわからずです。同じように再現性に問題があって、サーバによってはときどきなるものと、いつもエラーが出るものがありました。
投稿者: 加々美直史 | 2008年04月16日 16:49
同じ現象に会われた方がいたとは。。A^^;
無事解決されたようでよかったです♪
ときどき発生するケースもあるのですね。私が試していたサイトでは、あるパターンで必ず発生していました。
投稿者: ばたっち | 2008年04月16日 18:20
すごい今更ですが、Net::HTTP の仕様だかバグのせいかと。
keep-alive 接続がタイムアウト後にソケットからデータを読もうとすると EOFError が出るようになっているみたいです。
投稿者: 通りすがり | 2011年12月03日 02:23
すごい忘れた頃に~ A^^;
やっぱり、Keep-Alive周りに問題がありそうなんですね。
最新版ではどうなってるのかな。。?
投稿者: ばたっち | 2011年12月05日 11:19