lhc 8.1.1 → 9.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +13 -3
- data/lib/lhc/formats/json.rb +11 -7
- data/lib/lhc/interceptors/zipkin.rb +1 -5
- data/lib/lhc/request.rb +13 -4
- data/lib/lhc/response/data/base.rb +2 -2
- data/lib/lhc/version.rb +1 -1
- data/spec/basic_methods/post_spec.rb +4 -4
- data/spec/basic_methods/put_spec.rb +4 -4
- data/spec/basic_methods/request_without_rails_spec.rb +1 -1
- data/spec/interceptors/zipkin/distributed_tracing_spec.rb +2 -58
- data/spec/request/url_patterns_spec.rb +1 -1
- data/spec/support/zipkin_mock.rb +2 -2
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7db64d4475586e832f57e7eda776d657d4d01971
|
4
|
+
data.tar.gz: bceb7e12c53148d19dff2909cef16d41f8d5094b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c2303382dcfa92216ee760eb7cd2daf53e58df1f3e026e1b6ebda16b1da786d0344992e1a133ed35c4c6bff7d2915ac761e9e8a46b237ac2caa87ba97de20ca9
|
7
|
+
data.tar.gz: 704a83dcf65173dffbb9cd7458a81c1bef2e5f4718688a0dc588d54d2694b1ca8a259e7043eb8545978b4aeedcaf94702db99a3d325548737ca3eae2fc66ca46
|
data/README.md
CHANGED
@@ -31,6 +31,15 @@ LHC.json.get(options)
|
|
31
31
|
|
32
32
|
Currently supported formats: `json`
|
33
33
|
|
34
|
+
If formats are used, headers for `Content-Type` and `Accept` are set by lhc, but also http bodies are translated by LHC, so you can pass bodies as ruby objects:
|
35
|
+
|
36
|
+
```ruby
|
37
|
+
LHC.json.post('http://slack', body: { text: 'Hi there' })
|
38
|
+
# Content-Type: application/json
|
39
|
+
# Accept: application/json
|
40
|
+
# Translates body to "{\"text\":\"Hi there\"}" before sending
|
41
|
+
```
|
42
|
+
|
34
43
|
## A request from scratch
|
35
44
|
|
36
45
|
```ruby
|
@@ -88,12 +97,13 @@ LHC.get('http://local.ch', followlocation: true)
|
|
88
97
|
|
89
98
|
## Transfer data through the body
|
90
99
|
|
91
|
-
Data that is transfered using the HTTP request body is transfered
|
92
|
-
|
100
|
+
Data that is transfered using the HTTP request body is transfered using the selected format, or the default `json`, so you need to provide it as a ruby object.
|
101
|
+
|
102
|
+
Also consider setting the http header for content-type or use one of the provided formats, like `LHC.json`.
|
93
103
|
|
94
104
|
```ruby
|
95
105
|
LHC.post('http://datastore/v2/feedbacks',
|
96
|
-
body: feedback
|
106
|
+
body: feedback,
|
97
107
|
headers: { 'Content-Type' => 'application/json' }
|
98
108
|
)
|
99
109
|
```
|
data/lib/lhc/formats/json.rb
CHANGED
@@ -10,12 +10,16 @@ module LHC::Formats
|
|
10
10
|
super(options)
|
11
11
|
end
|
12
12
|
|
13
|
-
def as_json(
|
14
|
-
parse(
|
13
|
+
def as_json(input)
|
14
|
+
parse(input, Hash)
|
15
15
|
end
|
16
16
|
|
17
|
-
def as_open_struct(
|
18
|
-
parse(
|
17
|
+
def as_open_struct(input)
|
18
|
+
parse(input, OpenStruct)
|
19
|
+
end
|
20
|
+
|
21
|
+
def to_body(input)
|
22
|
+
input.to_json
|
19
23
|
end
|
20
24
|
|
21
25
|
def to_s
|
@@ -28,10 +32,10 @@ module LHC::Formats
|
|
28
32
|
|
29
33
|
private
|
30
34
|
|
31
|
-
def parse(
|
32
|
-
::JSON.parse(
|
35
|
+
def parse(input, object_class)
|
36
|
+
::JSON.parse(input, object_class: object_class)
|
33
37
|
rescue ::JSON::ParserError => e
|
34
|
-
raise LHC::ParserError.new(e.message,
|
38
|
+
raise LHC::ParserError.new(e.message, input)
|
35
39
|
end
|
36
40
|
end
|
37
41
|
end
|
@@ -11,16 +11,13 @@ class LHC::Zipkin < LHC::Interceptor
|
|
11
11
|
def before_request
|
12
12
|
return unless dependencies?
|
13
13
|
ZipkinTracer::TraceContainer.with_trace_id(trace_id) do
|
14
|
-
# add headers even if the current trace_id should not be sampled
|
15
14
|
B3_HEADERS.each { |method, header| request.headers[header] = trace_id.send(method).to_s }
|
16
|
-
# only sample the current call if we're instructed to do so
|
17
15
|
start_trace! if ::Trace.tracer && trace_id.sampled?
|
18
16
|
end
|
19
17
|
end
|
20
18
|
|
21
19
|
def after_response
|
22
|
-
|
23
|
-
return unless dependencies? && trace_id.sampled?
|
20
|
+
return unless dependencies?
|
24
21
|
end_trace!
|
25
22
|
end
|
26
23
|
|
@@ -42,7 +39,6 @@ class LHC::Zipkin < LHC::Interceptor
|
|
42
39
|
@trace_id ||= ZipkinTracer::TraceGenerator.new.next_trace_id
|
43
40
|
end
|
44
41
|
|
45
|
-
# register a new span with zipkin tracer
|
46
42
|
def span
|
47
43
|
@span ||= ::Trace.tracer.start_span(trace_id, url.path)
|
48
44
|
end
|
data/lib/lhc/request.rb
CHANGED
@@ -14,12 +14,12 @@ class LHC::Request
|
|
14
14
|
self.errors_ignored = options.fetch(:ignored_errors, [])
|
15
15
|
self.options = options.deep_dup || {}
|
16
16
|
self.error_handler = options.delete :error_handler
|
17
|
+
self.format = options.delete('format') || LHC::Formats::JSON.new
|
17
18
|
use_configured_endpoint!
|
18
19
|
generate_url_from_template!
|
19
20
|
self.interceptors = LHC::Interceptors.new(self)
|
20
21
|
interceptors.intercept(:before_raw_request)
|
21
22
|
self.raw = create_request
|
22
|
-
self.format = options.delete('format') || LHC::Formats::JSON.new
|
23
23
|
interceptors.intercept(:before_request)
|
24
24
|
run! if self_executing && !response
|
25
25
|
end
|
@@ -58,7 +58,10 @@ class LHC::Request
|
|
58
58
|
end
|
59
59
|
|
60
60
|
def create_request
|
61
|
-
request = Typhoeus::Request.new(
|
61
|
+
request = Typhoeus::Request.new(
|
62
|
+
optionally_encoded_url(options),
|
63
|
+
translate_body(typhoeusize(options))
|
64
|
+
)
|
62
65
|
request.on_headers do
|
63
66
|
interceptors.intercept(:after_request)
|
64
67
|
interceptors.intercept(:before_response)
|
@@ -67,6 +70,12 @@ class LHC::Request
|
|
67
70
|
request
|
68
71
|
end
|
69
72
|
|
73
|
+
def translate_body(options)
|
74
|
+
return options if options.fetch(:body, nil).blank?
|
75
|
+
options[:body] = format.to_body(options[:body])
|
76
|
+
options
|
77
|
+
end
|
78
|
+
|
70
79
|
def encode_url(url)
|
71
80
|
return url if url.nil?
|
72
81
|
URI.escape(url)
|
@@ -100,8 +109,8 @@ class LHC::Request
|
|
100
109
|
def generate_url_from_template!
|
101
110
|
endpoint = LHC::Endpoint.new(options[:url])
|
102
111
|
params =
|
103
|
-
if
|
104
|
-
|
112
|
+
if format && options[:body]&.length
|
113
|
+
options[:body].merge(options[:params] || {}).deep_symbolize_keys
|
105
114
|
else
|
106
115
|
options[:params]
|
107
116
|
end
|
@@ -2,7 +2,7 @@
|
|
2
2
|
# but made accssible in the ruby world
|
3
3
|
module LHC::Response::Data::Base
|
4
4
|
def as_json
|
5
|
-
@json ||= (@data || response.format.as_json(response))
|
5
|
+
@json ||= (@data || response.format.as_json(response.body))
|
6
6
|
end
|
7
7
|
|
8
8
|
def as_open_struct
|
@@ -10,7 +10,7 @@ module LHC::Response::Data::Base
|
|
10
10
|
if @data
|
11
11
|
JSON.parse(@data.to_json, object_class: OpenStruct)
|
12
12
|
else
|
13
|
-
response.format.as_open_struct(response)
|
13
|
+
response.format.as_open_struct(response.body)
|
14
14
|
end
|
15
15
|
end
|
16
16
|
|
data/lib/lhc/version.rb
CHANGED
@@ -17,23 +17,23 @@ describe LHC do
|
|
17
17
|
end
|
18
18
|
|
19
19
|
it 'does a post request when providing a complete url' do
|
20
|
-
LHC.post('http://datastore/v2/feedbacks', body: feedback
|
20
|
+
LHC.post('http://datastore/v2/feedbacks', body: feedback)
|
21
21
|
end
|
22
22
|
|
23
23
|
it 'does a post request when providing the name of a configured endpoint' do
|
24
24
|
url = 'http://{+datastore}/v2/feedbacks'
|
25
25
|
options = { params: { datastore: 'datastore' } }
|
26
26
|
LHC.configure { |c| c.endpoint(:feedbacks, url, options) }
|
27
|
-
LHC.post(:feedbacks, body: feedback
|
27
|
+
LHC.post(:feedbacks, body: feedback)
|
28
28
|
end
|
29
29
|
|
30
30
|
it 'it makes response data available in a rails way' do
|
31
|
-
response = LHC.post('http://datastore/v2/feedbacks', body: feedback
|
31
|
+
response = LHC.post('http://datastore/v2/feedbacks', body: feedback)
|
32
32
|
expect(response.data.source_id).to eq 'aaa'
|
33
33
|
end
|
34
34
|
|
35
35
|
it 'provides response headers' do
|
36
|
-
response = LHC.post('http://datastore/v2/feedbacks', body: feedback
|
36
|
+
response = LHC.post('http://datastore/v2/feedbacks', body: feedback)
|
37
37
|
expect(response.headers).to be
|
38
38
|
end
|
39
39
|
end
|
@@ -23,23 +23,23 @@ describe LHC do
|
|
23
23
|
end
|
24
24
|
|
25
25
|
it 'does a post request when providing a complete url' do
|
26
|
-
LHC.put('http://datastore/v2/feedbacks', body: change
|
26
|
+
LHC.put('http://datastore/v2/feedbacks', body: change)
|
27
27
|
end
|
28
28
|
|
29
29
|
it 'does a post request when providing the name of a configured endpoint' do
|
30
30
|
url = 'http://{+datastore}/v2/feedbacks'
|
31
31
|
options = { params: { datastore: 'datastore' } }
|
32
32
|
LHC.configure { |c| c.endpoint(:feedbacks, url, options) }
|
33
|
-
LHC.put(:feedbacks, body: change
|
33
|
+
LHC.put(:feedbacks, body: change)
|
34
34
|
end
|
35
35
|
|
36
36
|
it 'it makes response data available in a rails way' do
|
37
|
-
response = LHC.put('http://datastore/v2/feedbacks', body: change
|
37
|
+
response = LHC.put('http://datastore/v2/feedbacks', body: change)
|
38
38
|
expect(response.data.recommended).to eq false
|
39
39
|
end
|
40
40
|
|
41
41
|
it 'provides response headers' do
|
42
|
-
response = LHC.put('http://datastore/v2/feedbacks', body: change
|
42
|
+
response = LHC.put('http://datastore/v2/feedbacks', body: change)
|
43
43
|
expect(response.headers).to be
|
44
44
|
end
|
45
45
|
end
|
@@ -13,7 +13,7 @@ describe LHC::Zipkin do
|
|
13
13
|
trace_id: 'trace_id',
|
14
14
|
parent_id: 'parent_id',
|
15
15
|
span_id: 'span_id',
|
16
|
-
sampled:
|
16
|
+
sampled: 'sampled',
|
17
17
|
flags: 'flags'
|
18
18
|
)
|
19
19
|
end
|
@@ -23,7 +23,7 @@ describe LHC::Zipkin do
|
|
23
23
|
expect(headers['X-B3-TraceId']).to eq('trace_id')
|
24
24
|
expect(headers['X-B3-ParentSpanId']).to eq('parent_id')
|
25
25
|
expect(headers['X-B3-SpanId']).to eq('span_id')
|
26
|
-
expect(headers['X-B3-Sampled']).to eq('
|
26
|
+
expect(headers['X-B3-Sampled']).to eq('sampled')
|
27
27
|
expect(headers['X-B3-Flags']).to eq('flags')
|
28
28
|
end
|
29
29
|
end
|
@@ -49,60 +49,4 @@ describe LHC::Zipkin do
|
|
49
49
|
expect(headers['X-B3-Flags']).to be_nil
|
50
50
|
end
|
51
51
|
end
|
52
|
-
|
53
|
-
describe 'creating new spans' do
|
54
|
-
context 'sampled? is false' do
|
55
|
-
before(:all) do
|
56
|
-
::ZipkinTracer::TraceContainer.setup_mock(
|
57
|
-
trace_id: 'trace_id',
|
58
|
-
parent_id: 'parent_id',
|
59
|
-
span_id: 'span_id',
|
60
|
-
sampled: false,
|
61
|
-
flags: 'flags'
|
62
|
-
)
|
63
|
-
end
|
64
|
-
|
65
|
-
it 'adds the proper X-B3 headers' do
|
66
|
-
headers = LHC.get(:local).request.headers
|
67
|
-
expect(headers['X-B3-TraceId']).to eq('trace_id')
|
68
|
-
expect(headers['X-B3-ParentSpanId']).to eq('parent_id')
|
69
|
-
expect(headers['X-B3-SpanId']).to eq('span_id')
|
70
|
-
expect(headers['X-B3-Sampled']).to eq('false')
|
71
|
-
expect(headers['X-B3-Flags']).to eq('flags')
|
72
|
-
end
|
73
|
-
|
74
|
-
it 'does not register a new span' do
|
75
|
-
# ensure no span was registered, by checking no call on span
|
76
|
-
expect_any_instance_of(described_class).not_to receive(:span).and_call_original
|
77
|
-
LHC.get(:local)
|
78
|
-
end
|
79
|
-
end
|
80
|
-
|
81
|
-
context 'sampled? is true' do
|
82
|
-
before(:all) do
|
83
|
-
::ZipkinTracer::TraceContainer.setup_mock(
|
84
|
-
trace_id: 'trace_id',
|
85
|
-
parent_id: 'parent_id',
|
86
|
-
span_id: 'span_id',
|
87
|
-
sampled: true,
|
88
|
-
flags: 'flags'
|
89
|
-
)
|
90
|
-
end
|
91
|
-
|
92
|
-
it 'adds the proper X-B3 headers' do
|
93
|
-
headers = LHC.get(:local).request.headers
|
94
|
-
expect(headers['X-B3-TraceId']).to eq('trace_id')
|
95
|
-
expect(headers['X-B3-ParentSpanId']).to eq('parent_id')
|
96
|
-
expect(headers['X-B3-SpanId']).to eq('span_id')
|
97
|
-
expect(headers['X-B3-Sampled']).to eq('true')
|
98
|
-
expect(headers['X-B3-Flags']).to eq('flags')
|
99
|
-
end
|
100
|
-
|
101
|
-
it 'does register a new span' do
|
102
|
-
# ensure a span was registered, by checking call on span
|
103
|
-
expect_any_instance_of(described_class).to receive(:span).at_least(1).times.and_call_original
|
104
|
-
LHC.get(:local)
|
105
|
-
end
|
106
|
-
end
|
107
|
-
end
|
108
52
|
end
|
@@ -18,6 +18,6 @@ describe LHC::Request do
|
|
18
18
|
|
19
19
|
it 'considers body when compiling urls' do
|
20
20
|
stub_request(:post, "http://datastore:8080/v2/places/123")
|
21
|
-
LHC.json.post('http://datastore:8080/v2/places/{id}', body: { id: 123 }
|
21
|
+
LHC.json.post('http://datastore:8080/v2/places/{id}', body: { id: 123 })
|
22
22
|
end
|
23
23
|
end
|
data/spec/support/zipkin_mock.rb
CHANGED
@@ -42,7 +42,7 @@ module ZipkinTracer
|
|
42
42
|
end
|
43
43
|
|
44
44
|
def sampled
|
45
|
-
|
45
|
+
'sampled'
|
46
46
|
end
|
47
47
|
|
48
48
|
def flags
|
@@ -50,7 +50,7 @@ module ZipkinTracer
|
|
50
50
|
end
|
51
51
|
|
52
52
|
def sampled?
|
53
|
-
|
53
|
+
true
|
54
54
|
end
|
55
55
|
end
|
56
56
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lhc
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 9.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- https://github.com/local-ch/lhc/contributors
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-03-
|
11
|
+
date: 2018-03-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: typhoeus
|
@@ -368,7 +368,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
368
368
|
requirements:
|
369
369
|
- Ruby >= 2.0.0
|
370
370
|
rubyforge_project:
|
371
|
-
rubygems_version: 2.6.
|
371
|
+
rubygems_version: 2.6.12
|
372
372
|
signing_key:
|
373
373
|
specification_version: 4
|
374
374
|
summary: LocalHttpClient
|