1
0
Fork 0
mirror of https://github.com/puma/puma.git synced 2022-11-09 13:48:40 -05:00

Don't leak info when not in development. Fixes #256

This commit is contained in:
Evan Phoenix 2013-07-01 16:48:17 -07:00
parent 1660c8b7fa
commit a99a3f0bfe
3 changed files with 38 additions and 3 deletions

View file

@ -302,6 +302,10 @@ module Puma
ENV['RACK_ENV'] = env
end
def development?
@options[:environment] == "development"
end
def delete_pidfile
if path = @options[:pidfile]
File.unlink path
@ -512,6 +516,10 @@ module Puma
server.min_threads = @options[:min_threads]
server.max_threads = @options[:max_threads]
unless development?
server.leak_stack_on_error = false
end
@server = server
if str = @options[:control_url]
@ -597,6 +605,10 @@ module Puma
server.max_threads = max_t
server.inherit_binder @binder
unless development?
server.leak_stack_on_error = false
end
Signal.trap "SIGTERM" do
server.stop
end

View file

@ -68,10 +68,12 @@ module Puma
@first_data_timeout = FIRST_DATA_TIMEOUT
@leak_stack_on_error = true
ENV['RACK_ENV'] ||= "development"
end
attr_accessor :binder
attr_accessor :binder, :leak_stack_on_error
forward :add_tcp_listener, :@binder
forward :add_ssl_listener, :@binder
@ -379,7 +381,7 @@ module Puma
return :async
end
rescue => e
rescue StandardError => e
@events.unknown_error self, e, "Rack app"
status, headers, res_body = lowlevel_error(e)
@ -571,7 +573,11 @@ module Puma
# A fallback rack response if +@app+ raises as exception.
#
def lowlevel_error(e)
[500, {}, ["Puma caught this error: #{e}\n#{e.backtrace.join("\n")}"]]
if @leak_stack_on_error
[500, {}, ["Puma caught this error: #{e.message} (#{e.class})\n#{e.backtrace.join("\n")}"]]
else
[500, {}, ["A really lowlevel plumbing error occured. Please contact your local Maytag(tm) repair man.\n"]]
end
end
# Wait for all outstanding requests to finish.

View file

@ -204,4 +204,21 @@ class TestPumaServer < Test::Unit::TestCase
assert_equal "HTTP/1.0 200 OK\r\n\r\n", data
end
def test_doesnt_print_backtrace_in_production
@events = Puma::Events.strings
@server = Puma::Server.new @app, @events
@server.app = proc { |e| raise "don't leak me bro" }
@server.leak_stack_on_error = false
@server.add_tcp_listener @host, @port
@server.run
sock = TCPSocket.new @host, @port
sock << "GET / HTTP/1.0\r\n\r\n"
data = sock.read
assert_not_match(/don't leak me bro/, data)
end
end