зеркало из https://github.com/github/ruby.git
* 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:
Родитель
2c8dd794e9
Коммит
79fdbe0519
|
@ -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>
|
||||
|
||||
* test/ruby/test_require.rb: new tests for library requiring, to
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
Загрузка…
Ссылка в новой задаче