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

unifying of events logging methods

This commit is contained in:
Vyacheslav Alexeev 2020-05-09 19:03:32 +03:00
parent 607e24fe50
commit 49deca9093
5 changed files with 42 additions and 54 deletions

View file

@ -42,7 +42,7 @@ module Puma
string_block = []
formatted_text = " #{text}:" if text
formatted_error = " #{error.inspect}" if error
string_block << "#{Time.now}#{text}#{error.inspect}"
string_block << "#{Time.now}#{formatted_text}#{formatted_error}"
if env
string_block << "Handling request { #{env[REQUEST_METHOD]} #{env[REQUEST_PATH] || env[PATH_INFO]} } (#{env[HTTP_X_FORWARDED_FOR] || env[REMOTE_ADDR]})"
end

View file

@ -87,28 +87,35 @@ module Puma
formatter.call(str)
end
# An HTTP connection error has occurred.
# +error+ a connection exception, +env+ the request
#
def connection_error(error, env, text="HTTP connection error")
@debug_logger.error_dump(error: error, env: env, text: text)
end
# An HTTP parse error has occurred.
# +server+ is the Server object, +env+ the request, and +error+ a
# +env+ the request, and +error+ a
# parsing exception.
#
def parse_error(server, env, error)
def parse_error(error, env)
@debug_logger.error_dump(error: error, env: env, text: 'HTTP parse error, malformed request', force: true)
end
# An SSL error has occurred.
# +server+ is the Server object, +peeraddr+ peer address, +peercert+
# +peeraddr+ peer address, +peercert+
# any peer certificate (if present), and +error+ an exception object.
#
def ssl_error(server, peeraddr, peercert, error)
def ssl_error(error, peeraddr, peercert)
subject = peercert ? peercert.subject : nil
@debug_logger.error_dump(error: error, text: "SSL error, peer: #{peeraddr}, peer cert: #{subject}", force: true)
end
# An unknown error has occurred.
# +server+ is the Server object, +error+ an exception object,
# +error+ an exception object,
# +kind+ some additional info, and +env+ the request.
#
def unknown_error(server, error, kind="Unknown", env=nil)
def unknown_error(error, env=nil, kind="Unknown")
@debug_logger.error_dump(error: error, env: env, text: kind, force: true)
end

View file

@ -252,7 +252,7 @@ module Puma
c.close
clear_monitor mon
@events.ssl_error @server, addr, cert, e
@events.ssl_error e, addr, cert
# The client doesn't know HTTP well
rescue HttpParserError => e
@ -263,7 +263,7 @@ module Puma
clear_monitor mon
@events.parse_error @server, c.env, e
@events.parse_error e, c.env
rescue StandardError => e
@server.lowlevel_error(e, c.env)

View file

@ -12,7 +12,6 @@ require 'puma/binder'
require 'puma/accept_nonblock'
require 'puma/util'
require 'puma/io_buffer'
require 'puma/debug_logger'
require 'puma/puma_http11'
@ -59,7 +58,6 @@ module Puma
def initialize(app, events=Events.stdio, options={})
@app = app
@events = events
@debug_logger = DebugLogger.stdio
@check, @notify = Puma::Util.pipe
@ -210,15 +208,16 @@ module Puma
client.close
@events.ssl_error self, addr, cert, e
@events.ssl_error e, addr, cert
rescue HttpParserError => e
client.write_error(400)
client.close
@events.parse_error self, client.env, e
@events.parse_error e, client.env
rescue ConnectionError, EOFError => e
@debug_logger.error_dump(error: e, env: client.env)
client.close
@events.connection_error e, client.env
else
if process_now
process_client client, buffer
@ -296,25 +295,20 @@ module Puma
pool << client
end
rescue SystemCallError => e
# TODO: check if we able to use client here
@debug_logger.error_dump(error: e)
rescue SystemCallError
# nothing
rescue Errno::ECONNABORTED
# TODO: check if we able to use client here
@debug_logger.error_dump(error: e, text: 'Client closed the socket even before accept')
# client closed the socket even before accept
begin
io.close
rescue => e
rescue
Thread.current.purge_interrupt_queue if Thread.current.respond_to? :purge_interrupt_queue
# TODO: check if we able to use client here
@debug_logger.error_dump(error: e)
end
end
end
end
rescue Object => e
@events.unknown_error self, e, "Listen loop"
@events.unknown_error e, nil, "Listen loop"
end
end
@ -327,7 +321,7 @@ module Puma
end
graceful_shutdown if @status == :stop || @status == :restart
rescue Exception => e
@debug_logger.error_dump(error: e, force: true, text: 'Exception handling servers')
@events.unknown_error e, nil, "Exception handling servers"
ensure
@check.close unless @check.closed? # Ruby 2.2 issue
@notify.close
@ -404,8 +398,7 @@ module Puma
end
# The client disconnected while we were reading data
rescue ConnectionError => e
@debug_logger.error_dump(error: e, env: client.env, text: 'The client disconnected while we were reading data')
rescue ConnectionError
# Swallow them. The ensure tries to close +client+ down
# SSL handshake error
@ -418,7 +411,7 @@ module Puma
close_socket = true
@events.ssl_error self, addr, cert, e
@events.ssl_error e, addr, cert
# The client doesn't know HTTP well
rescue HttpParserError => e
@ -426,7 +419,7 @@ module Puma
client.write_error(400)
@events.parse_error self, client.env, e
@events.parse_error e, client.env
# Server error
rescue StandardError => e
@ -434,19 +427,17 @@ module Puma
client.write_error(500)
@events.unknown_error self, e, "Read"
@events.unknown_error e, nil, "Read"
ensure
buffer.reset
begin
client.close if close_socket
rescue IOError, SystemCallError => e
rescue IOError, SystemCallError
Thread.current.purge_interrupt_queue if Thread.current.respond_to? :purge_interrupt_queue
@debug_logger.error_dump(error: e, env: client.env)
# Already closed
rescue StandardError => e
@events.unknown_error self, e, "Client"
@events.unknown_error e, nil, "Client"
end
end
end
@ -494,11 +485,10 @@ module Puma
unless env.key?(REMOTE_ADDR)
begin
addr = client.peerip
rescue Errno::ENOTCONN => e
rescue Errno::ENOTCONN
# Client disconnects can result in an inability to get the
# peeraddr from the socket; default to localhost.
addr = LOCALHOST_IP
@debug_logger.error_dump(error: e, text: 'Client disconnects can result in an inability to get the peeraddr from the socket')
end
# Set unix socket addrs to localhost
@ -572,9 +562,8 @@ module Puma
end
fast_write client, "\r\n".freeze
rescue ConnectionError => e
rescue ConnectionError
# noop, if we lost the socket we just won't send the early hints
@debug_logger.error_dump(error: e, env: env)
end
}
end
@ -600,14 +589,12 @@ module Puma
return :async
end
rescue ThreadPool::ForceShutdown => e
@events.unknown_error self, e, "Rack app", env
@events.unknown_error e, env, "Rack app"
@events.log "Detected force shutdown of a thread"
@debug_logger.error_dump(error: e, env: env)
status, headers, res_body = lowlevel_error(e, env, 503)
rescue Exception => e
@events.unknown_error self, e, "Rack app", env
@debug_logger.error_dump(error: e, env: env)
@events.unknown_error e, env, "Rack app"
status, headers, res_body = lowlevel_error(e, env, 500)
end
@ -744,8 +731,7 @@ module Puma
fast_write client, CLOSE_CHUNKED
client.flush
end
rescue SystemCallError, IOError => e
@debug_logger.error_dump(error: e, env: env)
rescue SystemCallError, IOError
raise ConnectionError, "Connection error detected during write"
end
@ -873,8 +859,7 @@ module Puma
client = Client.new io, @binder.env(sock)
@thread_pool << client
end
rescue SystemCallError => e
@debug_logger.error_dump(error: e)
rescue SystemCallError
end
end
end
@ -898,12 +883,10 @@ module Puma
def notify_safely(message)
begin
@notify << message
rescue IOError => e
rescue IOError
# The server, in another thread, is shutting down
Thread.current.purge_interrupt_queue if Thread.current.respond_to? :purge_interrupt_queue
@debug_logger.error_dump(error: e)
rescue RuntimeError => e
@debug_logger.error_dump(error: e)
# Temporary workaround for https://bugs.ruby-lang.org/issues/13239
if e.message.include?('IOError')
Thread.current.purge_interrupt_queue if Thread.current.respond_to? :purge_interrupt_queue
@ -936,15 +919,13 @@ module Puma
while true
begin
n = io.syswrite str
rescue Errno::EAGAIN, Errno::EWOULDBLOCK => e
@debug_logger.error_dump(error: e)
rescue Errno::EAGAIN, Errno::EWOULDBLOCK
if !IO.select(nil, [io], nil, WRITE_TIMEOUT)
raise ConnectionError, "Socket timeout writing data"
end
retry
rescue Errno::EPIPE, SystemCallError, IOError => e
@debug_logger.error_dump(error: e)
rescue Errno::EPIPE, SystemCallError, IOError
raise ConnectionError, "Socket timeout writing data"
end

View file

@ -11,10 +11,10 @@ require "net/http"
class SSLEventsHelper < ::Puma::Events
attr_accessor :addr, :cert, :error
def ssl_error(server, peeraddr, peercert, error)
def ssl_error(error, peeraddr, peercert)
self.error = error
self.addr = peeraddr
self.cert = peercert
self.error = error
end
end