lib/net/protocol.rb: preserve backtrace information
BufferedIO#rbuf_fill should preserve backtrace information when raising EOFError. Otherwise, users get confused when EOFError is leaked out from Net::SMTP etc. [ruby-core:78550] [Bug #13018] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@57311 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
d9421e1376
commit
58935eb8bd
@ -181,8 +181,7 @@ module Net # :nodoc:
|
||||
@io.to_io.wait_writable(@read_timeout) or raise Net::ReadTimeout
|
||||
# continue looping
|
||||
when nil
|
||||
# callers do not care about backtrace, so avoid allocating for it
|
||||
raise EOFError, 'end of file reached', []
|
||||
raise EOFError, 'end of file reached'
|
||||
end while true
|
||||
end
|
||||
|
||||
|
@ -157,6 +157,28 @@ module Net
|
||||
end
|
||||
end
|
||||
|
||||
def test_eof_error_backtrace
|
||||
bug13018 = '[ruby-core:78550] [Bug #13018]'
|
||||
servers = Socket.tcp_server_sockets("localhost", 0)
|
||||
begin
|
||||
sock = nil
|
||||
Thread.start do
|
||||
sock = accept(servers)
|
||||
sock.close
|
||||
end
|
||||
smtp = Net::SMTP.new("localhost", servers[0].local_address.ip_port)
|
||||
e = assert_raise(EOFError, bug13018) do
|
||||
smtp.start do
|
||||
end
|
||||
end
|
||||
assert_equal(EOFError, e.class, bug13018)
|
||||
assert(e.backtrace.grep(%r"\bnet/smtp\.rb:").size > 0, bug13018)
|
||||
ensure
|
||||
sock.close if sock
|
||||
servers.each(&:close)
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def accept(servers)
|
||||
|
Loading…
x
Reference in New Issue
Block a user