Bug #2187: Net::IMAP::ResponseParseError
http://redmine.ruby-lang.org/issues/show/2187

起票者: Masahiro Tomita
ステータス: Open, 優先度: Normal
ruby -v: ruby 1.8.7 (2009-06-12 patchlevel 174) [i686-linux]

とみたです。

RFC 3501 の resp-text-code は次のようになっていて atom だけでも OK なはずなのですが、

resp-text-code  = "ALERT" /
                  "BADCHARSET" [SP "(" astring *(SP astring) ")" ] /
                  capability-data / "PARSE" /
                  "PERMANENTFLAGS" SP "("
                  [flag-perm *(SP flag-perm)] ")" /
                  "READ-ONLY" / "READ-WRITE" / "TRYCREATE" /
                  "UIDNEXT" SP nz-number / "UIDVALIDITY" SP nz-number /
                  "UNSEEN" SP nz-number /
                  atom [SP 1*<any TEXT-CHAR except "]">]

net/imapd.rb の ResponseParser#resp_text_code() は atom の後に SP と TEXT が
必須になってしまっていて、"* OK [CLOSED] Previous mailbox closed." のような応答で
エラーになってしまいます。

/usr/local/ruby-1.8.7/lib/ruby/1.8/net/imap.rb:3124:in `parse_error': unexpected token RBRA (expected SPACE) (Net::IMAP::ResponseParseError)

次のパッチで直ると思います。
# イマイチ綺麗じゃないですけど…

Index: lib/net/imap.rb
===================================================================
--- lib/net/imap.rb	(revision 25262)
+++ lib/net/imap.rb	(working copy)
@@ -2764,7 +2764,10 @@
           match(T_SPACE)
           result = ResponseCode.new(name, number)
         else
-          match(T_SPACE)
+          if match(T_SPACE, T_RBRA).symbol == T_RBRA
+            @lex_state = EXPR_RTEXT
+            return ResponseCode.new(name, nil)
+          end
           @lex_state = EXPR_CTEXT
           token = match(T_TEXT)
           @lex_state = EXPR_BEG


----------------------------------------
http://redmine.ruby-lang.org