rack-traffic-logger 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2eb0252e73380f08bce1a1fd885b7d1274efb5ea
4
- data.tar.gz: 52c68544ff792ba5a11b98d6eef256f5dedf2bf6
3
+ metadata.gz: f26f03dcdb7e324d22fe2d1eef5c171d2b0a2a7e
4
+ data.tar.gz: 4dc100276db42b05d2d57673ec9a633de4ecef8a
5
5
  SHA512:
6
- metadata.gz: 3d4540743bb8c876d8dda6196b32d548044bfac62f7736704f2aa7cef441749debaced16d1fb62a6988b89e272bb67e542b8f43755dd35d77a13babd925deb31
7
- data.tar.gz: e4486d2c17aff30b74771273df3a5095dce62c1621101dad5549aca5cce7ac8d116a0d47c11395e87c617c874074fe82e73638207a1bd835bcc6986044017d09
6
+ metadata.gz: b03a20d01b1c64ff07d84c450c21e4ecdba97626c0c892cc6c1a331a569c4ab10e64cb3a2e9e47f68c2e408b3c828fb5f01ed0e428670c69a49c1486fa721663
7
+ data.tar.gz: 6281b3c7a221db00a86e1d4eb6178b75fc53bac6e506922a742580cb823922f06dc7ab04f8a3a35593ff757091d05258f08b0150a10d42bb301c3a916606bc8c
data/README.md CHANGED
@@ -1,3 +1,25 @@
1
1
  # Rack::TrafficLogger
2
2
 
3
- TODO: Write a gem description
3
+ This is simple Rack middleware for logging incoming/outgoing HTTP/S traffic.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ gem install rack-traffic-logger
9
+ ```
10
+
11
+ ## Usage
12
+
13
+ ```ruby
14
+ require 'rack/traffic_logger'
15
+ ```
16
+
17
+ Then, in your `config.ru` or wherever you set up your middleware stack:
18
+
19
+ ```ruby
20
+ use Rack::TrafficLogger, 'path/to/file.log', response_bodies: false, colors: true
21
+ ```
22
+
23
+ - If you don't provide a log, everything will go to `STDOUT`.
24
+ - You can supply either the path to a log file, an open file handle, or an instance of `Logger`.
25
+ - See [this file](https://github.com/hx/rack-traffic-logger/blob/develop/lib/rack/traffic_logger.rb) for a list of other options that can affect logging style/filtering.
@@ -6,7 +6,7 @@ module Rack
6
6
  class Echo
7
7
  def call(env)
8
8
  begin
9
- JSON.parse env['rack.input'].tap(&:rewind).read
9
+ [200, {'Content-Type' => 'application/json'}, [JSON.parse(env['rack.input'].tap(&:rewind).read)]]
10
10
  rescue JSON::ParserError => error
11
11
  [
12
12
  500,
@@ -0,0 +1,25 @@
1
+ module Rack
2
+ class TrafficLogger
3
+ class HeaderHash < Hash
4
+
5
+ def initialize(source = nil)
6
+ source.each { |k, v| self[k] = v } if Hash === source
7
+ end
8
+
9
+ def [](key)
10
+ super normalize_key key
11
+ end
12
+
13
+ def []=(key, value)
14
+ super normalize_key(key), value
15
+ end
16
+
17
+ private
18
+
19
+ def normalize_key(key)
20
+ key.to_s.split(/[_ -]/).map { |word| word[0].upcase << word[1..-1].downcase }.join('-')
21
+ end
22
+
23
+ end
24
+ end
25
+ end
@@ -1,5 +1,5 @@
1
1
  module Rack
2
2
  class TrafficLogger
3
- VERSION = '0.1.0'
3
+ VERSION = '0.1.1'
4
4
  end
5
5
  end
@@ -1,5 +1,6 @@
1
1
  require_relative 'traffic_logger/version'
2
2
  require_relative 'traffic_logger/logger'
3
+ require_relative 'traffic_logger/header_hash'
3
4
 
4
5
  require 'forwardable'
5
6
  require 'rack/nulllogger'
@@ -66,11 +67,16 @@ module Rack
66
67
  path: env['PATH_INFO'],
67
68
  qs: (q = env['QUERY_STRING']).empty? ? '' : "?#{q}",
68
69
  http: env['HTTP_VERSION'] || 'HTTP/1.1'
69
- log_headers! env_request_headers(env) if request_headers
70
- input = env['rack.input']
71
- if request_bodies && input
72
- log_body! input.read
73
- input.rewind
70
+ if request_headers || request_bodies
71
+ headers = HeaderHash.new(env_request_headers env)
72
+ log_headers! headers if request_headers
73
+ input = env['rack.input']
74
+ if request_bodies && input
75
+ log_body! input.read,
76
+ type: headers['Content-Type'],
77
+ encoding: headers['Content-Encoding']
78
+ input.rewind
79
+ end
74
80
  end
75
81
  end
76
82
 
@@ -93,11 +99,23 @@ module Rack
93
99
  code: code = response[0],
94
100
  status: Rack::Utils::HTTP_STATUS_CODES[code],
95
101
  color: status_color(code)
96
- log_headers! response[1] if response_headers
97
- log_body! response[2].join if response_bodies
102
+ if response_headers || response_bodies
103
+ headers = HeaderHash.new(response[1])
104
+ log_headers! headers if response_headers
105
+ if response_bodies
106
+ body = response[2]
107
+ body = ::File.open(body.path, 'rb') { |f| f.read } if body.respond_to? :path
108
+ body = body.tap(&:rewind).read if body.respond_to? :read
109
+ body = body.join if body.respond_to? :join
110
+ log_body! body,
111
+ type: headers['Content-Type'],
112
+ encoding: headers['Content-Encoding']
113
+ end
114
+ end
98
115
  end
99
116
 
100
- def log_body!(body)
117
+ def log_body!(body, type: nil, encoding: nil)
118
+ body = "<#BINARY #{body.bytes.length} bytes>" if body =~ /[^[:print:]]/
101
119
  info body
102
120
  end
103
121
 
@@ -111,16 +129,7 @@ module Rack
111
129
  end
112
130
 
113
131
  def env_request_headers(env)
114
- env.select do |k, _|
115
- k =~ /^(CONTENT|HTTP)_(?!VERSION)/
116
- end.map do |(k, v)|
117
- [
118
- k.sub(/^HTTP_/, '').split(/[_ -]/).map do |word|
119
- word[0].upcase << word[1..-1].downcase
120
- end.join('-'),
121
- v
122
- ]
123
- end.to_h
132
+ env.select { |k, _| k =~ /^(CONTENT|HTTP)_(?!VERSION)/ }.map { |(k, v)| [k.sub(/^HTTP_/, ''), v] }.to_h
124
133
  end
125
134
 
126
135
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rack-traffic-logger
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Neil E. Pearson
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-10-09 00:00:00.000000000 Z
11
+ date: 2014-10-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rack
@@ -35,6 +35,7 @@ files:
35
35
  - README.md
36
36
  - lib/rack/traffic_logger.rb
37
37
  - lib/rack/traffic_logger/echo.rb
38
+ - lib/rack/traffic_logger/header_hash.rb
38
39
  - lib/rack/traffic_logger/logger.rb
39
40
  - lib/rack/traffic_logger/version.rb
40
41
  homepage: https://github.com/hx/rack-traffic-logger