class Rack::SpyUp
Constants
- VERSION
Attributes
app[R]
colorize[RW]
logger[RW]
Public Class Methods
config(&global_configure)
click to toggle source
# File lib/rack/spyup.rb, line 33 def config(&global_configure) @__config ||= Rack::SpyUp::Configuration.default if block_given? global_configure.call(@__config) end @__config end
new(app, &instance_configure)
click to toggle source
# File lib/rack/spyup.rb, line 7 def initialize(app, &instance_configure) @app = app @colorize = true @logger = self.class.config.logger instance_configure.call(self) if block_given? end
Public Instance Methods
call(env)
click to toggle source
# File lib/rack/spyup.rb, line 16 def call(env) return @app.call(env) if ignore_case?(env) req = Rack::Request.new(env) detected_logger(env).debug format_request_output(req) status_code, headers, body = @app.call(env) res = Rack::Response.new(body, status_code, headers) if res.content_type =~ /json/ json = "" body.each{|part| json << part } detected_logger(env).debug format_response_output(res, json) end return res.finish end
Private Instance Methods
compose_request_headers(req)
click to toggle source
# File lib/rack/spyup.rb, line 80 def compose_request_headers(req) headers = <<-HEADERS.chomp Content-Type: #{req.content_type} Content-Length: #{req.content_length} Remote: #{req.env['REMOTE_ADDR']} HEADERS req.env.each do |key, value| parts = key.scan(/^HTTP_([A-Z_]+)/).flatten.first next if parts.nil? _key = parts.split('_') .map{|part| part.sub(/(?<=^[A-Z])[A-Z]*/) {|m| m.downcase } } .join("-") headers << "\n" << "#{_key}: #{value}" end headers .gsub(/^[-a-zA-Z]+:/m, red('\0')) .gsub(/^/, "\t") end
compose_response_headers(res)
click to toggle source
# File lib/rack/spyup.rb, line 124 def compose_response_headers(res) res.headers.map {|k, v| if v.include? "\n" v = v.gsub(/\n/, "\n\t\t") end "\t#{red(k + ':')} #{v}" }.join("\n") end
cyan(value)
click to toggle source
# File lib/rack/spyup.rb, line 138 def cyan(value) return value unless colorize "\e[36m#{value}\e[0m" end
detected_logger(env)
click to toggle source
Do not cache - run detection by each call
# File lib/rack/spyup.rb, line 50 def detected_logger(env) _logger = logger || env['rack.logger'] || env['rack.error'] || ::Logger.new(STDOUT) unless _logger.respond_to? :debug def _logger.debug(str) _logger.write(str) end end _logger end
format_request_output(req)
click to toggle source
# File lib/rack/spyup.rb, line 60 def format_request_output(req) body = req.body.read req.body.rewind <<-FORMAT % [to_request_line(req), compose_request_headers(req), body, format_cookies(req.cookies)] ** REQUEST SPYED ** Request: \t%s Headers: %s Body: \t%s Cookies: %s FORMAT end
format_response_output(res, json)
click to toggle source
# File lib/rack/spyup.rb, line 106 def format_response_output(res, json) <<-FORMAT % [res.status, compose_response_headers(res), pretty_json(json)] ** RESPONSE SPYED ** Status Code: %d Headers: %s Body: %s FORMAT end
gray(value)
click to toggle source
# File lib/rack/spyup.rb, line 143 def gray(value) return value unless colorize "\e[37m#{value}\e[0m" end
ignore_case?(env)
click to toggle source
# File lib/rack/spyup.rb, line 43 def ignore_case?(env) # TODO more options to omit logging return true if env["PATH_INFO"] =~ /favicon.ico$/ return false end
pretty_json(json)
click to toggle source
# File lib/rack/spyup.rb, line 117 def pretty_json(json) formatted = JSON.pretty_unparse(JSON.parse(json)) formatted = CodeRay.scan(formatted, :json).terminal if colorize formatted.gsub(/^/m, "\t") end
red(key)
click to toggle source
# File lib/rack/spyup.rb, line 133 def red(key) return key unless colorize "\e[31m#{key}\e[0m" end
to_request_line(req)
click to toggle source
# File lib/rack/spyup.rb, line 76 def to_request_line(req) "#{req.request_method} #{req.url}" end