sniffer 0.3.1 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/ISSUE_TEMPLATE/bug_report.md +24 -0
- data/.github/ISSUE_TEMPLATE/feature_request.md +24 -0
- data/.github/PULL_REQUEST_TEMPLATE.md +23 -0
- data/.github/workflows/rspec.yml +37 -0
- data/.github/workflows/rubocop.yml +23 -0
- data/.rubocop.yml +14 -20
- data/CHANGELOG.md +16 -2
- data/README.md +53 -9
- data/docker-compose.yml +18 -0
- data/lib/all_prepend.rb +10 -0
- data/lib/curb_prepend.rb +9 -0
- data/lib/ethon_prepend.rb +9 -0
- data/lib/eventmachine_prepend.rb +9 -0
- data/lib/excon_prepend.rb +9 -0
- data/lib/http_prepend.rb +9 -0
- data/lib/httpclient_prepend.rb +9 -0
- data/lib/net_http_prepend.rb +9 -0
- data/lib/patron_prepend.rb +9 -0
- data/lib/sniffer/adapters/curb_adapter.rb +46 -12
- data/lib/sniffer/adapters/ethon_adapter.rb +53 -31
- data/lib/sniffer/adapters/eventmachine_adapter.rb +74 -38
- data/lib/sniffer/adapters/excon_adapter.rb +60 -30
- data/lib/sniffer/adapters/http_adapter.rb +22 -10
- data/lib/sniffer/adapters/httpclient_adapter.rb +68 -36
- data/lib/sniffer/adapters/net_http_adapter.rb +60 -29
- data/lib/sniffer/adapters/patron_adapter.rb +62 -30
- data/lib/sniffer/config.rb +12 -0
- data/lib/sniffer/data.rb +0 -2
- data/lib/sniffer/data_item.rb +29 -16
- data/lib/sniffer/middleware/chain.rb +73 -0
- data/lib/sniffer/middleware/entry.rb +19 -0
- data/lib/sniffer/middleware/logger.rb +27 -0
- data/lib/sniffer/version.rb +1 -1
- data/lib/sniffer.rb +12 -3
- data/sniffer.gemspec +5 -5
- metadata +38 -22
- data/.travis.yml +0 -6
@@ -6,42 +6,43 @@ module Sniffer
|
|
6
6
|
module EthonAdapter
|
7
7
|
# overrides http_request method
|
8
8
|
module Http
|
9
|
-
def
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
end
|
9
|
+
def http_request_with_sniffer(url, action_name, options = {})
|
10
|
+
make_sniffer_request(url, action_name, options)
|
11
|
+
|
12
|
+
http_request_without_sniffer(url, action_name, options)
|
14
13
|
end
|
15
14
|
|
16
|
-
|
17
|
-
def http_request_with_sniffer(url, action_name, options = {})
|
18
|
-
if Sniffer.enabled?
|
19
|
-
@data_item = Sniffer::DataItem.new
|
20
|
-
uri = URI("http://" + url)
|
15
|
+
private
|
21
16
|
|
22
|
-
|
23
|
-
|
24
|
-
port: options[:port] || uri.port,
|
25
|
-
headers: options[:headers].to_h,
|
26
|
-
body: options[:body].to_s)
|
17
|
+
def make_sniffer_request(url, action_name, options)
|
18
|
+
return unless Sniffer.enabled?
|
27
19
|
|
28
|
-
|
29
|
-
|
20
|
+
@data_item = Sniffer::DataItem.new
|
21
|
+
uri = URI("http://#{url}")
|
30
22
|
|
31
|
-
|
23
|
+
@data_item.request = Sniffer::DataItem::Request.new(host: uri.host,
|
24
|
+
method: action_name.upcase,
|
25
|
+
port: options[:port] || uri.port,
|
26
|
+
headers: options[:headers].to_h,
|
27
|
+
body: options[:body].to_s)
|
28
|
+
|
29
|
+
Sniffer.store(@data_item)
|
32
30
|
end
|
33
|
-
end
|
34
|
-
# rubocop:enable Metrics/AbcSize,Metrics/MethodLength
|
35
31
|
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
32
|
+
# Only used when prepending, see all_prepend.rb
|
33
|
+
module Prepend
|
34
|
+
include Http
|
35
|
+
|
36
|
+
def http_request(url, action_name, options = {})
|
37
|
+
make_sniffer_request(url, action_name, options)
|
38
|
+
|
39
|
+
super(url, action_name, options)
|
42
40
|
end
|
43
41
|
end
|
42
|
+
end
|
44
43
|
|
44
|
+
# overrides perform method
|
45
|
+
module Operations
|
45
46
|
# rubocop:disable Metrics/AbcSize,Metrics/MethodLength
|
46
47
|
def perform_with_sniffer
|
47
48
|
bm = Benchmark.realtime do
|
@@ -49,12 +50,12 @@ module Sniffer
|
|
49
50
|
end
|
50
51
|
|
51
52
|
if Sniffer.enabled?
|
52
|
-
uri = URI("http
|
53
|
+
uri = URI("http://#{@url}")
|
53
54
|
query = uri.path
|
54
55
|
query += "?#{uri.query}" if uri.query
|
55
56
|
@data_item.request.query = query
|
56
57
|
|
57
|
-
status = @response_headers.scan(%r{HTTP
|
58
|
+
status = @response_headers.scan(%r{HTTP/... (\d{3})}).flatten[0].to_i
|
58
59
|
hash_headers = @response_headers
|
59
60
|
.split(/\r?\n/)[1..-1]
|
60
61
|
.each_with_object({}) do |item, res|
|
@@ -66,7 +67,7 @@ module Sniffer
|
|
66
67
|
headers: hash_headers,
|
67
68
|
body: @response_body,
|
68
69
|
timing: bm)
|
69
|
-
@data_item
|
70
|
+
Sniffer.notify_response(@data_item)
|
70
71
|
|
71
72
|
end
|
72
73
|
|
@@ -76,12 +77,33 @@ module Sniffer
|
|
76
77
|
@return_code
|
77
78
|
end
|
78
79
|
# rubocop:enable Metrics/AbcSize,Metrics/MethodLength
|
80
|
+
|
81
|
+
# Only used when prepending, see all_prepend.rb
|
82
|
+
module Prepend
|
83
|
+
include Operations
|
84
|
+
|
85
|
+
def perform
|
86
|
+
perform_with_sniffer
|
87
|
+
end
|
88
|
+
end
|
79
89
|
end
|
80
90
|
end
|
81
91
|
end
|
82
92
|
end
|
83
93
|
|
84
94
|
if defined?(::Ethon::Easy)
|
85
|
-
|
86
|
-
|
95
|
+
if defined?(Sniffer::Adapters::EthonAdapter::PREPEND)
|
96
|
+
Ethon::Easy.prepend Sniffer::Adapters::EthonAdapter::Http::Prepend
|
97
|
+
Ethon::Easy.prepend Sniffer::Adapters::EthonAdapter::Operations::Prepend
|
98
|
+
else
|
99
|
+
Ethon::Easy.class_eval do
|
100
|
+
include Sniffer::Adapters::EthonAdapter::Http
|
101
|
+
alias_method :http_request_without_sniffer, :http_request
|
102
|
+
alias_method :http_request, :http_request_with_sniffer
|
103
|
+
|
104
|
+
include Sniffer::Adapters::EthonAdapter::Operations
|
105
|
+
alias_method :perform_without_sniffer, :perform
|
106
|
+
alias_method :perform, :perform_with_sniffer
|
107
|
+
end
|
108
|
+
end
|
87
109
|
end
|
@@ -6,58 +6,94 @@ module Sniffer
|
|
6
6
|
module EventMachineAdapter
|
7
7
|
# Overrides #send_request, #parse_response, #on_body_data
|
8
8
|
module Client
|
9
|
-
def self.included(base)
|
10
|
-
base.class_eval do
|
11
|
-
alias_method :send_request_without_sniffer, :send_request
|
12
|
-
alias_method :send_request, :send_request_with_sniffer
|
13
|
-
alias_method :parse_response_header_without_sniffer, :parse_response_header
|
14
|
-
alias_method :parse_response_header, :parse_response_header_with_sniffer
|
15
|
-
alias_method :on_body_data_without_sniffer, :on_body_data
|
16
|
-
alias_method :on_body_data, :on_body_data_with_sniffer
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
# rubocop:disable Metrics/AbcSize,Metrics/MethodLength
|
21
9
|
def send_request_with_sniffer(head, body)
|
22
|
-
|
23
|
-
@data_item = Sniffer::DataItem.new
|
24
|
-
@data_item.response = Sniffer::DataItem::Response.new
|
25
|
-
@data_item.request = Sniffer::DataItem::Request.new(host: @req.host,
|
26
|
-
method: @req.method.to_sym,
|
27
|
-
query: encode_query(@req.uri, @req.query),
|
28
|
-
headers: @req.headers,
|
29
|
-
body: @req.body.to_s,
|
30
|
-
port: @req.port)
|
31
|
-
Sniffer.store(@data_item)
|
32
|
-
|
33
|
-
@start_time = Time.now
|
34
|
-
end
|
35
|
-
|
10
|
+
send_request_sniffer(head, body)
|
36
11
|
send_request_without_sniffer(head, body)
|
37
12
|
end
|
38
|
-
# rubocop:enable Metrics/AbcSize,Metrics/MethodLength
|
39
13
|
|
40
14
|
def parse_response_header_with_sniffer(header, version, status)
|
41
|
-
|
42
|
-
@data_item.response.timing = Time.now - @start_time
|
43
|
-
@data_item.response.status = status
|
44
|
-
@data_item.response.headers = header
|
45
|
-
end
|
46
|
-
|
15
|
+
parse_response_header_sniffer(header, version, status)
|
47
16
|
parse_response_header_without_sniffer(header, version, status)
|
48
17
|
end
|
49
18
|
|
50
19
|
def on_body_data_with_sniffer(data)
|
51
|
-
|
52
|
-
|
53
|
-
|
20
|
+
on_body_data_sniffer(data)
|
21
|
+
on_body_data_without_sniffer(data)
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
# rubocop:disable Metrics/AbcSize, Metrics/MethodLength
|
27
|
+
def send_request_sniffer(_head, _body)
|
28
|
+
return unless Sniffer.enabled?
|
29
|
+
|
30
|
+
@data_item = Sniffer::DataItem.new
|
31
|
+
@data_item.response = Sniffer::DataItem::Response.new
|
32
|
+
@data_item.request = Sniffer::DataItem::Request.new(host: @req.host,
|
33
|
+
method: @req.method.to_sym,
|
34
|
+
query: encode_query(@req.uri, @req.query),
|
35
|
+
headers: @req.headers,
|
36
|
+
body: @req.body.to_s,
|
37
|
+
port: @req.port)
|
38
|
+
Sniffer.store(@data_item)
|
39
|
+
|
40
|
+
@start_time = Time.now
|
41
|
+
end
|
42
|
+
# rubocop:enable Metrics/AbcSize, Metrics/MethodLength
|
43
|
+
|
44
|
+
def parse_response_header_sniffer(header, _version, status)
|
45
|
+
return unless Sniffer.enabled?
|
46
|
+
|
47
|
+
@data_item.response.timing = Time.now - @start_time
|
48
|
+
@data_item.response.status = status
|
49
|
+
@data_item.response.headers = header
|
50
|
+
end
|
51
|
+
|
52
|
+
def on_body_data_sniffer(data)
|
53
|
+
return unless Sniffer.enabled?
|
54
|
+
|
55
|
+
@data_item.response.body = data
|
56
|
+
Sniffer.notify_response(@data_item)
|
57
|
+
end
|
58
|
+
|
59
|
+
# Only used when prepending, see all_prepend.rb
|
60
|
+
module Prepend
|
61
|
+
include Client
|
62
|
+
|
63
|
+
def send_request(head, body)
|
64
|
+
send_request_sniffer(head, body)
|
65
|
+
super(head, body)
|
54
66
|
end
|
55
67
|
|
56
|
-
|
68
|
+
def parse_response_header(header, version, status)
|
69
|
+
parse_response_header_sniffer(header, version, status)
|
70
|
+
super(header, version, status)
|
71
|
+
end
|
72
|
+
|
73
|
+
def on_body_data(data)
|
74
|
+
on_body_data_sniffer(data)
|
75
|
+
super(data)
|
76
|
+
end
|
57
77
|
end
|
58
78
|
end
|
59
79
|
end
|
60
80
|
end
|
61
81
|
end
|
62
82
|
|
63
|
-
EventMachine::HttpClient.
|
83
|
+
EventMachine::HttpClient.include Sniffer::Adapters::EventMachineAdapter::Client if defined?(::EventMachine::HttpClient)
|
84
|
+
|
85
|
+
if defined?(::EventMachine::HttpClient)
|
86
|
+
if defined?(Sniffer::Adapters::EventMachineAdapter::PREPEND)
|
87
|
+
EventMachine::HttpClient.prepend Sniffer::Adapters::EventMachineAdapter::Client::Prepend
|
88
|
+
else
|
89
|
+
EventMachine::HttpClient.class_eval do
|
90
|
+
include Sniffer::Adapters::EventMachineAdapter::Client
|
91
|
+
alias_method :send_request_without_sniffer, :send_request
|
92
|
+
alias_method :send_request, :send_request_with_sniffer
|
93
|
+
alias_method :parse_response_header_without_sniffer, :parse_response_header
|
94
|
+
alias_method :parse_response_header, :parse_response_header_with_sniffer
|
95
|
+
alias_method :on_body_data_without_sniffer, :on_body_data
|
96
|
+
alias_method :on_body_data, :on_body_data_with_sniffer
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
@@ -4,46 +4,76 @@ module Sniffer
|
|
4
4
|
module Adapters
|
5
5
|
# Excon adapter
|
6
6
|
module ExconAdapter
|
7
|
-
def self.included(base)
|
8
|
-
base.class_eval do
|
9
|
-
alias_method :request_without_sniffer, :request
|
10
|
-
alias_method :request, :request_with_sniffer
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
# rubocop:disable Metrics/AbcSize,Metrics/MethodLength
|
15
7
|
def request_with_sniffer(params = {}, &block)
|
16
|
-
|
17
|
-
datum = data.merge(params)
|
18
|
-
data_item = Sniffer::DataItem.new
|
19
|
-
data_item.request = Sniffer::DataItem::Request.new(host: datum[:host],
|
20
|
-
method: datum[:method],
|
21
|
-
query: datum[:path] + ::Excon::Utils.query_string(datum),
|
22
|
-
headers: datum[:headers] || {},
|
23
|
-
body: datum[:body].to_s,
|
24
|
-
port: datum[:port])
|
25
|
-
|
26
|
-
Sniffer.store(data_item)
|
27
|
-
end
|
8
|
+
data_item = request_sniffer_before(params)
|
28
9
|
|
29
10
|
bm = Benchmark.realtime do
|
30
11
|
@response = request_without_sniffer(params, &block)
|
31
12
|
end
|
32
13
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
14
|
+
request_sniffer_after(params, bm, data_item)
|
15
|
+
@response
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
38
19
|
|
39
|
-
|
40
|
-
|
20
|
+
# rubocop:disable Metrics/MethodLength
|
21
|
+
def request_sniffer_before(params)
|
22
|
+
return unless Sniffer.enabled?
|
41
23
|
|
42
|
-
|
24
|
+
datum = data.merge(params)
|
25
|
+
data_item = Sniffer::DataItem.new
|
26
|
+
data_item.request = Sniffer::DataItem::Request.new(host: datum[:host],
|
27
|
+
method: datum[:method],
|
28
|
+
query: datum[:path] + ::Excon::Utils.query_string(datum),
|
29
|
+
headers: datum[:headers] || {},
|
30
|
+
body: datum[:body].to_s,
|
31
|
+
port: datum[:port])
|
32
|
+
|
33
|
+
Sniffer.store(data_item)
|
34
|
+
|
35
|
+
data_item
|
36
|
+
end
|
37
|
+
# rubocop:enable Metrics/MethodLength
|
38
|
+
|
39
|
+
def request_sniffer_after(_params, benchmark, data_item)
|
40
|
+
return unless Sniffer.enabled?
|
41
|
+
|
42
|
+
data_item.response = Sniffer::DataItem::Response.new(status: @response.status,
|
43
|
+
headers: @response.headers,
|
44
|
+
body: @response.body,
|
45
|
+
timing: benchmark)
|
46
|
+
|
47
|
+
Sniffer.notify_response(data_item)
|
48
|
+
end
|
49
|
+
|
50
|
+
# Only used when prepending, see all_prepend.rb
|
51
|
+
module Prepend
|
52
|
+
include ExconAdapter
|
53
|
+
|
54
|
+
def request(params = {}, &block)
|
55
|
+
data_item = request_sniffer_before(params)
|
56
|
+
|
57
|
+
bm = Benchmark.realtime do
|
58
|
+
@response = super(params, &block)
|
59
|
+
end
|
60
|
+
|
61
|
+
request_sniffer_after(params, bm, data_item)
|
62
|
+
@response
|
63
|
+
end
|
43
64
|
end
|
44
|
-
# rubocop:enable Metrics/AbcSize,Metrics/MethodLength
|
45
65
|
end
|
46
66
|
end
|
47
67
|
end
|
48
68
|
|
49
|
-
|
69
|
+
if defined?(::Excon::Connection)
|
70
|
+
if defined?(Sniffer::Adapters::ExconAdapter::PREPEND)
|
71
|
+
::Excon::Connection.prepend Sniffer::Adapters::ExconAdapter::Prepend
|
72
|
+
else
|
73
|
+
::Excon::Connection.class_eval do
|
74
|
+
include Sniffer::Adapters::ExconAdapter
|
75
|
+
alias_method :request_without_sniffer, :request
|
76
|
+
alias_method :request, :request_with_sniffer
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
@@ -4,13 +4,6 @@ module Sniffer
|
|
4
4
|
module Adapters
|
5
5
|
# HTTP adapter
|
6
6
|
module HTTPAdapter
|
7
|
-
def self.included(base)
|
8
|
-
base.class_eval do
|
9
|
-
alias_method :request_without_sniffer, :request
|
10
|
-
alias_method :request, :request_with_sniffer
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
7
|
# private
|
15
8
|
|
16
9
|
# rubocop:disable Metrics/AbcSize, Metrics/MethodLength
|
@@ -55,7 +48,7 @@ module Sniffer
|
|
55
48
|
body: @res.body,
|
56
49
|
timing: bm)
|
57
50
|
|
58
|
-
data_item
|
51
|
+
Sniffer.notify_response(data_item)
|
59
52
|
end
|
60
53
|
|
61
54
|
return @res unless opts.follow
|
@@ -64,9 +57,28 @@ module Sniffer
|
|
64
57
|
perform(request, opts)
|
65
58
|
end
|
66
59
|
end
|
67
|
-
# rubocop:enable Metrics/AbcSize, Metrics/
|
60
|
+
# rubocop:enable Metrics/AbcSize, Metrics/MethodLength
|
61
|
+
|
62
|
+
# Only used when prepending, see all_prepend.rb
|
63
|
+
module Prepend
|
64
|
+
include HTTPAdapter
|
65
|
+
|
66
|
+
def request(*args)
|
67
|
+
request_with_sniffer(*args)
|
68
|
+
end
|
69
|
+
end
|
68
70
|
end
|
69
71
|
end
|
70
72
|
end
|
71
73
|
|
72
|
-
|
74
|
+
if defined?(::HTTP::Client)
|
75
|
+
if defined?(Sniffer::Adapters::HTTPAdapter::PREPEND)
|
76
|
+
HTTP::Client.prepend Sniffer::Adapters::HTTPAdapter::Prepend
|
77
|
+
else
|
78
|
+
HTTP::Client.class_eval do
|
79
|
+
include Sniffer::Adapters::HTTPAdapter
|
80
|
+
alias_method :request_without_sniffer, :request
|
81
|
+
alias_method :request, :request_with_sniffer
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
@@ -4,56 +4,88 @@ module Sniffer
|
|
4
4
|
module Adapters
|
5
5
|
# HttpClient adapter
|
6
6
|
module HTTPClientAdapter
|
7
|
-
def
|
8
|
-
|
9
|
-
|
10
|
-
|
7
|
+
def do_get_block_with_sniffer(req, proxy, conn, &block)
|
8
|
+
data_item = do_get_block_sniffer_before(req)
|
9
|
+
|
10
|
+
retryable_response = nil
|
11
|
+
|
12
|
+
bm = Benchmark.realtime do
|
13
|
+
do_get_block_without_sniffer(req, proxy, conn, &block)
|
14
|
+
rescue HTTPClient::RetryableResponse => e
|
15
|
+
retryable_response = e
|
11
16
|
end
|
17
|
+
|
18
|
+
do_get_block_sniffer_after(data_item, conn, bm)
|
19
|
+
|
20
|
+
raise retryable_response unless retryable_response.nil?
|
12
21
|
end
|
13
22
|
|
14
|
-
|
23
|
+
private
|
15
24
|
|
16
|
-
# rubocop:disable Metrics/AbcSize
|
17
|
-
def
|
18
|
-
|
19
|
-
data_item = Sniffer::DataItem.new
|
20
|
-
data_item.request = Sniffer::DataItem::Request.new(host: req.header.request_uri.host,
|
21
|
-
query: req.header.create_query_uri,
|
22
|
-
method: req.header.request_method,
|
23
|
-
headers: req.headers,
|
24
|
-
body: req.body,
|
25
|
-
port: req.header.request_uri.port)
|
26
|
-
|
27
|
-
Sniffer.store(data_item)
|
28
|
-
end
|
25
|
+
# rubocop:disable Metrics/AbcSize
|
26
|
+
def do_get_block_sniffer_before(req)
|
27
|
+
return unless Sniffer.enabled?
|
29
28
|
|
30
|
-
|
29
|
+
data_item = Sniffer::DataItem.new
|
30
|
+
data_item.request = Sniffer::DataItem::Request.new(host: req.header.request_uri.host,
|
31
|
+
query: req.header.create_query_uri,
|
32
|
+
method: req.header.request_method,
|
33
|
+
headers: req.headers,
|
34
|
+
body: req.body,
|
35
|
+
port: req.header.request_uri.port)
|
31
36
|
|
32
|
-
|
33
|
-
|
34
|
-
|
37
|
+
Sniffer.store(data_item)
|
38
|
+
|
39
|
+
data_item
|
40
|
+
end
|
41
|
+
# rubocop:enable Metrics/AbcSize
|
42
|
+
|
43
|
+
def do_get_block_sniffer_after(data_item, conn, benchmark)
|
44
|
+
return unless Sniffer.enabled?
|
45
|
+
|
46
|
+
res = conn.pop
|
47
|
+
data_item.response = Sniffer::DataItem::Response.new(status: res.status_code.to_i,
|
48
|
+
headers: res.headers,
|
49
|
+
body: res.body,
|
50
|
+
timing: benchmark)
|
51
|
+
|
52
|
+
conn.push(res)
|
53
|
+
|
54
|
+
Sniffer.notify_response(data_item)
|
55
|
+
end
|
56
|
+
|
57
|
+
# Only used when prepending, see all_prepend.rb
|
58
|
+
module Prepend
|
59
|
+
include HTTPClientAdapter
|
60
|
+
|
61
|
+
def do_get_block(req, proxy, conn, &block)
|
62
|
+
data_item = do_get_block_sniffer_before(req)
|
63
|
+
|
64
|
+
retryable_response = nil
|
65
|
+
|
66
|
+
bm = Benchmark.realtime do
|
67
|
+
super(req, proxy, conn, &block)
|
35
68
|
rescue HTTPClient::RetryableResponse => e
|
36
69
|
retryable_response = e
|
37
70
|
end
|
38
|
-
end
|
39
|
-
|
40
|
-
if Sniffer.enabled?
|
41
|
-
res = conn.pop
|
42
|
-
data_item.response = Sniffer::DataItem::Response.new(status: res.status_code.to_i,
|
43
|
-
headers: res.headers,
|
44
|
-
body: res.body,
|
45
|
-
timing: bm)
|
46
71
|
|
47
|
-
conn
|
72
|
+
do_get_block_sniffer_after(data_item, conn, bm)
|
48
73
|
|
49
|
-
|
74
|
+
raise retryable_response unless retryable_response.nil?
|
50
75
|
end
|
51
|
-
|
52
|
-
raise retryable_response unless retryable_response.nil?
|
53
76
|
end
|
54
|
-
# rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength
|
55
77
|
end
|
56
78
|
end
|
57
79
|
end
|
58
80
|
|
59
|
-
|
81
|
+
if defined?(::HTTPClient)
|
82
|
+
if defined?(Sniffer::Adapters::HTTPClientAdapter::PREPEND)
|
83
|
+
HTTPClient.prepend Sniffer::Adapters::HTTPClientAdapter::Prepend
|
84
|
+
else
|
85
|
+
HTTPClient.class_eval do
|
86
|
+
include Sniffer::Adapters::HTTPClientAdapter
|
87
|
+
alias_method :do_get_block_without_sniffer, :do_get_block
|
88
|
+
alias_method :do_get_block, :do_get_block_with_sniffer
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
@@ -7,44 +7,75 @@ module Sniffer
|
|
7
7
|
module Adapters
|
8
8
|
# Net::HTTP adapter
|
9
9
|
module NetHttpAdapter
|
10
|
-
def self.included(base)
|
11
|
-
base.class_eval do
|
12
|
-
alias_method :request_without_sniffer, :request
|
13
|
-
alias_method :request, :request_with_sniffer
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
# rubocop:disable Metrics/AbcSize, Metrics/MethodLength
|
18
10
|
def request_with_sniffer(req, body = nil, &block)
|
19
|
-
|
20
|
-
data_item = Sniffer::DataItem.new
|
21
|
-
data_item.request = Sniffer::DataItem::Request.new(host: @address,
|
22
|
-
method: req.method,
|
23
|
-
query: req.path,
|
24
|
-
port: @port,
|
25
|
-
headers: req.each_header.collect.to_h,
|
26
|
-
body: req.body.to_s)
|
27
|
-
|
28
|
-
Sniffer.store(data_item)
|
29
|
-
end
|
11
|
+
data_item = request_sniffer_before(req)
|
30
12
|
|
31
13
|
bm = Benchmark.realtime do
|
32
14
|
@response = request_without_sniffer(req, body, &block)
|
33
15
|
end
|
34
16
|
|
35
|
-
|
36
|
-
data_item.response = Sniffer::DataItem::Response.new(status: @response.code.to_i,
|
37
|
-
headers: @response.each_header.collect.to_h,
|
38
|
-
body: @response.body.to_s,
|
39
|
-
timing: bm)
|
40
|
-
|
41
|
-
data_item.log
|
42
|
-
end
|
17
|
+
request_sniffer_after(data_item, bm)
|
43
18
|
|
44
19
|
@response
|
45
20
|
end
|
46
|
-
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def request_sniffer_before(req)
|
25
|
+
return unless started? && Sniffer.enabled?
|
26
|
+
|
27
|
+
data_item = Sniffer::DataItem.new
|
28
|
+
data_item.request = Sniffer::DataItem::Request.new(host: @address,
|
29
|
+
method: req.method,
|
30
|
+
query: req.path,
|
31
|
+
port: @port,
|
32
|
+
headers: req.each_header.collect.to_h,
|
33
|
+
body: req.body.to_s)
|
34
|
+
|
35
|
+
Sniffer.store(data_item)
|
36
|
+
|
37
|
+
data_item
|
38
|
+
end
|
39
|
+
|
40
|
+
def request_sniffer_after(data_item, benchmark)
|
41
|
+
return unless started? && Sniffer.enabled?
|
42
|
+
|
43
|
+
data_item.response = Sniffer::DataItem::Response.new(status: @response.code.to_i,
|
44
|
+
headers: @response.each_header.collect.to_h,
|
45
|
+
body: @response.body.to_s,
|
46
|
+
timing: benchmark)
|
47
|
+
|
48
|
+
Sniffer.notify_response(data_item)
|
49
|
+
end
|
50
|
+
|
51
|
+
# Only used when prepending, see all_prepend.rb
|
52
|
+
module Prepend
|
53
|
+
include NetHttpAdapter
|
54
|
+
|
55
|
+
def request(req, body = nil, &block)
|
56
|
+
data_item = request_sniffer_before(req)
|
57
|
+
|
58
|
+
bm = Benchmark.realtime do
|
59
|
+
@response = super(req, body, &block)
|
60
|
+
end
|
61
|
+
|
62
|
+
request_sniffer_after(data_item, bm)
|
63
|
+
|
64
|
+
@response
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
if defined?(::Net::HTTP)
|
72
|
+
if defined?(Sniffer::Adapters::NetHttpAdapter::PREPEND)
|
73
|
+
Net::HTTP.prepend Sniffer::Adapters::NetHttpAdapter::Prepend
|
74
|
+
else
|
75
|
+
Net::HTTP.class_eval do
|
76
|
+
include Sniffer::Adapters::NetHttpAdapter
|
77
|
+
alias_method :request_without_sniffer, :request
|
78
|
+
alias_method :request, :request_with_sniffer
|
47
79
|
end
|
48
80
|
end
|
49
81
|
end
|
50
|
-
Net::HTTP.send(:include, Sniffer::Adapters::NetHttpAdapter)
|