* lib/net/imap.rb: do not use Thread#raise. [ruby-dev:34739]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@16512 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
shugo 2008-05-21 17:47:33 +00:00
Родитель 2c8dd794e9
Коммит 79fdbe0519
3 изменённых файлов: 64 добавлений и 7 удалений

Просмотреть файл

@ -1,3 +1,7 @@
Thu May 22 02:46:08 2008 Shugo Maeda <shugo@ruby-lang.org>
* lib/net/imap.rb: do not use Thread#raise. [ruby-dev:34739]
Thu May 22 00:30:06 2008 Yusuke Endoh <mame@tsg.ne.jp> Thu May 22 00:30:06 2008 Yusuke Endoh <mame@tsg.ne.jp>
* test/ruby/test_require.rb: new tests for library requiring, to * test/ruby/test_require.rb: new tests for library requiring, to

Просмотреть файл

@ -936,6 +936,7 @@ module Net
@continuation_request_arrival = new_cond @continuation_request_arrival = new_cond
@logout_command_tag = nil @logout_command_tag = nil
@debug_output_bol = true @debug_output_bol = true
@exception = nil
@greeting = get_response @greeting = get_response
if @greeting.name == "BYE" if @greeting.name == "BYE"
@ -951,14 +952,24 @@ module Net
def receive_responses def receive_responses
while true while true
synchronize do
@exception = nil
end
begin begin
resp = get_response resp = get_response
rescue Exception rescue Exception => e
synchronize do
@sock.close @sock.close
@client_thread.raise($!) @exception = e
end
break
end
unless resp
synchronize do
@exception = EOFError.new("end of file reached")
end
break break
end end
break unless resp
begin begin
synchronize do synchronize do
case resp case resp
@ -976,7 +987,8 @@ module Net
end end
if resp.name == "BYE" && @logout_command_tag.nil? if resp.name == "BYE" && @logout_command_tag.nil?
@sock.close @sock.close
raise ByeResponseError, resp.raw_data @exception = ByeResponseError.new(resp.raw_data)
break
end end
when ContinuationRequest when ContinuationRequest
@continuation_request_arrival.signal @continuation_request_arrival.signal
@ -985,14 +997,23 @@ module Net
handler.call(resp) handler.call(resp)
end end
end end
rescue Exception rescue Exception => e
@client_thread.raise($!) @exception = e
synchronize do
@tagged_response_arrival.broadcast
@continuation_request_arrival.broadcast
end end
end end
end end
synchronize do
@tagged_response_arrival.broadcast
@continuation_request_arrival.broadcast
end
end
def get_tagged_response(tag, cmd) def get_tagged_response(tag, cmd)
until @tagged_responses.key?(tag) until @tagged_responses.key?(tag)
raise @exception if @exception
@tagged_response_arrival.wait @tagged_response_arrival.wait
end end
resp = @tagged_responses.delete(tag) resp = @tagged_responses.delete(tag)
@ -1119,6 +1140,7 @@ module Net
def send_literal(str) def send_literal(str)
put_string("{" + str.length.to_s + "}" + CRLF) put_string("{" + str.length.to_s + "}" + CRLF)
@continuation_request_arrival.wait @continuation_request_arrival.wait
raise @exception if @exception
put_string(str) put_string(str)
end end

Просмотреть файл

@ -81,6 +81,37 @@ class IMAPTest < Test::Unit::TestCase
end end
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 private
def imaps_test def imaps_test