http_logger 0.7.0 → 1.0.0

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
  SHA256:
3
- metadata.gz: e8cd08ba96dbddfa8f11e4bcbebb2cdde1bc99c19a2603eb2253c1f48d173214
4
- data.tar.gz: 0c11b8553de5807f784dd14276017a5b8b7bf6d393e296fb246835bcc6fa0b78
3
+ metadata.gz: e5e25ba1ebb81a4e187ff3a60481249bd5b9d2795c02ff5470bd635f6b0e4f79
4
+ data.tar.gz: 99d08eec0c1be45a9db701d2190c7274dbae4ed998d757c7fa83949975d33dcd
5
5
  SHA512:
6
- metadata.gz: 3b3bcc69fac4c32215adfa5dac3ba2c0312d67b51a7e6890349bb007a3508f1b91b1b8284c1d835684319e39af6045d2945d8703d43347e130abedffd81bf0fb
7
- data.tar.gz: 1a0d722184351705fedb9245f0b74ee2fa315a3df44b956db9561b30bf69b3bce337d179d0f82cb9142239754dd2d2fb363101c1497b85111721079c5b42e1f3
6
+ metadata.gz: c5adf4d6151c4b382ab63010be5468638ac4697eacec5ba2872676dca44e1dc6218b4683db11d734e0e5a46e480d78293f7079307bd4e0a26a9f21a38702dd58
7
+ data.tar.gz: 8437f529565c4e73969dc1ba17f7808b3ccaa03319064057a7254f0d8489cd99e718d832e87e37ca0d2a3052907730bf2a7309bfb2aba3d32be1c65909b9da49
data/Gemfile CHANGED
@@ -1,11 +1,4 @@
1
1
  source "http://rubygems.org"
2
2
 
3
- group :development do
4
- gem "rake"
5
- gem "byebug"
6
- gem "webmock"
7
- gem "rspec"
8
- gem "bump", "~> 0.10.0"
9
- gem "bundler"
10
- end
3
+ gemspec
11
4
 
data/Gemfile.lock CHANGED
@@ -1,40 +1,68 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ http_logger (1.0.0)
5
+
1
6
  GEM
2
7
  remote: http://rubygems.org/
3
8
  specs:
4
- addressable (2.4.0)
9
+ addressable (2.8.0)
10
+ public_suffix (>= 2.0.2, < 5.0)
5
11
  bump (0.10.0)
6
- byebug (11.1.3)
7
12
  crack (0.4.5)
8
13
  rexml
9
- diff-lcs (1.4.4)
14
+ date (3.4.1)
15
+ debug (1.10.0)
16
+ irb (~> 1.10)
17
+ reline (>= 0.3.8)
18
+ diff-lcs (1.6.0)
10
19
  hashdiff (1.0.1)
20
+ io-console (0.8.0)
21
+ irb (1.15.1)
22
+ pp (>= 0.6.0)
23
+ rdoc (>= 4.0.0)
24
+ reline (>= 0.4.2)
25
+ pp (0.6.2)
26
+ prettyprint
27
+ prettyprint (0.2.0)
28
+ psych (5.2.3)
29
+ date
30
+ stringio
31
+ public_suffix (4.0.6)
11
32
  rake (13.0.6)
33
+ rdoc (6.12.0)
34
+ psych (>= 4.0.0)
35
+ reline (0.6.0)
36
+ io-console (~> 0.5)
12
37
  rexml (3.2.5)
13
- rspec (3.10.0)
14
- rspec-core (~> 3.10.0)
15
- rspec-expectations (~> 3.10.0)
16
- rspec-mocks (~> 3.10.0)
17
- rspec-core (3.10.1)
18
- rspec-support (~> 3.10.0)
19
- rspec-expectations (3.10.1)
38
+ rspec (3.13.0)
39
+ rspec-core (~> 3.13.0)
40
+ rspec-expectations (~> 3.13.0)
41
+ rspec-mocks (~> 3.13.0)
42
+ rspec-core (3.13.3)
43
+ rspec-support (~> 3.13.0)
44
+ rspec-expectations (3.13.3)
20
45
  diff-lcs (>= 1.2.0, < 2.0)
21
- rspec-support (~> 3.10.0)
22
- rspec-mocks (3.10.2)
46
+ rspec-support (~> 3.13.0)
47
+ rspec-mocks (3.13.2)
23
48
  diff-lcs (>= 1.2.0, < 2.0)
24
- rspec-support (~> 3.10.0)
25
- rspec-support (3.10.3)
26
- webmock (3.13.0)
27
- addressable (>= 2.3.6)
49
+ rspec-support (~> 3.13.0)
50
+ rspec-support (3.13.2)
51
+ stringio (3.1.4)
52
+ webmock (3.14.0)
53
+ addressable (>= 2.8.0)
28
54
  crack (>= 0.3.2)
29
55
  hashdiff (>= 0.4.0, < 2.0.0)
30
56
 
31
57
  PLATFORMS
58
+ arm64-darwin-23
32
59
  x86_64-darwin-19
33
60
 
34
61
  DEPENDENCIES
35
- bump (~> 0.10.0)
62
+ bump
36
63
  bundler
37
- byebug
64
+ debug
65
+ http_logger!
38
66
  rake
39
67
  rspec
40
68
  webmock
data/Readme.md CHANGED
@@ -20,14 +20,31 @@ gem install http_logger
20
20
  ``` ruby
21
21
  require 'http_logger'
22
22
 
23
- HttpLogger.logger = Logger.new(...) # defaults to Rails.logger if Rails is defined
24
- HttpLogger.colorize = true # Default: true
25
- HttpLogger.ignore = [/newrelic\.com/]
26
- HttpLogger.log_headers = false # Default: false
27
- HttpLogger.log_request_body = false # Default: true
28
- HttpLogger.log_response_body = false # Default: true
29
- HttpLogger.level = :info # Desired log level as a symbol. Default: :debug
30
- HttpLogger.collapse_body_limit # Change default truncate limit. Default: 5000
23
+ HttpLogger.configure do |c|
24
+ # defaults to Rails.logger if Rails is defined
25
+ c.logger = Logger.new(LOGFILE)
26
+
27
+ # Default: true
28
+ c.colorize = true
29
+
30
+ # Ignore patterns (e.g., URLs to ignore)
31
+ c.ignore = [/newrelic\.com/]
32
+
33
+ # Default: false
34
+ c.log_headers = false
35
+
36
+ # Default: true
37
+ c.log_request_body = false
38
+
39
+ # Default: true
40
+ c.log_response_body = false
41
+
42
+ # Desired log level as a symbol. Default: :debug
43
+ c.level = :info
44
+
45
+ # Change default truncate limit. Default: 5000
46
+ c.collapse_body_limit = 5000
47
+ end
31
48
  ```
32
49
 
33
50
  ## Alternative
data/http_logger.gemspec CHANGED
@@ -25,7 +25,6 @@ Gem::Specification.new do |s|
25
25
  "LICENSE.txt",
26
26
  "Rakefile",
27
27
  "Readme.md",
28
- "VERSION",
29
28
  "http_logger.gemspec",
30
29
  "lib/http_logger.rb",
31
30
  "screenshots/hoptoad.png",
@@ -39,28 +38,11 @@ Gem::Specification.new do |s|
39
38
  s.rubygems_version = "2.7.8".freeze
40
39
  s.summary = "Log your http api calls just like SQL queries".freeze
41
40
 
42
- if s.respond_to? :specification_version then
43
- s.specification_version = 4
44
-
45
- if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
46
- s.add_development_dependency(%q<byebug>.freeze, [">= 0"])
47
- s.add_development_dependency(%q<webmock>.freeze, [">= 0"])
48
- s.add_development_dependency(%q<rspec>.freeze, [">= 0"])
49
- s.add_development_dependency(%q<bundler>.freeze, [">= 0"])
50
- s.add_development_dependency(%q<jeweler>.freeze, [">= 0"])
51
- else
52
- s.add_dependency(%q<byebug>.freeze, [">= 0"])
53
- s.add_dependency(%q<webmock>.freeze, [">= 0"])
54
- s.add_dependency(%q<rspec>.freeze, [">= 0"])
55
- s.add_dependency(%q<bundler>.freeze, [">= 0"])
56
- s.add_dependency(%q<jeweler>.freeze, [">= 0"])
57
- end
58
- else
59
- s.add_dependency(%q<byebug>.freeze, [">= 0"])
60
- s.add_dependency(%q<webmock>.freeze, [">= 0"])
61
- s.add_dependency(%q<rspec>.freeze, [">= 0"])
62
- s.add_dependency(%q<bundler>.freeze, [">= 0"])
63
- s.add_dependency(%q<jeweler>.freeze, [">= 0"])
64
- end
41
+ s.add_development_dependency(%q<debug>.freeze, [">= 0"])
42
+ s.add_development_dependency(%q<webmock>.freeze, [">= 0"])
43
+ s.add_development_dependency(%q<rspec>.freeze, [">= 0"])
44
+ s.add_development_dependency(%q<bundler>.freeze, [">= 0"])
45
+ s.add_development_dependency(%q<bump>.freeze, [">= 0"])
46
+ s.add_development_dependency(%q<rake>.freeze, [">= 0"])
65
47
  end
66
48
 
data/lib/http_logger.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  require 'net/http'
2
2
  require 'uri'
3
3
  require 'set'
4
+ require 'http_logger/configuration'
4
5
 
5
6
  # Usage:
6
7
  #
@@ -8,8 +9,8 @@ require 'set'
8
9
  #
9
10
  # == Setup logger
10
11
  #
11
- # HttpLogger.logger = Logger.new('/tmp/all.log')
12
- # HttpLogger.log_headers = true
12
+ # HttpLogger.configuration.logger = Logger.new('/tmp/all.log')
13
+ # HttpLogger.configuration.log_headers = true
13
14
  #
14
15
  # == Do request
15
16
  #
@@ -24,24 +25,14 @@ require 'set'
24
25
  class HttpLogger
25
26
  AUTHORIZATION_HEADER = 'Authorization'
26
27
 
27
- class << self
28
- attr_accessor :collapse_body_limit
29
- attr_accessor :log_headers
30
- attr_accessor :log_request_body
31
- attr_accessor :log_response_body
32
- attr_accessor :logger
33
- attr_accessor :colorize
34
- attr_accessor :ignore
35
- attr_accessor :level
36
- end
37
-
38
- self.log_headers = false
39
- self.log_request_body = true
40
- self.log_response_body = true
41
- self.colorize = true
42
- self.collapse_body_limit = 5000
43
- self.ignore = []
44
- self.level = :debug
28
+ def self.configuration
29
+ @configuration ||= Configuration.new
30
+ end
31
+
32
+ def self.configure(&block)
33
+ block.call(configuration)
34
+ end
35
+
45
36
 
46
37
  def self.perform(*args, &block)
47
38
  instance.perform(*args, &block)
@@ -51,10 +42,6 @@ class HttpLogger
51
42
  @instance ||= HttpLogger.new
52
43
  end
53
44
 
54
- def self.deprecate_config(option)
55
- warn "Net::HTTP.#{option} is deprecated. Use HttpLogger.#{option} instead."
56
- end
57
-
58
45
  def perform(http, request, request_body)
59
46
  start_time = Time.now
60
47
  response = yield
@@ -66,13 +53,21 @@ class HttpLogger
66
53
  if defined?(response) && response
67
54
  log_response_code(response)
68
55
  log_response_headers(response)
69
- log_response_body(response.body)
56
+ log_response_body(response.body, binary_response?(response))
70
57
  end
71
58
  end
72
59
  end
73
60
 
74
61
  protected
75
62
 
63
+ def binary_response?(response)
64
+ content_type = response['Content-Type']
65
+ return false if content_type.nil?
66
+
67
+ !content_type.start_with?('text/', 'application/json', 'application/xml', 'application/javascript', 'application/x-www-form-urlencoded', 'application/xhtml+xml', 'application/rss+xml', 'application/atom+xml', 'application/svg+xml', 'application/yaml')
68
+
69
+ end
70
+
76
71
  def log_request_url(http, request, start_time)
77
72
  ofset = Time.now - start_time
78
73
  log("HTTP #{request.method} (%0.2fms)" % (ofset * 1000), request_url(http, request))
@@ -83,7 +78,7 @@ class HttpLogger
83
78
  end
84
79
 
85
80
  def log_request_headers(request)
86
- if self.class.log_headers
81
+ if configuration.log_headers
87
82
  request.each_capitalized do |k,v|
88
83
  log_header(:request, k, v)
89
84
  end
@@ -98,7 +93,7 @@ class HttpLogger
98
93
  HTTP_METHODS_WITH_BODY = Set.new(%w(POST PUT GET PATCH))
99
94
 
100
95
  def log_request_body(request)
101
- if self.class.log_request_body
96
+ if configuration.log_request_body
102
97
  if HTTP_METHODS_WITH_BODY.include?(request.method)
103
98
  if (body = request.body) && !body.empty?
104
99
  log("Request body", truncate_body(body))
@@ -112,33 +107,34 @@ class HttpLogger
112
107
  end
113
108
 
114
109
  def log_response_headers(response)
115
- if HttpLogger.log_headers
110
+ if configuration.log_headers
116
111
  response.each_capitalized do |k,v|
117
112
  log_header(:response, k, v)
118
113
  end
119
114
  end
120
115
  end
121
116
 
122
- def log_response_body(body)
123
- if HttpLogger.log_response_body
117
+ def log_response_body(body, binary)
118
+ if configuration.log_response_body
124
119
  if body.is_a?(Net::ReadAdapter)
125
120
  log("Response body", "<impossible to log>")
126
121
  else
127
122
  if body && !body.empty?
128
- log("Response body", truncate_body(body))
123
+ log(
124
+ "Response body",
125
+ binary ? "<binary #{body.length} bytes>" : truncate_body(body),)
129
126
  end
130
127
  end
131
128
  end
132
129
  end
133
130
 
134
131
  def require_logging?(http, request)
135
-
136
132
  self.logger && !ignored?(http, request) && (http.started? || webmock?(http, request))
137
133
  end
138
134
 
139
135
  def ignored?(http, request)
140
136
  url = request_url(http, request)
141
- HttpLogger.ignore.any? do |pattern|
137
+ configuration.ignore.any? do |pattern|
142
138
  url =~ pattern
143
139
  end
144
140
  end
@@ -179,11 +175,11 @@ class HttpLogger
179
175
  end
180
176
 
181
177
  def log(message, dump)
182
- self.logger.send(self.class.level, format_log_entry(message, dump))
178
+ self.logger.send(configuration.level, format_log_entry(message, dump))
183
179
  end
184
180
 
185
181
  def format_log_entry(message, dump = nil)
186
- if self.class.colorize
182
+ if configuration.colorize
187
183
  message_color, dump_color = "4;32;1", "0;1"
188
184
  log_entry = " \e[#{message_color}m#{message}\e[0m "
189
185
  log_entry << "\e[#{dump_color}m%#{String === dump ? 's' : 'p'}\e[0m" % dump if dump
@@ -194,16 +190,19 @@ class HttpLogger
194
190
  end
195
191
 
196
192
  def logger
197
- self.class.logger
193
+ configuration.logger
198
194
  end
199
195
 
200
196
  def collapse_body_limit
201
- self.class.collapse_body_limit
197
+ configuration.collapse_body_limit
198
+ end
199
+
200
+ def configuration
201
+ self.class.configuration
202
202
  end
203
203
  end
204
204
 
205
205
  block = lambda do |a|
206
- # raise instance_methods.inspect
207
206
  alias request_without_net_http_logger request
208
207
  def request(request, body = nil, &block)
209
208
  HttpLogger.perform(self, request, body) do
@@ -215,7 +214,6 @@ end
215
214
 
216
215
  if defined?(::WebMock)
217
216
  klass = WebMock::HttpLibAdapters::NetHttpAdapter.instance_variable_get("@webMockNetHTTP")
218
- # raise klass.instance_methods.inspect
219
217
  klass.class_eval(&block)
220
218
  end
221
219
 
@@ -226,7 +224,9 @@ if defined?(Rails)
226
224
  if defined?(ActiveSupport) && ActiveSupport.respond_to?(:on_load)
227
225
  # Rails3
228
226
  ActiveSupport.on_load(:after_initialize) do
229
- HttpLogger.logger = Rails.logger unless HttpLogger.logger
227
+ unless HttpLogger.configuration.logger
228
+ HttpLogger.configuration.logger = Rails.logger
229
+ end
230
230
  end
231
231
  end
232
232
  end
@@ -8,6 +8,7 @@ describe HttpLogger do
8
8
  # flush log
9
9
  f = File.open(LOGFILE, "w")
10
10
  f.close
11
+
11
12
  stub_request(:any, url).to_return(
12
13
  body: response_body,
13
14
  headers: {"X-Http-logger" => true, **response_headers},
@@ -48,7 +49,7 @@ describe HttpLogger do
48
49
  context "when headers logging is on" do
49
50
 
50
51
  before(:each) do
51
- HttpLogger.log_headers = true
52
+ HttpLogger.configuration.log_headers = true
52
53
  end
53
54
 
54
55
  it { should include("HTTP response header") }
@@ -62,11 +63,6 @@ describe HttpLogger do
62
63
  end
63
64
  it { should include("Authorization: <filtered>") }
64
65
  end
65
-
66
- after(:each) do
67
- HttpLogger.log_headers = false
68
- end
69
-
70
66
  end
71
67
 
72
68
  describe "post request" do
@@ -116,7 +112,7 @@ describe HttpLogger do
116
112
  context "when request body logging is off" do
117
113
 
118
114
  before(:each) do
119
- HttpLogger.log_request_body = false
115
+ HttpLogger.configuration.log_request_body = false
120
116
  end
121
117
 
122
118
  let(:request) do
@@ -125,9 +121,6 @@ describe HttpLogger do
125
121
 
126
122
  it { should_not include("Request body") }
127
123
 
128
- after(:each) do
129
- HttpLogger.log_request_body = true
130
- end
131
124
  end
132
125
 
133
126
  context "with long response body" do
@@ -147,7 +140,7 @@ describe HttpLogger do
147
140
  context "when response body logging is off" do
148
141
 
149
142
  before(:each) do
150
- HttpLogger.log_response_body = false
143
+ HttpLogger.configuration.log_response_body = false
151
144
  end
152
145
 
153
146
  let(:response_body) { long_body }
@@ -156,10 +149,6 @@ describe HttpLogger do
156
149
  end
157
150
 
158
151
  it { should_not include("Response body") }
159
-
160
- after(:each) do
161
- HttpLogger.log_response_body = true
162
- end
163
152
  end
164
153
 
165
154
  context "ignore option is set" do
@@ -169,14 +158,10 @@ describe HttpLogger do
169
158
  end
170
159
 
171
160
  before(:each) do
172
- HttpLogger.ignore = [/rpm\.newrelic\.com/]
161
+ HttpLogger.configuration.ignore = [/rpm\.newrelic\.com/]
173
162
  end
174
163
 
175
164
  it { should be_empty}
176
-
177
- after(:each) do
178
- HttpLogger.ignore = []
179
- end
180
165
  end
181
166
 
182
167
  context "when level is set" do
@@ -187,13 +172,30 @@ describe HttpLogger do
187
172
  end
188
173
 
189
174
  before(:each) do
190
- HttpLogger.level = :info
175
+ HttpLogger.configuration.level = :info
191
176
  end
192
177
 
193
178
  it { should_not be_empty }
179
+ end
180
+
181
+ context "when binary response" do
182
+ let(:response_headers) do
183
+ {
184
+ 'Content-Type' => 'image/webp'
185
+ }
186
+ end
187
+ let(:url) do
188
+ "http://example.com/image.webp"
189
+ end
194
190
 
195
- after(:each) do
196
- HttpLogger.level = :debug
191
+ let(:response_body) do
192
+ File.read("#{File.dirname(__FILE__)}/image.webp")
197
193
  end
194
+
195
+ it { should include("<binary 41887 bytes>") }
196
+ end
197
+
198
+ after(:each) do
199
+ HttpLogger.configuration.reset
198
200
  end
199
201
  end
data/spec/spec_helper.rb CHANGED
@@ -15,5 +15,5 @@ LOGFILE = 'http.log'
15
15
  RSpec.configure do |config|
16
16
  config.expect_with(:rspec) { |c| c.syntax = :should }
17
17
  FileUtils.rm_f(LOGFILE)
18
- HttpLogger.logger = Logger.new(LOGFILE)
18
+ HttpLogger.configuration.logger = Logger.new(LOGFILE)
19
19
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: http_logger
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.0
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bogdan Gusiev
@@ -11,7 +11,7 @@ cert_chain: []
11
11
  date: 2020-01-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: byebug
14
+ name: debug
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - ">="
@@ -67,7 +67,21 @@ dependencies:
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
69
  - !ruby/object:Gem::Dependency
70
- name: jeweler
70
+ name: bump
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rake
71
85
  requirement: !ruby/object:Gem::Requirement
72
86
  requirements:
73
87
  - - ">="
@@ -95,7 +109,6 @@ files:
95
109
  - LICENSE.txt
96
110
  - Rakefile
97
111
  - Readme.md
98
- - VERSION
99
112
  - http_logger.gemspec
100
113
  - lib/http_logger.rb
101
114
  - screenshots/hoptoad.png
@@ -122,7 +135,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
122
135
  - !ruby/object:Gem::Version
123
136
  version: '0'
124
137
  requirements: []
125
- rubygems_version: 3.2.22
138
+ rubygems_version: 3.5.11
126
139
  signing_key:
127
140
  specification_version: 4
128
141
  summary: Log your http api calls just like SQL queries
data/VERSION DELETED
@@ -1 +0,0 @@
1
- 0.7.0