Handle status request responses to trap errors.
authorTilman Sauerbeck <tilman@code-monkey.de>
Fri, 8 Dec 2006 16:49:26 +0000 (17:49 +0100)
committerTilman Sauerbeck <tilman@code-monkey.de>
Fri, 8 Dec 2006 16:49:26 +0000 (17:49 +0100)
We used to ignore the tagged response to the status request, and
evaluated the untagged response only. This way we couldn't see whether
the command was actually completed successfully. This would result
in the IMAP connection staying open if one of the configured mailboxes
didn't exist.

lib/embrace/imap.rb

index cb129a08dbf071ad3f351fcc2d7756b0b29021e9..0c545e32a3ada166341bfe36b0ae52561613bc9c 100644 (file)
@@ -138,15 +138,23 @@ end
                end
 
                def handle_tagged_response(resp, req)
-                       return unless req.is_a?(LoginRequest)
-
-                       case resp.status
-                       when :ok
-                               @state = :logged_in
-
-                               @mboxes.each { |mb| query_status(mb) }
-                       else
-                               raise(LoginError, "cannot login - #{resp.data}")
+                       case req
+                       when LoginRequest
+                               case resp.status
+                               when :ok
+                                       @state = :logged_in
+
+                                       @mboxes.each { |mb| query_status(mb) }
+                               else
+                                       raise(LoginError, "cannot login - #{resp.data}")
+                               end
+                       when StatusRequest
+                               @mboxes.delete(req.mailbox)
+
+                               if @mboxes.empty?
+                                       @status = :done
+                                       logout
+                               end
                        end
                end
 
@@ -161,12 +169,6 @@ end
                        name, count = md.captures.first, md.captures.last.to_i
 
                        MailboxStatusEvent.raise(name, count)
-                       @mboxes.delete(name)
-
-                       if @mboxes.empty?
-                               @status = :done
-                               logout
-                       end
                end
        end
 
@@ -208,6 +210,8 @@ end
        end
 
        class StatusRequest < Request
+               attr_reader :mailbox
+
                def initialize(session, mailbox)
                        super(session)