lib/rack/common_logger.rb in rack-2.2.10 vs lib/rack/common_logger.rb in rack-3.0.0.beta1

- old
+ new

@@ -1,7 +1,12 @@ # frozen_string_literal: true +require_relative 'constants' +require_relative 'utils' +require_relative 'body_proxy' +require_relative 'request' + module Rack # Rack::CommonLogger forwards every request to the given +app+, and # logs a line in the # {Apache common log format}[http://httpd.apache.org/docs/1.3/logs.html#common] # to the configured logger. @@ -33,38 +38,38 @@ # the logging happens after the request body has been fully sent, any # exceptions raised during the sending of the response body will # cause the request not to be logged. def call(env) began_at = Utils.clock_time - status, headers, body = @app.call(env) - headers = Utils::HeaderHash[headers] - body = BodyProxy.new(body) { log(env, status, headers, began_at) } - [status, headers, body] + status, headers, body = response = @app.call(env) + + response[2] = BodyProxy.new(body) { log(env, status, headers, began_at) } + response end private # Log the request to the configured logger. - def log(env, status, header, began_at) - length = extract_content_length(header) + def log(env, status, response_headers, began_at) + request = Rack::Request.new(env) + length = extract_content_length(response_headers) - msg = FORMAT % [ - env['HTTP_X_FORWARDED_FOR'] || env["REMOTE_ADDR"] || "-", - env["REMOTE_USER"] || "-", + msg = sprintf(FORMAT, + request.ip || "-", + request.get_header("REMOTE_USER") || "-", Time.now.strftime("%d/%b/%Y:%H:%M:%S %z"), - env[REQUEST_METHOD], - env[SCRIPT_NAME], - env[PATH_INFO], - env[QUERY_STRING].empty? ? "" : "?#{env[QUERY_STRING]}", - env[SERVER_PROTOCOL], + request.request_method, + request.script_name, + request.path_info, + request.query_string.empty? ? "" : "?#{request.query_string}", + request.get_header(SERVER_PROTOCOL), status.to_s[0..3], length, - Utils.clock_time - began_at ] + Utils.clock_time - began_at) - msg.gsub!(/[^[:print:]\n]/) { |c| "\\x#{c.ord}" } + msg.gsub!(/[^[:print:]\n]/) { |c| sprintf("\\x%x", c.ord) } - logger = @logger || env[RACK_ERRORS] - + logger = @logger || request.get_header(RACK_ERRORS) # Standard library logger doesn't support write but it supports << which actually # calls to write on the log device without formatting if logger.respond_to?(:write) logger.write(msg) else