mirror of
https://github.com/jnunemaker/httparty
synced 2023-03-27 23:23:07 -04:00
Merge pull request #458 from dccunha/adds_query_to_curl_formatter
Logs 'base_uri' and query at Logger::CurlFormatter
This commit is contained in:
commit
35b8ed33aa
2 changed files with 174 additions and 30 deletions
|
@ -2,46 +2,89 @@ module HTTParty
|
||||||
module Logger
|
module Logger
|
||||||
class CurlFormatter #:nodoc:
|
class CurlFormatter #:nodoc:
|
||||||
TAG_NAME = HTTParty.name
|
TAG_NAME = HTTParty.name
|
||||||
OUT = ">"
|
OUT = '>'.freeze
|
||||||
IN = "<"
|
IN = '<'.freeze
|
||||||
|
|
||||||
attr_accessor :level, :logger, :current_time
|
attr_accessor :level, :logger
|
||||||
|
|
||||||
def initialize(logger, level)
|
def initialize(logger, level)
|
||||||
@logger = logger
|
@logger = logger
|
||||||
@level = level.to_sym
|
@level = level.to_sym
|
||||||
|
@messages = []
|
||||||
end
|
end
|
||||||
|
|
||||||
def format(request, response)
|
def format(request, response)
|
||||||
messages = []
|
@request = request
|
||||||
time = Time.now.strftime("%Y-%m-%d %H:%M:%S %z")
|
@response = response
|
||||||
|
|
||||||
|
log_request
|
||||||
|
log_response
|
||||||
|
|
||||||
|
logger.send level, messages.join("\n")
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
attr_reader :request, :response
|
||||||
|
attr_accessor :messages
|
||||||
|
|
||||||
|
def log_request
|
||||||
|
log_url
|
||||||
|
log_headers
|
||||||
|
log_query
|
||||||
|
log OUT, request.raw_body if request.raw_body
|
||||||
|
log OUT
|
||||||
|
end
|
||||||
|
|
||||||
|
def log_response
|
||||||
|
log IN, "HTTP/#{response.http_version} #{response.code}"
|
||||||
|
log_response_headers
|
||||||
|
log IN, "\n#{response.body}"
|
||||||
|
log IN
|
||||||
|
end
|
||||||
|
|
||||||
|
def log_url
|
||||||
http_method = request.http_method.name.split("::").last.upcase
|
http_method = request.http_method.name.split("::").last.upcase
|
||||||
path = request.path.to_s
|
uri = if request.options[:base_uri]
|
||||||
|
request.options[:base_uri] + request.path.path
|
||||||
messages << print(time, OUT, "#{http_method} #{path}")
|
else
|
||||||
|
request.path.to_s
|
||||||
if request.options[:headers] && request.options[:headers].size > 0
|
|
||||||
request.options[:headers].each do |k, v|
|
|
||||||
messages << print(time, OUT, "#{k}: #{v}")
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
messages << print(time, OUT, request.raw_body)
|
log OUT, "#{http_method} #{uri}"
|
||||||
messages << print(time, OUT, "")
|
end
|
||||||
messages << print(time, IN, "HTTP/#{response.http_version} #{response.code}")
|
|
||||||
|
|
||||||
|
def log_headers
|
||||||
|
return unless request.options[:headers] && request.options[:headers].size > 0
|
||||||
|
|
||||||
|
log OUT, 'Headers: '
|
||||||
|
log_hash request.options[:headers]
|
||||||
|
end
|
||||||
|
|
||||||
|
def log_query
|
||||||
|
return unless request.options[:query]
|
||||||
|
|
||||||
|
log OUT, 'Query: '
|
||||||
|
log_hash request.options[:query]
|
||||||
|
end
|
||||||
|
|
||||||
|
def log_response_headers
|
||||||
headers = response.respond_to?(:headers) ? response.headers : response
|
headers = response.respond_to?(:headers) ? response.headers : response
|
||||||
response.each_header do |response_header|
|
response.each_header do |response_header|
|
||||||
messages << print(time, IN, "#{response_header.capitalize}: #{headers[response_header]}")
|
log IN, "#{response_header.capitalize}: #{headers[response_header]}"
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
messages << print(time, IN, "\n#{response.body}")
|
def log_hash(hash)
|
||||||
|
hash.each { |k, v| log(OUT, "#{k}: #{v}") }
|
||||||
@logger.send @level, messages.join("\n")
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def print(time, direction, line)
|
def log(direction, line = '')
|
||||||
"[#{TAG_NAME}] [#{time}] #{direction} #{line}"
|
messages << "[#{TAG_NAME}] [#{time}] #{direction} #{line}"
|
||||||
|
end
|
||||||
|
|
||||||
|
def time
|
||||||
|
@time ||= Time.now.strftime("%Y-%m-%d %H:%M:%S %z")
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -2,6 +2,107 @@ require File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'spec_hel
|
||||||
|
|
||||||
RSpec.describe HTTParty::Logger::CurlFormatter do
|
RSpec.describe HTTParty::Logger::CurlFormatter do
|
||||||
describe "#format" do
|
describe "#format" do
|
||||||
|
let(:logger) { double('Logger') }
|
||||||
|
let(:response_object) { Net::HTTPOK.new('1.1', 200, 'OK') }
|
||||||
|
let(:parsed_response) { lambda { {"foo" => "bar"} } }
|
||||||
|
|
||||||
|
let(:response) do
|
||||||
|
HTTParty::Response.new(request, response_object, parsed_response)
|
||||||
|
end
|
||||||
|
|
||||||
|
let(:request) do
|
||||||
|
HTTParty::Request.new(Net::HTTP::Get, 'http://foo.bar.com/')
|
||||||
|
end
|
||||||
|
|
||||||
|
subject { described_class.new(logger, :info) }
|
||||||
|
|
||||||
|
before do
|
||||||
|
allow(logger).to receive(:info)
|
||||||
|
allow(request).to receive(:raw_body).and_return('content')
|
||||||
|
allow(response_object).to receive_messages(body: "{foo:'bar'}")
|
||||||
|
response_object['header-key'] = 'header-value'
|
||||||
|
|
||||||
|
subject.format request, response
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when request is logged' do
|
||||||
|
context "and request's option 'base_uri' is not present" do
|
||||||
|
it 'logs url' do
|
||||||
|
expect(logger).to have_received(:info).with(/\[HTTParty\] \[\d{4}-\d\d-\d\d \d\d:\d\d:\d\d\ [+-]\d{4}\] > GET http:\/\/foo.bar.com/)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context "and request's option 'base_uri' is present" do
|
||||||
|
let(:request) do
|
||||||
|
HTTParty::Request.new(Net::HTTP::Get, '/path', base_uri: 'http://foo.bar.com')
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'logs url' do
|
||||||
|
expect(logger).to have_received(:info).with(/\[HTTParty\] \[\d{4}-\d\d-\d\d \d\d:\d\d:\d\d\ [+-]\d{4}\] > GET http:\/\/foo.bar.com\/path/)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'and headers are not present' do
|
||||||
|
it 'not log Headers' do
|
||||||
|
expect(logger).not_to have_received(:info).with(/Headers/)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'and headers are present' do
|
||||||
|
let(:request) do
|
||||||
|
HTTParty::Request.new(Net::HTTP::Get, '/path', base_uri: 'http://foo.bar.com', headers: { key: 'value' })
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'logs Headers' do
|
||||||
|
expect(logger).to have_received(:info).with(/Headers/)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'logs headers keys' do
|
||||||
|
expect(logger).to have_received(:info).with(/key: value/)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'and query is not present' do
|
||||||
|
it 'not logs Query' do
|
||||||
|
expect(logger).not_to have_received(:info).with(/Query/)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'and query is present' do
|
||||||
|
let(:request) do
|
||||||
|
HTTParty::Request.new(Net::HTTP::Get, '/path', query: { key: 'value' })
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'logs Query' do
|
||||||
|
expect(logger).to have_received(:info).with(/Query/)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'logs query params' do
|
||||||
|
expect(logger).to have_received(:info).with(/key: value/)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when request raw_body is present' do
|
||||||
|
it 'not logs request body' do
|
||||||
|
expect(logger).to have_received(:info).with(/content/)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when response is logged' do
|
||||||
|
it 'logs http version and response code' do
|
||||||
|
expect(logger).to have_received(:info).with(/HTTP\/1.1 200/)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'logs headers' do
|
||||||
|
expect(logger).to have_received(:info).with(/Header-key: header-value/)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'logs body' do
|
||||||
|
expect(logger).to have_received(:info).with(/{foo:'bar'}/)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
it "formats a response in a style that resembles a -v curl" do
|
it "formats a response in a style that resembles a -v curl" do
|
||||||
logger_double = double
|
logger_double = double
|
||||||
expect(logger_double).to receive(:info).with(
|
expect(logger_double).to receive(:info).with(
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue