зеркало из 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>
|
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
|
||||||
|
|
Загрузка…
Ссылка в новой задаче