diff --git a/ChangeLog b/ChangeLog index cf9ee30654..d20110fa94 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +Thu May 22 02:46:08 2008 Shugo Maeda + + * lib/net/imap.rb: do not use Thread#raise. [ruby-dev:34739] + Thu May 22 00:30:06 2008 Yusuke Endoh * test/ruby/test_require.rb: new tests for library requiring, to diff --git a/lib/net/imap.rb b/lib/net/imap.rb index 016f567b07..ce765b0a34 100644 --- a/lib/net/imap.rb +++ b/lib/net/imap.rb @@ -936,6 +936,7 @@ module Net @continuation_request_arrival = new_cond @logout_command_tag = nil @debug_output_bol = true + @exception = nil @greeting = get_response if @greeting.name == "BYE" @@ -951,14 +952,24 @@ module Net def receive_responses while true + synchronize do + @exception = nil + end begin resp = get_response - rescue Exception - @sock.close - @client_thread.raise($!) + rescue Exception => e + synchronize do + @sock.close + @exception = e + end + break + end + unless resp + synchronize do + @exception = EOFError.new("end of file reached") + end break end - break unless resp begin synchronize do case resp @@ -976,7 +987,8 @@ module Net end if resp.name == "BYE" && @logout_command_tag.nil? @sock.close - raise ByeResponseError, resp.raw_data + @exception = ByeResponseError.new(resp.raw_data) + break end when ContinuationRequest @continuation_request_arrival.signal @@ -985,14 +997,23 @@ module Net handler.call(resp) end end - rescue Exception - @client_thread.raise($!) + rescue Exception => e + @exception = e + synchronize do + @tagged_response_arrival.broadcast + @continuation_request_arrival.broadcast + end end end + synchronize do + @tagged_response_arrival.broadcast + @continuation_request_arrival.broadcast + end end def get_tagged_response(tag, cmd) until @tagged_responses.key?(tag) + raise @exception if @exception @tagged_response_arrival.wait end resp = @tagged_responses.delete(tag) @@ -1119,6 +1140,7 @@ module Net def send_literal(str) put_string("{" + str.length.to_s + "}" + CRLF) @continuation_request_arrival.wait + raise @exception if @exception put_string(str) end diff --git a/test/net/imap/test_imap.rb b/test/net/imap/test_imap.rb index c164875c42..cff09d3cbc 100644 --- a/test/net/imap/test_imap.rb +++ b/test/net/imap/test_imap.rb @@ -81,6 +81,37 @@ class IMAPTest < Test::Unit::TestCase end end + def test_unexpected_eof + server = TCPServer.new(0) + port = server.addr[1] + Thread.start do + begin + sock = server.accept + begin + sock.print("* OK test server\r\n") + sock.gets +# sock.print("* BYE terminating connection\r\n") +# sock.print("RUBY0001 OK LOGOUT completed\r\n") + ensure + sock.close + end + rescue + end + end + begin + begin + imap = Net::IMAP.new("localhost", :port => port) + assert_raise(EOFError) do + imap.logout + end + ensure + imap.disconnect if imap + end + ensure + server.close + end + end + private def imaps_test