tshield 0.11.19.0 → 0.11.20.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/README.md +10 -0
- data/config/tshield.yml +1 -0
- data/lib/tshield/controllers/helpers/session_helpers.rb +5 -0
- data/lib/tshield/controllers/requests.rb +3 -1
- data/lib/tshield/controllers/sessions.rb +3 -0
- data/lib/tshield/errors.rb +4 -0
- data/lib/tshield/matching/filters.rb +8 -0
- data/lib/tshield/request.rb +8 -8
- data/lib/tshield/request_vcr.rb +34 -21
- data/lib/tshield/sessions.rb +17 -1
- data/lib/tshield/version.rb +1 -1
- data/spec/tshield/fixtures/matching/example.json +12 -0
- data/spec/tshield/request_matching_spec.rb +12 -0
- data/spec/tshield/sessions_spec.rb +18 -0
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1880df41008713100967696d1bf1695b1e830851877f0ed5340f1f3f75cabd5e
|
4
|
+
data.tar.gz: 2a540ed72557ad9f9ba32073a5e98ed9b22812c1d0b96feaec00eeed35494386
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7187004fa9e86545dcf81ebf70ea3059e04a0a8dcfe0143be3714ead2df3b9fc7d3e981641514f38192d69e57f826c85b14c46965f5d8171e3813e1bd9188574
|
7
|
+
data.tar.gz: d1e5e07ff88b722a944d78e22f1d3089214fb1ae9bed74c7bd42943700fc63bc096fc7916368513c83e660cb7936044dffd52e0f5c5b927d2618364a1411074e
|
data/README.md
CHANGED
@@ -250,6 +250,16 @@ _DELETE_ to http://localhost:4567/sessions
|
|
250
250
|
curl -X DELETE \
|
251
251
|
http://localhost:4567/sessions
|
252
252
|
```
|
253
|
+
### Append secondary TShield session
|
254
|
+
**Append session. Secondary sessions will used only for read content in VCR mode, writes will be do in the main session. Append only works if exists a current session setted.**
|
255
|
+
|
256
|
+
_POST_ to http://localhost:4567/sessions?name=<<same_name>>
|
257
|
+
|
258
|
+
```
|
259
|
+
curl -X POST \
|
260
|
+
'http://localhost:4567/sessions/append?name=my_valid'
|
261
|
+
```
|
262
|
+
|
253
263
|
## [Experimental] Config options for gRPC
|
254
264
|
|
255
265
|
```yaml
|
data/config/tshield.yml
CHANGED
@@ -10,6 +10,11 @@ module TShield
|
|
10
10
|
session[:name] if session
|
11
11
|
end
|
12
12
|
|
13
|
+
def self.secondary_sessions(request)
|
14
|
+
session = TShield::Sessions.current(request.ip)
|
15
|
+
session[:secondary_sessions] if session
|
16
|
+
end
|
17
|
+
|
13
18
|
def self.current_session_call(request, callid, method)
|
14
19
|
session = TShield::Sessions.current(request.ip)
|
15
20
|
session ? session[:counter].current(callid, method) : 0
|
@@ -43,6 +43,7 @@ module TShield
|
|
43
43
|
request_content_type = request.content_type
|
44
44
|
|
45
45
|
session_name = TShield::Controllers::Helpers::SessionHelpers.current_session_name(request)
|
46
|
+
secondary_sessions = TShield::Controllers::Helpers::SessionHelpers.secondary_sessions(request)
|
46
47
|
session_call = TShield::Controllers::Helpers::SessionHelpers
|
47
48
|
.current_session_call(request, callid, method)
|
48
49
|
|
@@ -51,6 +52,7 @@ module TShield
|
|
51
52
|
headers: Helpers.build_headers(request),
|
52
53
|
raw_query: request.env['QUERY_STRING'],
|
53
54
|
session: session_name,
|
55
|
+
secondary_sessions: secondary_sessions,
|
54
56
|
call: session_call,
|
55
57
|
ip: request.ip
|
56
58
|
}
|
@@ -67,7 +69,7 @@ module TShield
|
|
67
69
|
unless api_response
|
68
70
|
add_headers(options, path)
|
69
71
|
|
70
|
-
api_response ||= TShield::RequestVCR.new(path, options.clone).
|
72
|
+
api_response ||= TShield::RequestVCR.new(path, options.clone).vcr_response
|
71
73
|
api_response.headers.reject! do |key, _v|
|
72
74
|
configuration.get_excluded_headers(domain(path)).include?(key)
|
73
75
|
end
|
@@ -23,6 +23,9 @@ module TShield
|
|
23
23
|
end
|
24
24
|
|
25
25
|
def self.register_post(app, session_path)
|
26
|
+
app.post "#{session_path}/append" do
|
27
|
+
TShield::Sessions.append(request.ip, params[:name]).to_json
|
28
|
+
end
|
26
29
|
app.post session_path do
|
27
30
|
TShield::Sessions.start(request.ip, params[:name]).to_json
|
28
31
|
end
|
@@ -8,6 +8,14 @@ module TShield
|
|
8
8
|
result = filter_stubs(stubs[@options[:session]] || {})
|
9
9
|
return result if result
|
10
10
|
|
11
|
+
find_in_secondary_sessions(stubs, @options[:secondary_sessions] || [])
|
12
|
+
end
|
13
|
+
|
14
|
+
def find_in_secondary_sessions(stubs, sessions)
|
15
|
+
sessions.each do |session|
|
16
|
+
result = filter_stubs(stubs[session] || {})
|
17
|
+
return result if result
|
18
|
+
end
|
11
19
|
filter_stubs(stubs[DEFAULT_SESSION] || {}) unless @options[:session] == DEFAULT_SESSION
|
12
20
|
end
|
13
21
|
|
data/lib/tshield/request.rb
CHANGED
@@ -13,8 +13,8 @@ module TShield
|
|
13
13
|
|
14
14
|
protected
|
15
15
|
|
16
|
-
def session_destiny(request_path)
|
17
|
-
session = @options[:session]
|
16
|
+
def session_destiny(request_path, current_session = nil)
|
17
|
+
session = current_session || @options[:session]
|
18
18
|
return request_path unless session
|
19
19
|
|
20
20
|
request_path = File.join(request_path, session)
|
@@ -22,19 +22,19 @@ module TShield
|
|
22
22
|
request_path
|
23
23
|
end
|
24
24
|
|
25
|
-
def content_destiny
|
26
|
-
"#{destiny}.content"
|
25
|
+
def content_destiny(current_session = nil)
|
26
|
+
"#{destiny(current_session)}.content"
|
27
27
|
end
|
28
28
|
|
29
|
-
def headers_destiny
|
30
|
-
"#{destiny}.json"
|
29
|
+
def headers_destiny(current_session = nil)
|
30
|
+
"#{destiny(current_session)}.json"
|
31
31
|
end
|
32
32
|
|
33
|
-
def destiny
|
33
|
+
def destiny(current_session = nil)
|
34
34
|
request_path = File.join('requests')
|
35
35
|
Dir.mkdir(request_path) unless File.exist?(request_path)
|
36
36
|
|
37
|
-
request_path = session_destiny(request_path)
|
37
|
+
request_path = session_destiny(request_path, current_session)
|
38
38
|
|
39
39
|
name_path = File.join(request_path, name)
|
40
40
|
Dir.mkdir(name_path) unless File.exist?(name_path)
|
data/lib/tshield/request_vcr.rb
CHANGED
@@ -2,11 +2,11 @@
|
|
2
2
|
|
3
3
|
require 'httparty'
|
4
4
|
require 'json'
|
5
|
-
require 'byebug'
|
6
5
|
|
7
6
|
require 'digest/sha1'
|
8
7
|
|
9
8
|
require 'tshield/configuration'
|
9
|
+
require 'tshield/logger'
|
10
10
|
require 'tshield/options'
|
11
11
|
require 'tshield/request'
|
12
12
|
require 'tshield/response'
|
@@ -14,6 +14,8 @@ require 'tshield/response'
|
|
14
14
|
module TShield
|
15
15
|
# Module to write and read saved responses
|
16
16
|
class RequestVCR < TShield::Request
|
17
|
+
attr_reader :vcr_response
|
18
|
+
|
17
19
|
def initialize(path, options = {})
|
18
20
|
super()
|
19
21
|
@path = path
|
@@ -35,27 +37,31 @@ module TShield
|
|
35
37
|
_method, @url, @options = filter.new.filter(method, @url, @options)
|
36
38
|
end
|
37
39
|
|
38
|
-
|
39
|
-
|
40
|
-
|
40
|
+
in_session = find_in_sessions
|
41
|
+
if in_session
|
42
|
+
# TODO: create concept of global session in vcr
|
43
|
+
in_session = nil if in_session == 'global'
|
44
|
+
@vcr_response = response(in_session)
|
45
|
+
@vcr_response.original = false
|
41
46
|
else
|
47
|
+
TShield.logger.info("calling original service for request with options #{@options}")
|
42
48
|
raw = HTTParty.send(method.to_s, @url, @options)
|
43
49
|
|
44
50
|
original_response = save(raw)
|
45
51
|
original_response.original = true
|
46
|
-
|
52
|
+
@vcr_response = original_response
|
47
53
|
end
|
48
54
|
|
49
55
|
configuration.get_after_filters(domain).each do |filter|
|
50
|
-
|
56
|
+
@vcr_response = filter.new.filter(@vcr_response)
|
51
57
|
end
|
52
|
-
resp
|
53
58
|
end
|
54
59
|
|
55
|
-
def response
|
56
|
-
|
57
|
-
|
58
|
-
|
60
|
+
def response(session)
|
61
|
+
response_content = saved_content(session)
|
62
|
+
TShield::Response.new(response_content['body'],
|
63
|
+
response_content['headers'] || [],
|
64
|
+
response_content['status'] || 200)
|
59
65
|
end
|
60
66
|
|
61
67
|
private
|
@@ -89,20 +95,27 @@ module TShield
|
|
89
95
|
TShield::Response.new(raw_response.body, headers, raw_response.code)
|
90
96
|
end
|
91
97
|
|
92
|
-
def saved_content
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
@saved_content['body'] = File.open(content_destiny).read unless @saved_content['body']
|
97
|
-
@saved_content
|
98
|
+
def saved_content(session)
|
99
|
+
content = JSON.parse(File.open(headers_destiny(session)).read)
|
100
|
+
content['body'] = File.open(content_destiny(session)).read unless content['body']
|
101
|
+
content
|
98
102
|
end
|
99
103
|
|
100
|
-
def file_exists
|
101
|
-
File.exist?(content_destiny)
|
104
|
+
def file_exists(session)
|
105
|
+
File.exist?(content_destiny(session))
|
102
106
|
end
|
103
107
|
|
104
|
-
def
|
105
|
-
|
108
|
+
def find_in_sessions
|
109
|
+
in_session = nil
|
110
|
+
|
111
|
+
([@options[:session]] + (@options[:secondary_sessions] || [])).each do |session|
|
112
|
+
if file_exists(session) && configuration.cache_request?(domain)
|
113
|
+
in_session = (session || 'global')
|
114
|
+
break
|
115
|
+
end
|
116
|
+
TShield.logger.info("saved response not found in #{session}")
|
117
|
+
end
|
118
|
+
in_session
|
106
119
|
end
|
107
120
|
|
108
121
|
def key
|
data/lib/tshield/sessions.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'tshield/logger'
|
3
4
|
require 'tshield/counter'
|
5
|
+
require 'tshield/errors'
|
4
6
|
|
5
7
|
module TShield
|
6
8
|
# Manage sessions
|
@@ -9,7 +11,11 @@ module TShield
|
|
9
11
|
module Sessions
|
10
12
|
def self.start(ip, name)
|
11
13
|
TShield.logger.info("starting session #{name} for ip #{normalize_ip(ip)}")
|
12
|
-
sessions[normalize_ip(ip)] = {
|
14
|
+
sessions[normalize_ip(ip)] = {
|
15
|
+
name: name,
|
16
|
+
counter: TShield::Counter.new,
|
17
|
+
secondary_sessions: []
|
18
|
+
}
|
13
19
|
end
|
14
20
|
|
15
21
|
def self.stop(ip)
|
@@ -22,6 +28,16 @@ module TShield
|
|
22
28
|
sessions[normalize_ip(ip)]
|
23
29
|
end
|
24
30
|
|
31
|
+
def self.append(ip, name)
|
32
|
+
TShield.logger.info("appeding session #{name} for ip #{normalize_ip(ip)}")
|
33
|
+
|
34
|
+
current_session = sessions[normalize_ip(ip)]
|
35
|
+
raise AppendSessionWithoutMainSessionError, "not found main session for #{ip}" unless current_session
|
36
|
+
|
37
|
+
current_session[:secondary_sessions] << name
|
38
|
+
current_session
|
39
|
+
end
|
40
|
+
|
25
41
|
def self.sessions
|
26
42
|
@sessions ||= {}
|
27
43
|
end
|
data/lib/tshield/version.rb
CHANGED
@@ -99,5 +99,17 @@
|
|
99
99
|
"body": "body content in session"
|
100
100
|
}
|
101
101
|
}]
|
102
|
+
},
|
103
|
+
{
|
104
|
+
"session": "second-session",
|
105
|
+
"stubs": [{
|
106
|
+
"method": "GET",
|
107
|
+
"path": "/matching/second-example",
|
108
|
+
"response": {
|
109
|
+
"status": 200,
|
110
|
+
"headers": {},
|
111
|
+
"body": "body content in second-session"
|
112
|
+
}
|
113
|
+
}]
|
102
114
|
}
|
103
115
|
]
|
@@ -235,6 +235,18 @@ describe TShield::RequestMatching do
|
|
235
235
|
expect(@response.headers).to eql({})
|
236
236
|
expect(@response.status).to eql(201)
|
237
237
|
end
|
238
|
+
context 'with secondary session' do
|
239
|
+
it 'should return response object from session settings' do
|
240
|
+
@request_matching = TShield::RequestMatching.new('/matching/second-example',
|
241
|
+
method: 'GET',
|
242
|
+
session: 'a-session',
|
243
|
+
secondary_sessions: ['second-session'])
|
244
|
+
@response = @request_matching.match_request
|
245
|
+
expect(@response.body).to eql('body content in second-session')
|
246
|
+
expect(@response.headers).to eql({})
|
247
|
+
expect(@response.status).to eql(200)
|
248
|
+
end
|
249
|
+
end
|
238
250
|
end
|
239
251
|
end
|
240
252
|
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'tshield/sessions'
|
4
|
+
require 'spec_helper'
|
5
|
+
|
6
|
+
describe TShield::Sessions do
|
7
|
+
context 'on append session' do
|
8
|
+
it 'should raise error if not has a main session' do
|
9
|
+
expect { TShield::Sessions.append 'ip', 'secondary-session' }
|
10
|
+
.to raise_error(AppendSessionWithoutMainSessionError)
|
11
|
+
end
|
12
|
+
it 'should append if has main session' do
|
13
|
+
TShield::Sessions.start 'ip', 'main-session'
|
14
|
+
result = TShield::Sessions.append 'ip', 'secondary-session'
|
15
|
+
expect(result[:secondary_sessions]).to include('secondary-session')
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tshield
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.11.
|
4
|
+
version: 0.11.20.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Diego Rubin
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2020-07-
|
12
|
+
date: 2020-07-26 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: byebug
|
@@ -426,6 +426,7 @@ files:
|
|
426
426
|
- lib/tshield/controllers/requests.rb
|
427
427
|
- lib/tshield/controllers/sessions.rb
|
428
428
|
- lib/tshield/counter.rb
|
429
|
+
- lib/tshield/errors.rb
|
429
430
|
- lib/tshield/extensions/string_extensions.rb
|
430
431
|
- lib/tshield/grpc.rb
|
431
432
|
- lib/tshield/grpc/vcr.rb
|
@@ -452,6 +453,7 @@ files:
|
|
452
453
|
- spec/tshield/options_spec.rb
|
453
454
|
- spec/tshield/request_matching_spec.rb
|
454
455
|
- spec/tshield/request_vcr_spec.rb
|
456
|
+
- spec/tshield/sessions_spec.rb
|
455
457
|
- tshield.gemspec
|
456
458
|
homepage: https://github.com/diegorubin/tshield
|
457
459
|
licenses:
|
@@ -481,6 +483,7 @@ test_files:
|
|
481
483
|
- spec/tshield/request_matching_spec.rb
|
482
484
|
- spec/tshield/grpc_spec.rb
|
483
485
|
- spec/tshield/configuration_spec.rb
|
486
|
+
- spec/tshield/sessions_spec.rb
|
484
487
|
- spec/tshield/request_vcr_spec.rb
|
485
488
|
- spec/tshield/controllers/requests_spec.rb
|
486
489
|
- spec/tshield/options_spec.rb
|