@@ -229,6 +229,9 @@ class IMAP < Protocol
229229    # it raises a Net::OpenTimeout exception. The default value is 30 seconds. 
230230    attr_reader  :open_timeout 
231231
232+     # Seconds to wait until an IDLE response is received. 
233+     attr_reader  :idle_response_timeout 
234+ 
232235    # The thread to receive exceptions. 
233236    attr_accessor  :client_thread 
234237
@@ -1056,7 +1059,7 @@ def idle(timeout = nil, &response_handler)
10561059          unless  @receiver_thread_terminating 
10571060            remove_response_handler ( response_handler ) 
10581061            put_string ( "DONE#{ CRLF }  " ) 
1059-             response  =  get_tagged_response ( tag ,  "IDLE" ) 
1062+             response  =  get_tagged_response ( tag ,  "IDLE" ,   @idle_response_timeout ) 
10601063          end 
10611064        end 
10621065      end 
@@ -1142,6 +1145,7 @@ def self.format_datetime(time)
11421145    #         If options[:ssl] is a hash, it's passed to 
11431146    #         OpenSSL::SSL::SSLContext#set_params as parameters. 
11441147    # open_timeout:: Seconds to wait until a connection is opened 
1148+     # idle_response_timeout:: Seconds to wait until an IDLE response is received 
11451149    # 
11461150    # The most common errors are: 
11471151    # 
@@ -1171,6 +1175,7 @@ def initialize(host, port_or_options = {},
11711175      @tag_prefix  =  "RUBY" 
11721176      @tagno  =  0 
11731177      @open_timeout  =  options [ :open_timeout ]  || 30 
1178+       @idle_response_timeout  =  options [ :idle_response_timeout ]  || 5 
11741179      @parser  =  ResponseParser . new 
11751180      @sock  =  tcp_socket ( @host ,  @port ) 
11761181      begin 
@@ -1294,10 +1299,19 @@ def receive_responses
12941299      end 
12951300    end 
12961301
1297-     def  get_tagged_response ( tag ,  cmd ) 
1302+     def  get_tagged_response ( tag ,  cmd ,  timeout  =  nil ) 
1303+       if  timeout 
1304+         deadline  =  Time . now  + timeout 
1305+       end 
12981306      until  @tagged_responses . key? ( tag ) 
12991307        raise  @exception  if  @exception 
1300-         @tagged_response_arrival . wait 
1308+         if  timeout 
1309+           timeout  =  deadline  - Time . now 
1310+           if  timeout  <= 0 
1311+             return  nil 
1312+           end 
1313+         end 
1314+         @tagged_response_arrival . wait ( timeout ) 
13011315      end 
13021316      resp  =  @tagged_responses . delete ( tag ) 
13031317      case  resp . name 
0 commit comments