sitehub 0.4.2 → 0.4.3
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/.rubocop.yml +17 -0
- data/Gemfile +0 -2
- data/Gemfile.lock +15 -1
- data/README.md +23 -0
- data/Rakefile +3 -9
- data/circle.yml +6 -0
- data/lib/sitehub/builder.rb +19 -19
- data/lib/sitehub/collection/route_collection.rb +7 -9
- data/lib/sitehub/collection/split_route_collection/split.rb +7 -5
- data/lib/sitehub/collection/split_route_collection.rb +13 -10
- data/lib/sitehub/collection.rb +26 -21
- data/lib/sitehub/constants/http_header_keys.rb +2 -6
- data/lib/sitehub/constants/rack_http_header_keys.rb +2 -2
- data/lib/sitehub/constants.rb +3 -3
- data/lib/sitehub/cookie/attribute.rb +4 -4
- data/lib/sitehub/cookie/flag.rb +4 -5
- data/lib/sitehub/cookie.rb +10 -14
- data/lib/sitehub/cookie_rewriting.rb +11 -13
- data/lib/sitehub/forward_proxies.rb +12 -13
- data/lib/sitehub/forward_proxy.rb +38 -24
- data/lib/sitehub/forward_proxy_builder.rb +38 -21
- data/lib/sitehub/http_headers.rb +39 -26
- data/lib/sitehub/logging/access_logger.rb +39 -35
- data/lib/sitehub/logging/error_logger.rb +7 -7
- data/lib/sitehub/logging/log_entry.rb +6 -5
- data/lib/sitehub/logging/log_stash.rb +2 -2
- data/lib/sitehub/logging/log_wrapper.rb +5 -5
- data/lib/sitehub/logging.rb +1 -1
- data/lib/sitehub/middleware.rb +2 -2
- data/lib/sitehub/path_directive.rb +10 -10
- data/lib/sitehub/path_directives.rb +5 -4
- data/lib/sitehub/request_mapping.rb +13 -11
- data/lib/sitehub/resolver.rb +5 -6
- data/lib/sitehub/reverse_proxy.rb +16 -12
- data/lib/sitehub/rules.rb +2 -2
- data/lib/sitehub/string_sanitiser.rb +1 -1
- data/lib/sitehub/transaction_id.rb +3 -3
- data/lib/sitehub/version.rb +1 -1
- data/lib/sitehub.rb +1 -1
- data/sitehub.gemspec +27 -29
- data/spec/sitehub/builder_spec.rb +18 -20
- data/spec/sitehub/collection/route_collection_spec.rb +16 -14
- data/spec/sitehub/collection/split_route_collection_spec.rb +8 -10
- data/spec/sitehub/collection_spec.rb +7 -7
- data/spec/sitehub/cookie/attribute_spec.rb +3 -3
- data/spec/sitehub/cookie/flag_spec.rb +2 -2
- data/spec/sitehub/cookie_rewriting_spec.rb +15 -12
- data/spec/sitehub/cookie_spec.rb +7 -18
- data/spec/sitehub/error_handling_spec.rb +2 -3
- data/spec/sitehub/forward_proxies_spec.rb +16 -12
- data/spec/sitehub/forward_proxy_builder_spec.rb +53 -30
- data/spec/sitehub/forward_proxy_spec.rb +26 -22
- data/spec/sitehub/http_headers_spec.rb +17 -18
- data/spec/sitehub/integration_spec.rb +4 -5
- data/spec/sitehub/logging/access_logger_spec.rb +25 -24
- data/spec/sitehub/logging/error_logger_spec.rb +5 -7
- data/spec/sitehub/logging/log_entry_spec.rb +2 -5
- data/spec/sitehub/logging/log_stash_spec.rb +1 -3
- data/spec/sitehub/logging/log_wrapper_spec.rb +0 -4
- data/spec/sitehub/middleware_spec.rb +1 -5
- data/spec/sitehub/path_directive_spec.rb +4 -7
- data/spec/sitehub/path_directives_spec.rb +6 -7
- data/spec/sitehub/request_mapping_spec.rb +2 -5
- data/spec/sitehub/resolver_spec.rb +1 -1
- data/spec/sitehub/reverse_proxy_spec.rb +37 -31
- data/spec/sitehub/transaction_id_spec.rb +3 -3
- data/spec/sitehub_spec.rb +2 -4
- data/spec/support/async/callback.rb +11 -0
- data/spec/support/async/middleware.rb +25 -0
- data/spec/support/async/response_handler.rb +16 -0
- data/spec/support/async.rb +4 -0
- data/spec/support/patch/rack/response.rb +13 -21
- data/spec/support/shared_contexts/async_context.rb +3 -58
- data/spec/support/shared_contexts/middleware_context.rb +15 -17
- data/spec/support/shared_contexts/rack_test_context.rb +3 -3
- data/spec/support/shared_contexts/sitehub_context.rb +9 -4
- data/spec/support/silent_warnings.rb +2 -3
- data/tasks/code_quality.rake +15 -0
- data/tasks/gem_tasks.rake +1 -0
- data/tasks/support/console.rb +7 -0
- data/tasks/testing.rake +4 -0
- data/tasks/util_tasks.rake +7 -0
- metadata +27 -3
- data/spec/basket_spec.rb +0 -30
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7a6e0a6953fd3b5d361c2e65e2b0b015a22a36b8
|
4
|
+
data.tar.gz: 76336ecd1253d8cf8e593e6bc67a1912b9fde469
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ecd3cd69815ab6d8755e222e0fbd17ee4b92f09472f67272da3b5f407be8b4a9954009d6b5563e7320ffda0db6b7b5aa8dce8e71e4d39e72f108fa5c522687d0
|
7
|
+
data.tar.gz: e17c0f2deb78badac60445ac189103bb193687ed073202edcf1e12282aaff4e22e77c7bc74596133f3b8d069796bcefda52a01b0d1b19368c8ce966ec9095b07
|
data/.rubocop.yml
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
Metrics/LineLength:
|
2
|
+
Max: 120
|
3
|
+
|
4
|
+
AllCops:
|
5
|
+
TargetRubyVersion: 2.1
|
6
|
+
Exclude:
|
7
|
+
- 'pkg/**/*'
|
8
|
+
- 'vendor/**/*'
|
9
|
+
- 'coverage/**/*'
|
10
|
+
- '.idea/**/*'
|
11
|
+
- '*.gemspec'
|
12
|
+
|
13
|
+
Style/Documentation:
|
14
|
+
Enabled: false
|
15
|
+
|
16
|
+
Metrics/MethodLength:
|
17
|
+
Max: 11
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
sitehub (0.4.
|
4
|
+
sitehub (0.4.3)
|
5
5
|
em-http-request
|
6
6
|
em-synchrony
|
7
7
|
faraday
|
@@ -15,6 +15,7 @@ GEM
|
|
15
15
|
remote: https://rubygems.org/
|
16
16
|
specs:
|
17
17
|
addressable (2.3.8)
|
18
|
+
ast (2.2.0)
|
18
19
|
builder (3.2.2)
|
19
20
|
cookiejar (0.3.0)
|
20
21
|
crack (0.4.3)
|
@@ -50,6 +51,9 @@ GEM
|
|
50
51
|
memory_profiler (0.9.6)
|
51
52
|
multipart-post (2.0.0)
|
52
53
|
nesty (1.0.2)
|
54
|
+
parser (2.3.1.0)
|
55
|
+
ast (~> 2.2)
|
56
|
+
powerpack (0.1.1)
|
53
57
|
rack (1.6.4)
|
54
58
|
rack-fiber_pool (0.9.3)
|
55
59
|
rack-protection (1.5.3)
|
@@ -57,6 +61,7 @@ GEM
|
|
57
61
|
rack-ssl-enforcer (0.2.9)
|
58
62
|
rack-test (0.6.3)
|
59
63
|
rack (>= 1.0)
|
64
|
+
rainbow (2.1.0)
|
60
65
|
rake (10.4.2)
|
61
66
|
rspec (3.2.0)
|
62
67
|
rspec-core (~> 3.2.0)
|
@@ -71,7 +76,14 @@ GEM
|
|
71
76
|
diff-lcs (>= 1.2.0, < 2.0)
|
72
77
|
rspec-support (~> 3.2.0)
|
73
78
|
rspec-support (3.2.2)
|
79
|
+
rubocop (0.40.0)
|
80
|
+
parser (>= 2.3.1.0, < 3.0)
|
81
|
+
powerpack (~> 0.1)
|
82
|
+
rainbow (>= 1.99.1, < 3.0)
|
83
|
+
ruby-progressbar (~> 1.7)
|
84
|
+
unicode-display_width (~> 1.0, >= 1.0.1)
|
74
85
|
ruby-prof (0.15.9)
|
86
|
+
ruby-progressbar (1.8.1)
|
75
87
|
safe_yaml (1.0.4)
|
76
88
|
simplecov (0.11.1)
|
77
89
|
docile (~> 1.1.0)
|
@@ -88,6 +100,7 @@ GEM
|
|
88
100
|
eventmachine (~> 1.0, >= 1.0.4)
|
89
101
|
rack (~> 1.0)
|
90
102
|
tilt (2.0.2)
|
103
|
+
unicode-display_width (1.0.5)
|
91
104
|
uuid (2.3.8)
|
92
105
|
macaddr (~> 1.0)
|
93
106
|
webmock (1.22.5)
|
@@ -105,6 +118,7 @@ DEPENDENCIES
|
|
105
118
|
rack-test
|
106
119
|
rake
|
107
120
|
rspec (~> 3.2.0)
|
121
|
+
rubocop
|
108
122
|
ruby-prof
|
109
123
|
simplecov
|
110
124
|
sitehub!
|
data/README.md
CHANGED
@@ -132,6 +132,29 @@ sitehub = SiteHub.build do
|
|
132
132
|
end
|
133
133
|
end
|
134
134
|
```
|
135
|
+
### Nesting routes and splits
|
136
|
+
Routes and Splits can themselves contain further route or split definitions
|
137
|
+
```ruby
|
138
|
+
sitehub = SiteHub.build do
|
139
|
+
proxy '/catalogue' do
|
140
|
+
# Experiment 1
|
141
|
+
split(precentage: 30) do
|
142
|
+
# 30% of overall traffic is split between 2 different prototypes
|
143
|
+
split percentage: 50, url: 'http://version1.com', label: :prototype_1
|
144
|
+
split percentage: 50, url: 'http://version2.com', label: :prototype_2
|
145
|
+
end
|
146
|
+
|
147
|
+
# Experiment 2
|
148
|
+
split(precentage: 30) do
|
149
|
+
# 30% of overall traffic is split between 2 different prototypes
|
150
|
+
split percentage: 50, url: 'http://version3.com', label: :prototype_3
|
151
|
+
split percentage: 50, url: 'http://version4.com', label: :prototype_4
|
152
|
+
end
|
153
|
+
|
154
|
+
default url: 'http://current_catalogue.com'
|
155
|
+
end
|
156
|
+
end
|
157
|
+
```
|
135
158
|
### Labels
|
136
159
|
Splits and Routes must be defined with a label. Within a proxy defintion, this label must be unique. This is the value that SiteHub will use to identify the version of a downstream url that a user should stick to once it has been selected.
|
137
160
|
|
data/Rakefile
CHANGED
@@ -1,11 +1,5 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
require 'rspec/core/rake_task'
|
5
|
-
|
6
|
-
|
7
|
-
RSpec::Core::RakeTask.new(:spec) do
|
8
|
-
ENV['coverage'] = 'true'
|
1
|
+
Dir["#{__dir__}/tasks/*.rake"].each do |tasks|
|
2
|
+
import tasks
|
9
3
|
end
|
10
4
|
|
11
|
-
task :
|
5
|
+
task default: [:clean, :spec, :coverage_check, 'rubocop:auto_correct', 'rubocop']
|
data/circle.yml
ADDED
data/lib/sitehub/builder.rb
CHANGED
@@ -8,18 +8,15 @@ require 'sitehub/logging'
|
|
8
8
|
require 'rack/fiber_pool'
|
9
9
|
require 'logger'
|
10
10
|
|
11
|
-
|
12
11
|
class SiteHub
|
13
|
-
|
14
|
-
class InvalidProxyDefinitionException < Exception;
|
12
|
+
class InvalidProxyDefinitionException < Exception
|
15
13
|
end
|
16
14
|
class Builder
|
17
|
-
|
18
15
|
attr_reader :sitehub, :forward_proxies, :reverse_proxies
|
19
16
|
|
20
17
|
include Middleware
|
21
18
|
|
22
|
-
def force_ssl
|
19
|
+
def force_ssl(except: [])
|
23
20
|
@force_ssl = true
|
24
21
|
@ssl_exclusions = except
|
25
22
|
end
|
@@ -27,20 +24,20 @@ class SiteHub
|
|
27
24
|
def initialize(&block)
|
28
25
|
@forward_proxies = ForwardProxies.new
|
29
26
|
@reverse_proxies = {}
|
30
|
-
instance_eval
|
27
|
+
instance_eval(&block) if block
|
31
28
|
end
|
32
29
|
|
33
|
-
def access_logger
|
30
|
+
def access_logger(logger = nil)
|
34
31
|
return @access_logger unless logger
|
35
32
|
@access_logger = logger
|
36
33
|
end
|
37
34
|
|
38
|
-
def error_logger
|
35
|
+
def error_logger(logger = nil)
|
39
36
|
return @error_logger unless logger
|
40
37
|
@error_logger = logger
|
41
38
|
end
|
42
39
|
|
43
|
-
def sitehub_cookie_name
|
40
|
+
def sitehub_cookie_name(name = nil)
|
44
41
|
@sitehub_cookie_name ||= RECORDED_ROUTES_COOKIE
|
45
42
|
|
46
43
|
return @sitehub_cookie_name unless name
|
@@ -49,34 +46,37 @@ class SiteHub
|
|
49
46
|
|
50
47
|
def build
|
51
48
|
forward_proxies.init
|
49
|
+
add_default_middleware
|
50
|
+
middlewares.reverse!
|
51
|
+
apply_middleware(forward_proxies)
|
52
|
+
end
|
53
|
+
|
54
|
+
def add_default_middleware
|
52
55
|
use ReverseProxy, reverse_proxies
|
53
56
|
use TransactionId
|
54
57
|
use Logging::AccessLogger, access_logger || ::Logger.new(STDOUT)
|
55
58
|
use Logging::ErrorLogger, error_logger || ::Logger.new(STDERR)
|
56
59
|
use Rack::FiberPool
|
57
60
|
use Rack::SslEnforcer, except: @ssl_exclusions if @force_ssl
|
58
|
-
middlewares.reverse!
|
59
|
-
|
60
|
-
apply_middleware(forward_proxies)
|
61
61
|
end
|
62
62
|
|
63
|
-
def proxy
|
64
|
-
args = {sitehub_cookie_name: sitehub_cookie_name}
|
63
|
+
def proxy(opts = {}, &block)
|
64
|
+
args = { sitehub_cookie_name: sitehub_cookie_name }
|
65
65
|
|
66
66
|
if opts.is_a?(Hash)
|
67
67
|
mapped_path = opts.keys.first
|
68
68
|
url = opts.values.first
|
69
|
-
args
|
69
|
+
args[:url] = url
|
70
|
+
args[:mapped_path] = mapped_path
|
70
71
|
else
|
71
|
-
args
|
72
|
+
args[:mapped_path] = opts
|
72
73
|
end
|
73
74
|
|
74
75
|
forward_proxies << ForwardProxyBuilder.new(args, &block)
|
75
76
|
end
|
76
77
|
|
77
|
-
def reverse_proxy
|
78
|
+
def reverse_proxy(hash)
|
78
79
|
reverse_proxies.merge!(hash)
|
79
80
|
end
|
80
81
|
end
|
81
|
-
|
82
|
-
end
|
82
|
+
end
|
@@ -2,27 +2,25 @@ require_relative '../collection'
|
|
2
2
|
class SiteHub
|
3
3
|
class Collection < Hash
|
4
4
|
class RouteCollection < Collection
|
5
|
-
|
6
|
-
def add id, route, *opts
|
5
|
+
def add(id, route, *_opts)
|
7
6
|
self[id] = route
|
8
7
|
end
|
9
8
|
|
10
9
|
def valid?
|
11
|
-
!
|
10
|
+
!empty?
|
12
11
|
end
|
13
12
|
|
14
13
|
def resolve(env: nil)
|
15
|
-
return
|
16
|
-
result =
|
14
|
+
return values.first unless values.find(&:rule)
|
15
|
+
result = values.find { |route| route.applies?(env) }
|
17
16
|
result && result.resolve(env: env)
|
18
17
|
end
|
19
18
|
|
20
|
-
def transform
|
21
|
-
each
|
22
|
-
self[id] =
|
19
|
+
def transform
|
20
|
+
each do |id, value|
|
21
|
+
self[id] = yield(value)
|
23
22
|
end
|
24
23
|
end
|
25
|
-
|
26
24
|
end
|
27
25
|
end
|
28
26
|
end
|
@@ -5,14 +5,16 @@ class SiteHub
|
|
5
5
|
attr_reader :upper, :lower
|
6
6
|
attr_accessor :value
|
7
7
|
|
8
|
-
def initialize
|
9
|
-
@upper
|
8
|
+
def initialize(lower, upper, value)
|
9
|
+
@upper = upper
|
10
|
+
@lower = lower
|
11
|
+
@value = value
|
10
12
|
end
|
11
13
|
|
12
|
-
def ==
|
13
|
-
other.is_a?(Split) && other.lower ==
|
14
|
+
def ==(other)
|
15
|
+
other.is_a?(Split) && other.lower == lower && other.upper == upper
|
14
16
|
end
|
15
17
|
end
|
16
18
|
end
|
17
19
|
end
|
18
|
-
end
|
20
|
+
end
|
@@ -3,38 +3,41 @@ require_relative 'split_route_collection/split'
|
|
3
3
|
class SiteHub
|
4
4
|
class Collection < Hash
|
5
5
|
class SplitRouteCollection < Collection
|
6
|
-
class InvalidSplitException < Exception
|
6
|
+
class InvalidSplitException < Exception
|
7
7
|
end
|
8
8
|
|
9
|
-
|
9
|
+
FIXNUM_ERR_MSG = 'splits must be a Fixnum'.freeze
|
10
|
+
SPLIT_ERR_MSG = 'total split percentages can not be greater than 100%'.freeze
|
11
|
+
|
12
|
+
def initialize(hash = {})
|
10
13
|
hash.each do |value, percentage|
|
11
14
|
add(value.id, value, percentage)
|
12
15
|
end
|
13
16
|
end
|
14
17
|
|
15
|
-
def add
|
16
|
-
raise InvalidSplitException,
|
18
|
+
def add(id, value, percentage)
|
19
|
+
raise InvalidSplitException, FIXNUM_ERR_MSG unless percentage.is_a?(Fixnum)
|
17
20
|
lower = values.last ? values.last.upper : 0
|
18
21
|
upper = lower + percentage
|
19
22
|
|
20
|
-
raise InvalidSplitException,
|
23
|
+
raise InvalidSplitException, SPLIT_ERR_MSG if upper > 100
|
21
24
|
self[id] = Split.new(lower, upper, value)
|
22
25
|
end
|
23
26
|
|
24
27
|
def resolve(*args)
|
25
28
|
random = rand(100)
|
26
29
|
result = values.find { |split| random >= split.lower && random < split.upper }
|
27
|
-
result ? result.value : nil
|
30
|
+
result ? result.value.resolve(*args) : nil
|
28
31
|
end
|
29
32
|
|
30
|
-
def transform
|
33
|
+
def transform
|
31
34
|
values.each do |split|
|
32
|
-
split.value =
|
35
|
+
split.value = yield(split.value)
|
33
36
|
end
|
34
37
|
end
|
35
38
|
|
36
|
-
def []
|
37
|
-
result = super
|
39
|
+
def [](key)
|
40
|
+
result = super(key)
|
38
41
|
result && result.value
|
39
42
|
end
|
40
43
|
|
data/lib/sitehub/collection.rb
CHANGED
@@ -1,35 +1,40 @@
|
|
1
1
|
class SiteHub
|
2
2
|
class Collection < Hash
|
3
|
-
class DuplicateVersionException < Exception
|
3
|
+
class DuplicateVersionException < Exception
|
4
|
+
end
|
5
|
+
|
6
|
+
module ClassMethods
|
7
|
+
def overrides
|
8
|
+
@overrides ||= []
|
9
|
+
end
|
10
|
+
|
11
|
+
UNIQUE_LABELS_MSG = 'supply unique labels'.freeze
|
12
|
+
|
13
|
+
def method_added(name)
|
14
|
+
if name == :add && !overrides.include?(name)
|
15
|
+
overrides << name
|
16
|
+
alias_method :add_backup, :add
|
17
|
+
|
18
|
+
send(:define_method, :add) do |id, value, *args|
|
19
|
+
raise DuplicateVersionException, UNIQUE_LABELS_MSG if self[id]
|
20
|
+
add_backup id, value, *args
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
4
24
|
end
|
5
25
|
|
6
26
|
def valid?
|
7
|
-
raise
|
27
|
+
raise 'implement me'
|
8
28
|
end
|
9
29
|
|
10
30
|
def resolve
|
11
|
-
raise
|
31
|
+
raise 'implement me'
|
12
32
|
end
|
13
33
|
|
14
34
|
class << self
|
15
|
-
def inherited
|
16
|
-
|
17
|
-
def clazz.overrides
|
18
|
-
@overrides ||=[]
|
19
|
-
end
|
20
|
-
|
21
|
-
def clazz.method_added(name)
|
22
|
-
if name == :add && !overrides.include?(name)
|
23
|
-
overrides << name
|
24
|
-
alias_method :add_backup, :add
|
25
|
-
|
26
|
-
self.send(:define_method, :add) do |id, value, *args|
|
27
|
-
raise DuplicateVersionException, 'supply unique labels' if self[id]
|
28
|
-
add_backup id, value, *args
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
35
|
+
def inherited(clazz)
|
36
|
+
clazz.extend(ClassMethods)
|
32
37
|
end
|
33
38
|
end
|
34
39
|
end
|
35
|
-
end
|
40
|
+
end
|
@@ -1,9 +1,7 @@
|
|
1
1
|
class SiteHub
|
2
2
|
module Constants
|
3
3
|
module HttpHeaderKeys
|
4
|
-
|
5
|
-
ShouldNotTransfer = %w(proxy-connection).freeze
|
6
|
-
|
4
|
+
PROXY_CONNECTION = 'proxy-connection'.freeze
|
7
5
|
LOCATION_HEADER = 'location'.freeze
|
8
6
|
HOST_HEADER = 'host'.freeze
|
9
7
|
X_FORWARDED_HOST_HEADER = 'x-forwarded-host'.freeze
|
@@ -18,8 +16,6 @@ class SiteHub
|
|
18
16
|
CONTENT_ENCODING = 'content-encoding'.freeze
|
19
17
|
SET_COOKIE = 'Set-Cookie'.freeze
|
20
18
|
CONTENT_LENGTH = 'Content-Length'.freeze
|
21
|
-
|
22
|
-
HopByHop = [CONNECTION_HEADER, KEEP_ALIVE, PROXY_AUTHENTICATE, PROXY_AUTHORIZATION, TE, TRAILERS, TRANSFER_ENCODING, CONTENT_ENCODING].freeze
|
23
19
|
end
|
24
20
|
end
|
25
|
-
end
|
21
|
+
end
|
@@ -9,9 +9,9 @@ class SiteHub
|
|
9
9
|
REMOTE_ADDR = 'REMOTE_ADDR'.freeze
|
10
10
|
REMOTE_USER = 'REMOTE_USER'.freeze
|
11
11
|
HTTP_VERSION = 'HTTP_VERSION'.freeze
|
12
|
-
REMOTE_ADDRESS_ENV_KEY =
|
12
|
+
REMOTE_ADDRESS_ENV_KEY = 'REMOTE_ADDR'.freeze
|
13
13
|
HTTP_HEADER_FILTER_EXCEPTIONS = %w(CONTENT_TYPE CONTENT_LENGTH).freeze
|
14
14
|
TRANSACTION_ID = 'HTTP_SITEHUB_TRANSACTION_ID'.freeze
|
15
15
|
end
|
16
16
|
end
|
17
|
-
end
|
17
|
+
end
|
data/lib/sitehub/constants.rb
CHANGED
@@ -7,17 +7,17 @@ class SiteHub
|
|
7
7
|
ASYNC_CALLBACK = 'async.callback'.freeze
|
8
8
|
RECORDED_ROUTES_COOKIE = 'sitehub.recorded_route'.freeze
|
9
9
|
ERRORS = 'sitehub.errors'.freeze
|
10
|
-
TIME_STAMP_FORMAT =
|
10
|
+
TIME_STAMP_FORMAT = '%d/%b/%Y:%H:%M:%S %z'.freeze
|
11
11
|
EMPTY_STRING = ''.freeze
|
12
12
|
UNDERSCORE = '_'.freeze
|
13
13
|
SEMICOLON = ';'.freeze
|
14
14
|
SPACE = ' '.freeze
|
15
15
|
SEMICOLON_WITH_SPACE = "#{SEMICOLON}#{SPACE}".freeze
|
16
|
-
COMMA_WITH_SPACE =
|
16
|
+
COMMA_WITH_SPACE = ', '.freeze
|
17
17
|
|
18
18
|
HYPHEN = '-'.freeze
|
19
19
|
QUESTION_MARK = '?'.freeze
|
20
20
|
EQUALS_SIGN = '='.freeze
|
21
21
|
FULL_STOP = '.'.freeze
|
22
22
|
NEW_LINE = "\n".freeze
|
23
|
-
end
|
23
|
+
end
|
@@ -5,7 +5,7 @@ class SiteHub
|
|
5
5
|
include StringSanitiser
|
6
6
|
attr_accessor :name, :value
|
7
7
|
|
8
|
-
def initialize
|
8
|
+
def initialize(name, value)
|
9
9
|
@name = sanitise(name).to_s.to_sym
|
10
10
|
@value = sanitise(value || EMPTY_STRING)
|
11
11
|
end
|
@@ -14,9 +14,9 @@ class SiteHub
|
|
14
14
|
"#{name}=#{value}"
|
15
15
|
end
|
16
16
|
|
17
|
-
def ==
|
18
|
-
other.is_a?(Attribute) &&
|
17
|
+
def ==(other)
|
18
|
+
other.is_a?(Attribute) && name == other.name && value == other.value
|
19
19
|
end
|
20
20
|
end
|
21
21
|
end
|
22
|
-
end
|
22
|
+
end
|
data/lib/sitehub/cookie/flag.rb
CHANGED
@@ -5,7 +5,7 @@ class SiteHub
|
|
5
5
|
include StringSanitiser
|
6
6
|
attr_accessor :name
|
7
7
|
|
8
|
-
def initialize
|
8
|
+
def initialize(flag)
|
9
9
|
@name = sanitise(flag).to_sym
|
10
10
|
end
|
11
11
|
|
@@ -13,10 +13,9 @@ class SiteHub
|
|
13
13
|
name.to_s
|
14
14
|
end
|
15
15
|
|
16
|
-
def ==
|
17
|
-
other.is_a?(Flag) &&
|
16
|
+
def ==(other)
|
17
|
+
other.is_a?(Flag) && name == other.name
|
18
18
|
end
|
19
19
|
end
|
20
|
-
|
21
20
|
end
|
22
|
-
end
|
21
|
+
end
|
data/lib/sitehub/cookie.rb
CHANGED
@@ -8,8 +8,7 @@ class SiteHub
|
|
8
8
|
|
9
9
|
FIRST = 0
|
10
10
|
|
11
|
-
def initialize
|
12
|
-
@attributes_and_flags =[]
|
11
|
+
def initialize(cookie_string)
|
13
12
|
pairs = cookie_string.split(SEMICOLON).map do |entry|
|
14
13
|
if entry.include?(EQUALS_SIGN)
|
15
14
|
Cookie::Attribute.new(*entry.split(EQUALS_SIGN))
|
@@ -19,9 +18,8 @@ class SiteHub
|
|
19
18
|
end
|
20
19
|
|
21
20
|
name_attribute = pairs.delete_at(FIRST)
|
22
|
-
attributes_and_flags
|
21
|
+
@attributes_and_flags = pairs
|
23
22
|
@name_attribute = Cookie::Attribute.new(name_attribute.name.to_s, name_attribute.value)
|
24
|
-
|
25
23
|
end
|
26
24
|
|
27
25
|
def name
|
@@ -32,23 +30,21 @@ class SiteHub
|
|
32
30
|
name_attribute.value
|
33
31
|
end
|
34
32
|
|
35
|
-
def find
|
36
|
-
attributes_and_flags.find{|entry| entry.name == name}
|
33
|
+
def find(name)
|
34
|
+
attributes_and_flags.find { |entry| entry.name == name }
|
37
35
|
end
|
38
36
|
|
39
|
-
def
|
40
|
-
|
41
|
-
|
42
|
-
entry
|
37
|
+
def ==(other)
|
38
|
+
other.is_a?(self.class) &&
|
39
|
+
sorted_attributes_and_flags(attributes_and_flags) == sorted_attributes_and_flags(other.attributes_and_flags)
|
43
40
|
end
|
44
41
|
|
45
|
-
def
|
46
|
-
|
42
|
+
def sorted_attributes_and_flags(attributes_and_flags)
|
43
|
+
attributes_and_flags.sort { |entry1, entry2| entry1.name <=> entry2.name }
|
47
44
|
end
|
48
45
|
|
49
46
|
def to_s
|
50
47
|
[name_attribute].concat(attributes_and_flags).join(SEMICOLON_WITH_SPACE)
|
51
48
|
end
|
52
|
-
|
53
49
|
end
|
54
|
-
end
|
50
|
+
end
|
@@ -1,35 +1,33 @@
|
|
1
1
|
require 'sitehub/cookie'
|
2
2
|
require 'sitehub/constants'
|
3
3
|
class SiteHub
|
4
|
-
|
5
4
|
module CookieRewriting
|
6
|
-
|
7
5
|
ENDING_WITH_NEWLINE = /#{NEW_LINE}$/
|
8
6
|
|
9
7
|
def rewrite_cookies(headers, substitute_domain:)
|
10
8
|
cookies_hash = cookies_string_as_hash(headers[Constants::HttpHeaderKeys::SET_COOKIE])
|
11
9
|
|
12
10
|
cookies_hash.values.each do |cookie|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
end
|
11
|
+
domain_attribute = cookie.find(:domain) || next
|
12
|
+
value = domain_attribute.value
|
13
|
+
domain_attribute.value = substitute_domain.dup
|
14
|
+
domain_attribute.value.prepend(FULL_STOP) if value.start_with?(FULL_STOP)
|
18
15
|
end
|
19
16
|
headers[HttpHeaders::SET_COOKIE] = cookies_hash_to_string(cookies_hash)
|
20
17
|
end
|
21
18
|
|
22
|
-
def cookies_hash_to_string
|
19
|
+
def cookies_hash_to_string(cookies_hash)
|
23
20
|
cookies_hash.values.inject(EMPTY_STRING.dup) do |cookie_string, cookie|
|
24
|
-
cookie_string << "#{cookie
|
21
|
+
cookie_string << "#{cookie}#{NEW_LINE}"
|
25
22
|
end.sub(ENDING_WITH_NEWLINE, EMPTY_STRING)
|
26
23
|
end
|
27
24
|
|
28
|
-
def cookies_string_as_hash
|
29
|
-
cookie_string.lines.
|
25
|
+
def cookies_string_as_hash(cookie_string)
|
26
|
+
cookie_string.lines.each_with_object({}) do |cookie_line, cookies|
|
30
27
|
cookie = SiteHub::Cookie.new(cookie_line)
|
31
|
-
cookies[cookie.name] = cookie
|
28
|
+
cookies[cookie.name] = cookie
|
29
|
+
cookies
|
32
30
|
end
|
33
31
|
end
|
34
32
|
end
|
35
|
-
end
|
33
|
+
end
|