sitehub 0.5.0.alpha5 → 0.5.0.alpha6
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/Gemfile.lock +2 -2
- data/lib/sitehub/candidate_routes/class_methods.rb +42 -0
- data/lib/sitehub/{route_builder.rb → candidate_routes.rb} +76 -69
- data/lib/sitehub/collection_methods.rb +12 -0
- data/lib/sitehub/cookie/rewriting.rb +42 -0
- data/lib/sitehub/core.rb +10 -20
- data/lib/sitehub/identifier.rb +2 -2
- data/lib/sitehub/middleware/{routes.rb → candidate_route_mappings.rb} +4 -4
- data/lib/sitehub/middleware/config_loader.rb +1 -0
- data/lib/sitehub/middleware/reverse_proxy.rb +2 -2
- data/lib/sitehub/middleware.rb +1 -1
- data/lib/sitehub/request.rb +1 -1
- data/lib/sitehub/version.rb +1 -1
- data/spec/integration/access_logs_spec.rb +75 -0
- data/spec/integration/middleware_spec.rb +129 -0
- data/spec/integration/version_affinity_spec.rb +55 -0
- data/spec/sitehub/builder_spec.rb +3 -3
- data/spec/sitehub/{route_builder_spec.rb → candidate_routes_spec.rb} +193 -52
- data/spec/sitehub/cookie/rewriting_spec.rb +68 -0
- data/spec/sitehub/core_spec.rb +7 -7
- data/spec/sitehub/middleware/{routes_spec.rb → candidate_route_mappings_spec.rb} +4 -4
- data/spec/spec_helper.rb +1 -0
- data/spec/support/shared_examples/sitehub_json_context.rb +42 -6
- metadata +13 -9
- data/lib/sitehub/cookie_rewriting.rb +0 -40
- data/spec/sitehub/cookie_rewriting_spec.rb +0 -66
- data/spec/sitehub/integration_spec.rb +0 -197
@@ -0,0 +1,68 @@
|
|
1
|
+
require 'sitehub/cookie/rewriting'
|
2
|
+
|
3
|
+
class SiteHub
|
4
|
+
class Cookie
|
5
|
+
describe Rewriting do
|
6
|
+
include_context :module_spec
|
7
|
+
|
8
|
+
let(:downstream_domain) { '.downstream_domain.com' }
|
9
|
+
|
10
|
+
let(:request_mapping) do
|
11
|
+
RequestMapping.new(source_url: 'http://example.org',
|
12
|
+
mapped_url: "http://#{downstream_domain}",
|
13
|
+
mapped_path: '/map')
|
14
|
+
end
|
15
|
+
|
16
|
+
let(:substitute_domain) { URI(request_mapping.source_url).host }
|
17
|
+
let(:substitute_path) { '/path' }
|
18
|
+
let(:downstream_response) { Rack::Response.new }
|
19
|
+
let(:downstream_domain_cookie_name) { 'downstream.cookie' }
|
20
|
+
|
21
|
+
before do
|
22
|
+
downstream_response.set_cookie(downstream_domain_cookie_name, domain: downstream_domain, value: 'value')
|
23
|
+
downstream_response.set_cookie('downstream.cookie2', domain: downstream_domain, value: 'value2', httponly: true)
|
24
|
+
end
|
25
|
+
|
26
|
+
describe '#cookies_string_as_hash' do
|
27
|
+
it 'returns the string as a hash' do
|
28
|
+
cookie_header = downstream_response.headers['Set-Cookie']
|
29
|
+
|
30
|
+
cookie_strings = cookie_header.lines
|
31
|
+
first_cookie = SiteHub::Cookie.new(cookie_strings[0])
|
32
|
+
second_cookie = SiteHub::Cookie.new(cookie_strings[1])
|
33
|
+
expected = {
|
34
|
+
first_cookie.name => first_cookie,
|
35
|
+
second_cookie.name => second_cookie
|
36
|
+
}
|
37
|
+
result = subject.cookies_string_as_hash(cookie_header)
|
38
|
+
expect(result).to eq(expected)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
describe '#cookies_hash_to_string' do
|
43
|
+
it 'returns the hash as a correctly formatted string' do
|
44
|
+
cookies_hash = subject.cookies_string_as_hash(downstream_response.headers['Set-Cookie'])
|
45
|
+
expect(subject.cookies_hash_to_string(cookies_hash)).to eq(downstream_response.headers['Set-Cookie'])
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
describe '#rewrite_cookies' do
|
50
|
+
context 'subdomain character present' do
|
51
|
+
it 'substitues the domain for the mapped domain' do
|
52
|
+
downstream_response.set_cookie(downstream_domain_cookie_name, domain: downstream_domain, value: 'value')
|
53
|
+
subject.rewrite_cookies(downstream_response.headers, substitute_domain: substitute_domain)
|
54
|
+
expect(downstream_response.cookies[downstream_domain_cookie_name][:domain]).to eq('.example.org')
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
context 'subdomain not character present' do
|
59
|
+
it 'substitues the domain for the mapped domain' do
|
60
|
+
downstream_response.set_cookie(downstream_domain_cookie_name, domain: 'downstream.com', value: 'value')
|
61
|
+
subject.rewrite_cookies(downstream_response.headers, substitute_domain: substitute_domain)
|
62
|
+
expect(downstream_response.cookies[downstream_domain_cookie_name][:domain]).to eq('example.org')
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
data/spec/sitehub/core_spec.rb
CHANGED
@@ -38,7 +38,7 @@ class SiteHub
|
|
38
38
|
sitehub_json[:sitehub_cookie_name] = 'custom_name'
|
39
39
|
|
40
40
|
expect(core.sitehub_cookie_name).to eq(expected.sitehub_cookie_name)
|
41
|
-
expect(core.
|
41
|
+
expect(core.mappings['/route_1'].sitehub_cookie_name).to eq(expected.sitehub_cookie_name)
|
42
42
|
end
|
43
43
|
end
|
44
44
|
|
@@ -78,13 +78,13 @@ class SiteHub
|
|
78
78
|
|
79
79
|
describe '#proxy' do
|
80
80
|
let(:expected_route) do
|
81
|
-
|
82
|
-
|
81
|
+
CandidateRoutes.new(sitehub_cookie_name: RECORDED_ROUTES_COOKIE,
|
82
|
+
mapped_path: '/app')
|
83
83
|
end
|
84
84
|
|
85
85
|
context 'string as parameters' do
|
86
86
|
it 'treats it as the mapped path' do
|
87
|
-
expect_any_instance_of(Middleware::
|
87
|
+
expect_any_instance_of(Middleware::CandidateRouteMappings)
|
88
88
|
.to receive(:add_route)
|
89
89
|
.with(url: nil, mapped_path: '/app').and_call_original
|
90
90
|
subject.proxy('/app')
|
@@ -93,7 +93,7 @@ class SiteHub
|
|
93
93
|
|
94
94
|
context 'hash as parameter' do
|
95
95
|
it 'treats the key as the mapped path and the value as downstream url' do
|
96
|
-
expect_any_instance_of(Middleware::
|
96
|
+
expect_any_instance_of(Middleware::CandidateRouteMappings)
|
97
97
|
.to receive(:add_route)
|
98
98
|
.with(url: :downstream_url, mapped_path: '/app').and_call_original
|
99
99
|
subject.proxy('/app' => :downstream_url)
|
@@ -104,7 +104,7 @@ class SiteHub
|
|
104
104
|
it 'uses the block when creating the proxy' do
|
105
105
|
proc = proc {}
|
106
106
|
|
107
|
-
expect_any_instance_of(Middleware::
|
107
|
+
expect_any_instance_of(Middleware::CandidateRouteMappings).to receive(:add_route) do |*_args, &block|
|
108
108
|
expect(block).to be(proc)
|
109
109
|
end
|
110
110
|
|
@@ -123,7 +123,7 @@ class SiteHub
|
|
123
123
|
|
124
124
|
it 'passes the block to the route constructor' do
|
125
125
|
expected_route.split url: :endpoint, percentage: 100, label: :label
|
126
|
-
expect(subject.
|
126
|
+
expect(subject.mappings['/app'].candidates).to eq(expected_route.candidates)
|
127
127
|
end
|
128
128
|
end
|
129
129
|
end
|
@@ -1,8 +1,8 @@
|
|
1
|
-
require 'sitehub/middleware/
|
1
|
+
require 'sitehub/middleware/candidate_route_mappings'
|
2
2
|
|
3
3
|
class SiteHub
|
4
4
|
module Middleware
|
5
|
-
describe
|
5
|
+
describe CandidateRouteMappings do
|
6
6
|
let(:base_url) { 'http://google.com' }
|
7
7
|
let(:mapped_path) { '/app' }
|
8
8
|
let(:mapped_path) { '/application_url' }
|
@@ -35,7 +35,7 @@ class SiteHub
|
|
35
35
|
context 'RouteBuilder as parameter' do
|
36
36
|
it 'sets it' do
|
37
37
|
another_mapping = '/mapping'
|
38
|
-
route =
|
38
|
+
route = CandidateRoutes.new(sitehub_cookie_name: :sitehub_cookie_name, mapped_path: another_mapping)
|
39
39
|
subject.add_route route_builder: route
|
40
40
|
expect(subject[another_mapping]).to be(route)
|
41
41
|
end
|
@@ -69,7 +69,7 @@ class SiteHub
|
|
69
69
|
context 'mapped_route found' do
|
70
70
|
it 'uses the forward proxy' do
|
71
71
|
subject
|
72
|
-
expect(forward_proxy_builder.
|
72
|
+
expect(forward_proxy_builder.candidates[Identifier.new(:current)]).to receive(:call) do
|
73
73
|
[200, {}, []]
|
74
74
|
end
|
75
75
|
expect(get(mapped_path).status).to eq(200)
|
data/spec/spec_helper.rb
CHANGED
@@ -1,26 +1,62 @@
|
|
1
1
|
shared_context :sitehub_json do
|
2
2
|
let(:sitehub_json) do
|
3
3
|
{
|
4
|
-
proxies: [
|
4
|
+
proxies: [routes_proxy, split_proxy]
|
5
5
|
}
|
6
6
|
end
|
7
7
|
|
8
|
-
let(:
|
8
|
+
let(:routes_proxy) do
|
9
9
|
{
|
10
10
|
path: '/route_1',
|
11
11
|
sitehub_cookie_path: 'route_1_cookie_path',
|
12
|
-
routes: [route_1]
|
12
|
+
routes: [route_1],
|
13
|
+
default: 'route_proxy_default_url'
|
13
14
|
}
|
14
15
|
end
|
15
16
|
|
16
|
-
let(:
|
17
|
+
let(:split_proxy) do
|
17
18
|
{
|
18
|
-
path: '/
|
19
|
-
sitehub_cookie_path: '
|
19
|
+
path: '/route_2',
|
20
|
+
sitehub_cookie_path: 'route_2_cookie_path',
|
21
|
+
splits: [split_1, split_2],
|
22
|
+
default: 'split_proxy_default_url'
|
23
|
+
}
|
24
|
+
end
|
25
|
+
|
26
|
+
let(:nested_split_proxy) do
|
27
|
+
{
|
28
|
+
path: '/route_3',
|
29
|
+
sitehub_cookie_path: 'route_3_cookie_path',
|
30
|
+
splits: [nested_split],
|
31
|
+
default: 'route_proxy_default_url'
|
32
|
+
}
|
33
|
+
end
|
34
|
+
|
35
|
+
let(:nested_route_proxy) do
|
36
|
+
{
|
37
|
+
path: '/route_3',
|
38
|
+
sitehub_cookie_path: 'route_3_cookie_path',
|
39
|
+
splits: [nested_route],
|
40
|
+
default: 'route_proxy_default_url'
|
41
|
+
}
|
42
|
+
end
|
43
|
+
|
44
|
+
let(:nested_split) do
|
45
|
+
{
|
46
|
+
label: :nested_split_label,
|
47
|
+
percentage: 100,
|
20
48
|
splits: [split_1, split_2]
|
21
49
|
}
|
22
50
|
end
|
23
51
|
|
52
|
+
let(:nested_route) do
|
53
|
+
{
|
54
|
+
label: :nested_route_label,
|
55
|
+
percentage: 100,
|
56
|
+
routes: [route_1]
|
57
|
+
}
|
58
|
+
end
|
59
|
+
|
24
60
|
let(:route_1) do
|
25
61
|
{
|
26
62
|
label: :route_label_1,
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sitehub
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.0.
|
4
|
+
version: 0.5.0.alpha6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ladtech
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-08-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rack
|
@@ -339,17 +339,20 @@ files:
|
|
339
339
|
- circle.yml
|
340
340
|
- lib/sitehub.rb
|
341
341
|
- lib/sitehub/builder.rb
|
342
|
+
- lib/sitehub/candidate_routes.rb
|
343
|
+
- lib/sitehub/candidate_routes/class_methods.rb
|
342
344
|
- lib/sitehub/collection.rb
|
343
345
|
- lib/sitehub/collection/route_collection.rb
|
344
346
|
- lib/sitehub/collection/split_route_collection.rb
|
345
347
|
- lib/sitehub/collection/split_route_collection/split.rb
|
348
|
+
- lib/sitehub/collection_methods.rb
|
346
349
|
- lib/sitehub/constants.rb
|
347
350
|
- lib/sitehub/constants/http_header_keys.rb
|
348
351
|
- lib/sitehub/constants/rack_http_header_keys.rb
|
349
352
|
- lib/sitehub/cookie.rb
|
350
353
|
- lib/sitehub/cookie/attribute.rb
|
351
354
|
- lib/sitehub/cookie/flag.rb
|
352
|
-
- lib/sitehub/
|
355
|
+
- lib/sitehub/cookie/rewriting.rb
|
353
356
|
- lib/sitehub/core.rb
|
354
357
|
- lib/sitehub/downstream_client.rb
|
355
358
|
- lib/sitehub/equality.rb
|
@@ -361,6 +364,7 @@ files:
|
|
361
364
|
- lib/sitehub/location_rewriters.rb
|
362
365
|
- lib/sitehub/memoize.rb
|
363
366
|
- lib/sitehub/middleware.rb
|
367
|
+
- lib/sitehub/middleware/candidate_route_mappings.rb
|
364
368
|
- lib/sitehub/middleware/config_loader.rb
|
365
369
|
- lib/sitehub/middleware/error_handling.rb
|
366
370
|
- lib/sitehub/middleware/logging.rb
|
@@ -372,7 +376,6 @@ files:
|
|
372
376
|
- lib/sitehub/middleware/logging/request_log.rb
|
373
377
|
- lib/sitehub/middleware/reverse_proxy.rb
|
374
378
|
- lib/sitehub/middleware/route.rb
|
375
|
-
- lib/sitehub/middleware/routes.rb
|
376
379
|
- lib/sitehub/middleware/transaction_id.rb
|
377
380
|
- lib/sitehub/nil_location_rewriter.rb
|
378
381
|
- lib/sitehub/nil_route.rb
|
@@ -380,21 +383,24 @@ files:
|
|
380
383
|
- lib/sitehub/request_mapping.rb
|
381
384
|
- lib/sitehub/resolver.rb
|
382
385
|
- lib/sitehub/response.rb
|
383
|
-
- lib/sitehub/route_builder.rb
|
384
386
|
- lib/sitehub/rules.rb
|
385
387
|
- lib/sitehub/string_utils.rb
|
386
388
|
- lib/sitehub/version.rb
|
387
389
|
- mem_usage.txt
|
388
390
|
- sitehub.gemspec
|
389
391
|
- spec/equality_spec.rb
|
392
|
+
- spec/integration/access_logs_spec.rb
|
393
|
+
- spec/integration/middleware_spec.rb
|
394
|
+
- spec/integration/version_affinity_spec.rb
|
390
395
|
- spec/sitehub/builder_spec.rb
|
396
|
+
- spec/sitehub/candidate_routes_spec.rb
|
391
397
|
- spec/sitehub/collection/route_collection_spec.rb
|
392
398
|
- spec/sitehub/collection/split_route_collection/split_spec.rb
|
393
399
|
- spec/sitehub/collection/split_route_collection_spec.rb
|
394
400
|
- spec/sitehub/collection_spec.rb
|
395
401
|
- spec/sitehub/cookie/attribute_spec.rb
|
396
402
|
- spec/sitehub/cookie/flag_spec.rb
|
397
|
-
- spec/sitehub/
|
403
|
+
- spec/sitehub/cookie/rewriting_spec.rb
|
398
404
|
- spec/sitehub/cookie_spec.rb
|
399
405
|
- spec/sitehub/core_spec.rb
|
400
406
|
- spec/sitehub/downstream_client_spec.rb
|
@@ -402,10 +408,10 @@ files:
|
|
402
408
|
- spec/sitehub/forward_proxy_spec.rb
|
403
409
|
- spec/sitehub/http_headers_spec.rb
|
404
410
|
- spec/sitehub/identifier_spec.rb
|
405
|
-
- spec/sitehub/integration_spec.rb
|
406
411
|
- spec/sitehub/location_rewriter_spec.rb
|
407
412
|
- spec/sitehub/location_rewriters_spec.rb
|
408
413
|
- spec/sitehub/memoize_spec.rb
|
414
|
+
- spec/sitehub/middleware/candidate_route_mappings_spec.rb
|
409
415
|
- spec/sitehub/middleware/config_loader_spec.rb
|
410
416
|
- spec/sitehub/middleware/error_handling_spec.rb
|
411
417
|
- spec/sitehub/middleware/logging/access_logger_spec.rb
|
@@ -416,7 +422,6 @@ files:
|
|
416
422
|
- spec/sitehub/middleware/logging/request_log_spec.rb
|
417
423
|
- spec/sitehub/middleware/reverse_proxy_spec.rb
|
418
424
|
- spec/sitehub/middleware/route_spec.rb
|
419
|
-
- spec/sitehub/middleware/routes_spec.rb
|
420
425
|
- spec/sitehub/middleware/transaction_id_spec.rb
|
421
426
|
- spec/sitehub/middleware_spec.rb
|
422
427
|
- spec/sitehub/nil_location_rewriter_spec.rb
|
@@ -425,7 +430,6 @@ files:
|
|
425
430
|
- spec/sitehub/request_spec.rb
|
426
431
|
- spec/sitehub/resolver_spec.rb
|
427
432
|
- spec/sitehub/response_spec.rb
|
428
|
-
- spec/sitehub/route_builder_spec.rb
|
429
433
|
- spec/sitehub_spec.rb
|
430
434
|
- spec/spec_helper.rb
|
431
435
|
- spec/support/async.rb
|
@@ -1,40 +0,0 @@
|
|
1
|
-
require 'sitehub/cookie'
|
2
|
-
require 'sitehub/constants'
|
3
|
-
class SiteHub
|
4
|
-
# TODO: - change in to object and remove .reek exclusions for UtilityFunction
|
5
|
-
module CookieRewriting
|
6
|
-
ENDING_WITH_NEWLINE = /#{NEW_LINE}$/
|
7
|
-
|
8
|
-
def rewrite_cookies(headers, substitute_domain:)
|
9
|
-
cookies_hash = cookies_string_as_hash(headers[Constants::HttpHeaderKeys::SET_COOKIE])
|
10
|
-
|
11
|
-
cookies_hash.values.each do |cookie|
|
12
|
-
domain_attribute = cookie.find(:domain) || next
|
13
|
-
update_domain(domain_attribute, substitute_domain)
|
14
|
-
end
|
15
|
-
headers[Constants::HttpHeaderKeys::SET_COOKIE] = cookies_hash_to_string(cookies_hash)
|
16
|
-
end
|
17
|
-
|
18
|
-
def update_domain(domain_attribute, substitute_domain)
|
19
|
-
substitute = substitute_domain.dup
|
20
|
-
if domain_attribute.value.start_with?(FULL_STOP)
|
21
|
-
domain_attribute.update(substitute.prepend(FULL_STOP))
|
22
|
-
else
|
23
|
-
domain_attribute.update(substitute)
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
def cookies_hash_to_string(cookies_hash)
|
28
|
-
cookies_hash.values.inject(EMPTY_STRING.dup) do |cookie_string, cookie|
|
29
|
-
cookie_string << "#{cookie}#{NEW_LINE}"
|
30
|
-
end.sub(ENDING_WITH_NEWLINE, EMPTY_STRING)
|
31
|
-
end
|
32
|
-
|
33
|
-
def cookies_string_as_hash(cookie_string)
|
34
|
-
cookie_string.lines.each_with_object({}) do |cookie_line, cookies|
|
35
|
-
cookie = SiteHub::Cookie.new(cookie_line)
|
36
|
-
cookies[cookie.name] = cookie
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
@@ -1,66 +0,0 @@
|
|
1
|
-
require 'sitehub/cookie_rewriting'
|
2
|
-
|
3
|
-
class SiteHub
|
4
|
-
describe CookieRewriting do
|
5
|
-
include_context :module_spec
|
6
|
-
|
7
|
-
let(:downstream_domain) { '.downstream_domain.com' }
|
8
|
-
|
9
|
-
let(:request_mapping) do
|
10
|
-
RequestMapping.new(source_url: 'http://example.org',
|
11
|
-
mapped_url: "http://#{downstream_domain}",
|
12
|
-
mapped_path: '/map')
|
13
|
-
end
|
14
|
-
|
15
|
-
let(:substitute_domain) { URI(request_mapping.source_url).host }
|
16
|
-
let(:substitute_path) { '/path' }
|
17
|
-
let(:downstream_response) { Rack::Response.new }
|
18
|
-
let(:downstream_domain_cookie_name) { 'downstream.cookie' }
|
19
|
-
|
20
|
-
before do
|
21
|
-
downstream_response.set_cookie(downstream_domain_cookie_name, domain: downstream_domain, value: 'value')
|
22
|
-
downstream_response.set_cookie('downstream.cookie2', domain: downstream_domain, value: 'value2', httponly: true)
|
23
|
-
end
|
24
|
-
|
25
|
-
describe '#cookies_string_as_hash' do
|
26
|
-
it 'returns the string as a hash' do
|
27
|
-
cookie_header = downstream_response.headers['Set-Cookie']
|
28
|
-
|
29
|
-
cookie_strings = cookie_header.lines
|
30
|
-
first_cookie = SiteHub::Cookie.new(cookie_strings[0])
|
31
|
-
second_cookie = SiteHub::Cookie.new(cookie_strings[1])
|
32
|
-
expected = {
|
33
|
-
first_cookie.name => first_cookie,
|
34
|
-
second_cookie.name => second_cookie
|
35
|
-
}
|
36
|
-
result = subject.cookies_string_as_hash(cookie_header)
|
37
|
-
expect(result).to eq(expected)
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
describe '#cookies_hash_to_string' do
|
42
|
-
it 'returns the hash as a correctly formatted string' do
|
43
|
-
cookies_hash = subject.cookies_string_as_hash(downstream_response.headers['Set-Cookie'])
|
44
|
-
expect(subject.cookies_hash_to_string(cookies_hash)).to eq(downstream_response.headers['Set-Cookie'])
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
describe '#rewrite_cookies' do
|
49
|
-
context 'subdomain character present' do
|
50
|
-
it 'substitues the domain for the mapped domain' do
|
51
|
-
downstream_response.set_cookie(downstream_domain_cookie_name, domain: downstream_domain, value: 'value')
|
52
|
-
subject.rewrite_cookies(downstream_response.headers, substitute_domain: substitute_domain)
|
53
|
-
expect(downstream_response.cookies[downstream_domain_cookie_name][:domain]).to eq('.example.org')
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
context 'subdomain not character present' do
|
58
|
-
it 'substitues the domain for the mapped domain' do
|
59
|
-
downstream_response.set_cookie(downstream_domain_cookie_name, domain: 'downstream.com', value: 'value')
|
60
|
-
subject.rewrite_cookies(downstream_response.headers, substitute_domain: substitute_domain)
|
61
|
-
expect(downstream_response.cookies[downstream_domain_cookie_name][:domain]).to eq('example.org')
|
62
|
-
end
|
63
|
-
end
|
64
|
-
end
|
65
|
-
end
|
66
|
-
end
|
@@ -1,197 +0,0 @@
|
|
1
|
-
require 'async/middleware'
|
2
|
-
require 'stringio'
|
3
|
-
shared_context :site_hub do
|
4
|
-
let(:downstream_url) { 'http://localhost:12345' }
|
5
|
-
let(:experiment1_url) { "#{downstream_url}/experiment1" }
|
6
|
-
let(:experiment2_url) { "#{downstream_url}/experiment2" }
|
7
|
-
|
8
|
-
before do
|
9
|
-
WebMock.enable!
|
10
|
-
stub_request(:get, experiment1_url).to_return(body: 'experiment1_body')
|
11
|
-
stub_request(:get, experiment2_url).to_return(body: 'experiment2_body')
|
12
|
-
end
|
13
|
-
|
14
|
-
let(:builder) do
|
15
|
-
SiteHub::Builder.new.tap do |builder|
|
16
|
-
builder.access_logger StringIO.new
|
17
|
-
builder.error_logger StringIO.new
|
18
|
-
experiment1_url = experiment1_url()
|
19
|
-
experiment2_url = experiment2_url()
|
20
|
-
|
21
|
-
builder.proxy '/endpoint' do
|
22
|
-
split(label: :experiment1, percentage: 100) do
|
23
|
-
split percentage: 100, label: 'variant1', url: experiment1_url
|
24
|
-
end
|
25
|
-
|
26
|
-
split(label: :experiment2, percentage: 0) do
|
27
|
-
split percentage: 0, label: 'variant1', url: experiment2_url
|
28
|
-
split percentage: 100, label: 'variant2', url: experiment2_url
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
let(:rack_application) do
|
35
|
-
builder.build
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
describe 'proxying calls' do
|
40
|
-
include_context :site_hub
|
41
|
-
|
42
|
-
let(:app) { Async::Middleware.new(rack_application) }
|
43
|
-
describe 'supported HTTP verbs' do
|
44
|
-
%i(get post put delete).each do |verb|
|
45
|
-
it 'forwards the downstream' do
|
46
|
-
stub_request(verb, experiment1_url).to_return(body: 'hello')
|
47
|
-
send(verb, '/endpoint')
|
48
|
-
expect(app.last_response.body).to eq(['hello'])
|
49
|
-
end
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
describe 'route affinity' do
|
54
|
-
context 'requested route cookie not present' do
|
55
|
-
it 'drops a cookie to keep you on the same path' do
|
56
|
-
get('/endpoint')
|
57
|
-
expect(app.last_response.cookies[SiteHub::RECORDED_ROUTES_COOKIE][:value]).to eq('experiment1|variant1')
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
|
-
context 'requested route cookie present' do
|
62
|
-
it 'proxies to the preselected route' do
|
63
|
-
get('/endpoint', {}, 'HTTP_COOKIE' => "#{SiteHub::RECORDED_ROUTES_COOKIE}=experiment2|variant1")
|
64
|
-
expect(app.last_response.body).to eq(['experiment2_body'])
|
65
|
-
|
66
|
-
expect(app.last_response.cookies[SiteHub::RECORDED_ROUTES_COOKIE][:value]).to eq('experiment2|variant1')
|
67
|
-
end
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
|
-
# describe 'middleware' do
|
72
|
-
#
|
73
|
-
# include_context :middleware_test
|
74
|
-
#
|
75
|
-
# let(:app) { Async::Middleware.new(rack_application) }
|
76
|
-
#
|
77
|
-
# def middleware name
|
78
|
-
# create_middleware.tap do |clazz|
|
79
|
-
# clazz.class_eval do
|
80
|
-
# define_method :call do |env|
|
81
|
-
#
|
82
|
-
# callback = env['async.callback'] || env['async.orig_callback']
|
83
|
-
# env['async.orig_callback'] = env['async.callback'] = proc do |status, headers, body|
|
84
|
-
# body = body.body.join if body.is_a?(Rack::BodyProxy)
|
85
|
-
#
|
86
|
-
# callback.call(status, headers, "#{name}, #{body}")
|
87
|
-
# end
|
88
|
-
# @app.call(env)
|
89
|
-
# end
|
90
|
-
# end
|
91
|
-
# end
|
92
|
-
# end
|
93
|
-
#
|
94
|
-
# before do
|
95
|
-
# stub_request(:get, downstream_url).to_return(body: 'hello')
|
96
|
-
# end
|
97
|
-
#
|
98
|
-
# context 'middleware added to top level' do
|
99
|
-
# let(:builder) do
|
100
|
-
# middleware = middleware(:middleware1)
|
101
|
-
# downstream_url = downstream_url()
|
102
|
-
#
|
103
|
-
# SiteHub::Builder.new do
|
104
|
-
# access_logger StringIO.new
|
105
|
-
# use middleware
|
106
|
-
# proxy '/1' => downstream_url
|
107
|
-
# proxy '/2' => downstream_url
|
108
|
-
# end
|
109
|
-
# end
|
110
|
-
#
|
111
|
-
# it 'adds it to each route' do
|
112
|
-
# get('/1')
|
113
|
-
# expect(app.last_response.body.join).to eq('middleware1, hello')
|
114
|
-
# get('/2')
|
115
|
-
# expect(app.last_response.body.join).to eq('middleware1, hello')
|
116
|
-
# end
|
117
|
-
# end
|
118
|
-
#
|
119
|
-
# context 'middleware added to specific route' do
|
120
|
-
# let(:builder) do
|
121
|
-
# middleware = middleware(:middleware1)
|
122
|
-
# downstream_url = downstream_url()
|
123
|
-
#
|
124
|
-
# SiteHub::Builder.new do
|
125
|
-
# access_logger StringIO.new
|
126
|
-
# proxy '/1' do
|
127
|
-
# use middleware
|
128
|
-
# route label: :with_middleware, url: downstream_url
|
129
|
-
# end
|
130
|
-
# proxy '/2' => downstream_url
|
131
|
-
# end
|
132
|
-
# end
|
133
|
-
#
|
134
|
-
# it 'adds it to that route only' do
|
135
|
-
# get('/1')
|
136
|
-
# expect(app.last_response.body.join).to eq('middleware1, hello')
|
137
|
-
# get('/2')
|
138
|
-
# expect(app.last_response.body.join).to eq('hello')
|
139
|
-
# end
|
140
|
-
# end
|
141
|
-
#
|
142
|
-
# context 'base inherited middleware' do
|
143
|
-
# let(:builder) do
|
144
|
-
# middleware1 = middleware(:middleware1)
|
145
|
-
# middleware2 = middleware(:middleware2)
|
146
|
-
# downstream_url = downstream_url()
|
147
|
-
#
|
148
|
-
# SiteHub::Builder.new do
|
149
|
-
# access_logger StringIO.new
|
150
|
-
# use middleware1
|
151
|
-
# proxy '/1' do
|
152
|
-
# use middleware2
|
153
|
-
# route label: :with_middleware, url: downstream_url
|
154
|
-
# end
|
155
|
-
# proxy '/2' => downstream_url
|
156
|
-
# end
|
157
|
-
# end
|
158
|
-
#
|
159
|
-
# it 'adds it to that route only' do
|
160
|
-
# get('/1')
|
161
|
-
# expect(app.last_response.body.join).to eq('middleware1, middleware2, hello')
|
162
|
-
# get('/2')
|
163
|
-
# expect(app.last_response.body.join).to eq('middleware1, hello')
|
164
|
-
# end
|
165
|
-
# end
|
166
|
-
#
|
167
|
-
# context 'nested inherited middleware' do
|
168
|
-
# let(:builder) do
|
169
|
-
# middleware1 = middleware(:middleware1)
|
170
|
-
# middleware2 = middleware(:middleware2)
|
171
|
-
# downstream_url = downstream_url()
|
172
|
-
#
|
173
|
-
# SiteHub::Builder.new do
|
174
|
-
# access_logger StringIO.new
|
175
|
-
#
|
176
|
-
# proxy '/1' do
|
177
|
-
# split percentage: 100, label: :experiment1 do
|
178
|
-
# use middleware1
|
179
|
-
# split percentage: 100, label: :with_middleware do
|
180
|
-
# use middleware2
|
181
|
-
# split percentage: 100, label: :with_nested_middleware, url: downstream_url
|
182
|
-
# end
|
183
|
-
# end
|
184
|
-
# end
|
185
|
-
# proxy '/2' => downstream_url
|
186
|
-
# end
|
187
|
-
# end
|
188
|
-
#
|
189
|
-
# it 'adds it to that route only' do
|
190
|
-
# get('/1')
|
191
|
-
# expect(app.last_response.body.join).to eq('middleware1, middleware2, hello')
|
192
|
-
# get('/2')
|
193
|
-
# expect(app.last_response.body.join).to eq('middleware1, hello')
|
194
|
-
# end
|
195
|
-
# end
|
196
|
-
# end
|
197
|
-
end
|