[前][次][番号順一覧][スレッド一覧]

ruby-changes:65930

From: Shugo <ko1@a...>
Date: Thu, 22 Apr 2021 14:41:53 +0900 (JST)
Subject: [ruby-changes:65930] d785c5b8b2 (master): [ruby/net-imap] Set timeout for IDLE responses

https://git.ruby-lang.org/ruby.git/commit/?id=d785c5b8b2

From d785c5b8b2ed31202045d29f5981afc43b430dff Mon Sep 17 00:00:00 2001
From: Shugo Maeda <shugo@r...>
Date: Tue, 16 Mar 2021 14:54:32 +0900
Subject: [ruby/net-imap] Set timeout for IDLE responses

Fixes #14

https://github.com/ruby/net-imap/commit/39d39ff9bb
---
 lib/net/imap.rb | 20 +++++++++++++++++---
 1 file changed, 17 insertions(+), 3 deletions(-)

diff --git a/lib/net/imap.rb b/lib/net/imap.rb
index ff9dff4..29c2e23 100644
--- a/lib/net/imap.rb
+++ b/lib/net/imap.rb
@@ -229,6 +229,9 @@ module Net https://github.com/ruby/ruby/blob/trunk/lib/net/imap.rb#L229
     # it raises a Net::OpenTimeout exception. The default value is 30 seconds.
     attr_reader :open_timeout
 
+    # Seconds to wait until an IDLE response is received.
+    attr_reader :idle_response_timeout
+
     # The thread to receive exceptions.
     attr_accessor :client_thread
 
@@ -1056,7 +1059,7 @@ module Net https://github.com/ruby/ruby/blob/trunk/lib/net/imap.rb#L1059
           unless @receiver_thread_terminating
             remove_response_handler(response_handler)
             put_string("DONE#{CRLF}")
-            response = get_tagged_response(tag, "IDLE")
+            response = get_tagged_response(tag, "IDLE", @idle_response_timeout)
           end
         end
       end
@@ -1142,6 +1145,7 @@ module Net https://github.com/ruby/ruby/blob/trunk/lib/net/imap.rb#L1145
     #         If +options[:ssl]+ is a hash, it's passed to
     #         OpenSSL::SSL::SSLContext#set_params as parameters.
     # open_timeout:: Seconds to wait until a connection is opened
+    # idle_response_timeout:: Seconds to wait until an IDLE response is received
     #
     # The most common errors are:
     #
@@ -1171,6 +1175,7 @@ module Net https://github.com/ruby/ruby/blob/trunk/lib/net/imap.rb#L1175
       @tag_prefix = "RUBY"
       @tagno = 0
       @open_timeout = options[:open_timeout] || 30
+      @idle_response_timeout = options[:idle_response_timeout] || 5
       @parser = ResponseParser.new
       @sock = tcp_socket(@host, @port)
       begin
@@ -1294,10 +1299,19 @@ module Net https://github.com/ruby/ruby/blob/trunk/lib/net/imap.rb#L1299
       end
     end
 
-    def get_tagged_response(tag, cmd)
+    def get_tagged_response(tag, cmd, timeout = nil)
+      if timeout
+        deadline = Time.now + timeout
+      end
       until @tagged_responses.key?(tag)
         raise @exception if @exception
-        @tagged_response_arrival.wait
+        if timeout
+          timeout = deadline - Time.now
+          if timeout <= 0
+            return nil
+          end
+        end
+        @tagged_response_arrival.wait(timeout)
       end
       resp = @tagged_responses.delete(tag)
       case resp.name
-- 
cgit v1.1


--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]