Tuesday, August 18, 2009

Strange behavior Ruby Net::IMAP

Net::IMAPの挙動が変なの。

GMailのimapアクセスにて。
$ irb1.8
irb(main):001:0> require 'net/imap'
=> true
irb(main):002:0> imap = Net::IMAP.new('imap.gmail.com', 993, true)
=> #<Net::IMAP:0xb7a5eb0c [略]
irb(main):003:0> imap.login('example@example.com', 'example')
=> #<struct Net::IMAP::TaggedResponse tag="RUBY0001", name="OK", [略]

[ここで ウェブインターフェースで「他のセッションをすべてログアウト」を実行する]

irb(main):004:0> imap.capability
ブロックののち segmentation fault.

同様に Ruby 1.9では
$ irb1.9
irb(main):001:0> require 'net/imap'
=> true
irb(main):002:0> imap = Net::IMAP.new('imap.gmail.com', 993, true)
=> #<Net::IMAP:0x9387314 [略]
irb(main):003:0> imap.login('example@example.com', 'example')
=> #<struct Net::IMAP::TaggedResponse tag="RUBY0001", name="OK", [略]

[ここで ウェブインターフェースで「他のセッションをすべてログアウト」を実行する]

irb(main):004:0> imap.capability
EOFError: end of file reached
from /usr/lib/ruby/1.9.0/net/imap.rb:1016:in `get_tagged_response'
from /usr/lib/ruby/1.9.0/net/imap.rb:1073:in `block in send_command'
from /usr/lib/ruby/1.9.0/monitor.rb:190:in `mon_synchronize'
from /usr/lib/ruby/1.9.0/net/imap.rb:1058:in `send_command'
from /usr/lib/ruby/1.9.0/net/imap.rb:316:in `block in capability'
from /usr/lib/ruby/1.9.0/monitor.rb:190:in `mon_synchronize'
from /usr/lib/ruby/1.9.0/net/imap.rb:315:in `capability'
from (irb):4
from /usr/bin/irb1.9:12:in `<main>'
irb(main):005:0> imap.disconnected?
=> false

ということでRuby 1.8ではサーバから一方的に切断されても、それを検出することができません。
1.9 でも #disconnected? は false がかえってしまう。
ここで #disconnect すると Errno::ENOTCONN: Transport endpoint is not connected

うーん。
どうしたものか。Socketのほうかなぁ。
まぁIDLEの実装も1.9.2からぽいのでそっちのほうも試してみなくては。

No comments: