summaryrefslogtreecommitdiff
path: root/lib/net
diff options
context:
space:
mode:
authorShugo Maeda <[email protected]>2021-03-16 14:54:32 +0900
committerHiroshi SHIBATA <[email protected]>2021-04-22 14:38:23 +0900
commitd785c5b8b2ed31202045d29f5981afc43b430dff (patch)
tree2a4723dba64235fbcbcfaaae9afaf7f46339c80f /lib/net
parent674760316ce5b68aa182c1b3b25665de250341b3 (diff)
[ruby/net-imap] Set timeout for IDLE responses
Fixes #14 https://github.com/ruby/net-imap/commit/39d39ff9bb
Diffstat (limited to 'lib/net')
-rw-r--r--lib/net/imap.rb20
1 files changed, 17 insertions, 3 deletions
diff --git a/lib/net/imap.rb b/lib/net/imap.rb
index ff9dff41ac..29c2e23e52 100644
--- a/lib/net/imap.rb
+++ b/lib/net/imap.rb
@@ -229,6 +229,9 @@ module Net
# 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
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
# 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
@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
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