--- /dev/null
+module Aviator
+
+ class Logger < Faraday::Response::Middleware
+ extend Forwardable
+
+ def initialize(app, logger=nil)
+ super(app)
+ @logger = logger || begin
+ require 'logger'
+ ::Logger.new(self.class::LOG_FILE_PATH)
+ end
+ end
+
+
+ def_delegators :@logger, :debug, :info, :warn, :error, :fatal
+
+
+ def call(env)
+ info(env[:method].to_s.upcase) { env[:url].to_s }
+ debug('REQ_HEAD') { dump_headers env[:request_headers] }
+ debug('REQ_BODY') { dump_body env[:body] }
+ super
+ end
+
+
+ def on_complete(env)
+ info('STATUS') { env[:status].to_s }
+ debug('RES_HEAD') { dump_headers env[:response_headers] }
+ debug('RES_BODY') { dump_body env[:body] }
+ end
+
+
+ def self.configure(log_file_path)
+ # Return a subclass with its logfile path set. This
+ # must be done so that different sessions can log to
+ # different paths.
+ Class.new(self) { const_set('LOG_FILE_PATH', log_file_path) }
+ end
+
+
+ private
+
+ def dump_body(body)
+ return if body.nil?
+
+ # :TODO => Make this configurable
+ body.gsub(/["']password["']:["']\w*["']/, '"password":[FILTERED_VALUE]')
+ end
+
+ def dump_headers(headers)
+ headers.map { |k, v| "#{k}: #{v.inspect}" }.join("; ")
+ end
+ end
+
+end