1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
|
# frozen_string_literal: true
module HTTP
module Features
# Log requests and responses. Request verb and uri, and Response status are
# logged at `info`, and the headers and bodies of both are logged at
# `debug`. Be sure to specify the logger when enabling the feature:
#
# HTTP.use(logging: {logger: Logger.new(STDOUT)}).get("https://example.com/")
#
class Logging < Feature
attr_reader :logger
def initialize(logger: NullLogger.new)
@logger = logger
end
def wrap_request(request)
logger.info { "> #{request.verb.to_s.upcase} #{request.uri}" }
logger.debug do
headers = request.headers.map { |name, value| "#{name}: #{value}" }.join("\n")
body = request.body.source
headers + "\n\n" + body.to_s
end
request
end
def wrap_response(response)
logger.info { "< #{response.status}" }
logger.debug do
headers = response.headers.map { |name, value| "#{name}: #{value}" }.join("\n")
body = response.body.to_s
headers + "\n\n" + body
end
response
end
class NullLogger
%w[fatal error warn info debug].each do |level|
define_method(level.to_sym) do |*_args|
nil
end
define_method(:"#{level}?") do
true
end
end
end
HTTP::Options.register_feature(:logging, self)
end
end
end
|