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/