sitehub 0.4.3 → 0.4.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.codeclimate.yml +31 -0
- data/.gitignore +2 -1
- data/.reek +41 -0
- data/.simplecov +7 -0
- data/Gemfile.lock +61 -33
- data/README.md +4 -0
- data/Rakefile +1 -1
- data/circle.yml +1 -1
- data/lib/sitehub/builder.rb +19 -36
- data/lib/sitehub/collection/split_route_collection.rb +18 -13
- data/lib/sitehub/collection/split_route_collection/split.rb +6 -4
- data/lib/sitehub/constants.rb +2 -1
- data/lib/sitehub/constants/http_header_keys.rb +2 -0
- data/lib/sitehub/constants/rack_http_header_keys.rb +2 -0
- data/lib/sitehub/cookie.rb +4 -13
- data/lib/sitehub/cookie/attribute.rb +10 -9
- data/lib/sitehub/cookie/flag.rb +5 -8
- data/lib/sitehub/cookie_rewriting.rb +12 -5
- data/lib/sitehub/downstream_client.rb +37 -0
- data/lib/sitehub/equality.rb +28 -0
- data/lib/sitehub/forward_proxy.rb +19 -62
- data/lib/sitehub/forward_proxy_builder.rb +70 -49
- data/lib/sitehub/getter_setter_methods.rb +21 -0
- data/lib/sitehub/http_headers.rb +45 -48
- data/lib/sitehub/location_rewriter.rb +29 -0
- data/lib/sitehub/location_rewriters.rb +23 -0
- data/lib/sitehub/memoize.rb +25 -0
- data/lib/sitehub/middleware.rb +16 -6
- data/lib/sitehub/middleware/error_handling.rb +20 -0
- data/lib/sitehub/middleware/forward_proxies.rb +54 -0
- data/lib/sitehub/{logging.rb → middleware/logging.rb} +0 -0
- data/lib/sitehub/middleware/logging/access_logger.rb +36 -0
- data/lib/sitehub/middleware/logging/error_logger.rb +38 -0
- data/lib/sitehub/middleware/logging/log_entry.rb +16 -0
- data/lib/sitehub/middleware/logging/log_stash.rb +12 -0
- data/lib/sitehub/middleware/logging/log_wrapper.rb +24 -0
- data/lib/sitehub/middleware/logging/request_log.rb +74 -0
- data/lib/sitehub/middleware/reverse_proxy.rb +37 -0
- data/lib/sitehub/middleware/transaction_id.rb +18 -0
- data/lib/sitehub/nil_location_rewriter.rb +7 -0
- data/lib/sitehub/nil_proxy.rb +11 -0
- data/lib/sitehub/request.rb +101 -0
- data/lib/sitehub/request_mapping.rb +16 -18
- data/lib/sitehub/resolver.rb +1 -1
- data/lib/sitehub/response.rb +10 -0
- data/lib/sitehub/string_utils.rb +13 -0
- data/lib/sitehub/version.rb +1 -1
- data/sitehub.gemspec +4 -1
- data/spec/equality_spec.rb +32 -0
- data/spec/sitehub/builder_spec.rb +29 -22
- data/spec/sitehub/collection/route_collection_spec.rb +15 -14
- data/spec/sitehub/collection/split_route_collection/split_spec.rb +26 -0
- data/spec/sitehub/collection/split_route_collection_spec.rb +15 -3
- data/spec/sitehub/cookie/flag_spec.rb +1 -1
- data/spec/sitehub/cookie_rewriting_spec.rb +6 -10
- data/spec/sitehub/downstream_client_spec.rb +72 -0
- data/spec/sitehub/equality_spec.rb +32 -0
- data/spec/sitehub/forward_proxy_builder_spec.rb +92 -55
- data/spec/sitehub/forward_proxy_spec.rb +29 -97
- data/spec/sitehub/http_headers_spec.rb +32 -52
- data/spec/sitehub/integration_spec.rb +1 -1
- data/spec/sitehub/location_rewriter_spec.rb +46 -0
- data/spec/sitehub/{path_directives_spec.rb → location_rewriters_spec.rb} +8 -8
- data/spec/sitehub/memoize_spec.rb +56 -0
- data/spec/sitehub/middleware/error_handling_spec.rb +34 -0
- data/spec/sitehub/middleware/forward_proxies_spec.rb +105 -0
- data/spec/sitehub/middleware/logging/access_logger_spec.rb +51 -0
- data/spec/sitehub/middleware/logging/error_logger_spec.rb +84 -0
- data/spec/sitehub/middleware/logging/log_entry_spec.rb +33 -0
- data/spec/sitehub/middleware/logging/log_stash_spec.rb +21 -0
- data/spec/sitehub/middleware/logging/log_wrapper_spec.rb +31 -0
- data/spec/sitehub/middleware/logging/request_log_spec.rb +108 -0
- data/spec/sitehub/middleware/reverse_proxy_spec.rb +113 -0
- data/spec/sitehub/middleware/transaction_id_spec.rb +30 -0
- data/spec/sitehub/middleware_spec.rb +23 -13
- data/spec/sitehub/nil_location_rewriter_spec.rb +10 -0
- data/spec/sitehub/nil_proxy_spec.rb +14 -0
- data/spec/sitehub/request_mapping_spec.rb +21 -23
- data/spec/sitehub/request_spec.rb +228 -0
- data/spec/sitehub/resolver_spec.rb +2 -5
- data/spec/sitehub/response_spec.rb +30 -0
- data/spec/spec_helper.rb +12 -6
- data/spec/support/async/middleware.rb +1 -0
- data/spec/support/patch/rack/response.rb +7 -5
- data/spec/support/shared_contexts.rb +3 -0
- data/spec/support/shared_contexts/http_proxy_rules_context.rb +36 -0
- data/spec/support/shared_contexts/middleware_context.rb +6 -6
- data/spec/support/shared_contexts/module_spec_context.rb +7 -0
- data/spec/support/shared_contexts/rack_request_context.rb +18 -0
- data/spec/support/shared_contexts/rack_test_context.rb +0 -1
- data/spec/support/shared_examples.rb +3 -0
- data/spec/support/shared_examples/memoized_helpers.rb +7 -0
- data/spec/support/shared_examples/prohibited_http_header_filter.rb +16 -0
- data/spec/support/silent_warnings.rb +1 -1
- data/tasks/code_quality.rake +6 -0
- metadata +99 -29
- data/lib/sitehub/forward_proxies.rb +0 -49
- data/lib/sitehub/logging/access_logger.rb +0 -78
- data/lib/sitehub/logging/error_logger.rb +0 -36
- data/lib/sitehub/logging/log_entry.rb +0 -15
- data/lib/sitehub/logging/log_stash.rb +0 -10
- data/lib/sitehub/logging/log_wrapper.rb +0 -23
- data/lib/sitehub/path_directive.rb +0 -32
- data/lib/sitehub/path_directives.rb +0 -22
- data/lib/sitehub/reverse_proxy.rb +0 -57
- data/lib/sitehub/string_sanitiser.rb +0 -7
- data/lib/sitehub/transaction_id.rb +0 -16
- data/spec/sitehub/error_handling_spec.rb +0 -20
- data/spec/sitehub/forward_proxies_spec.rb +0 -103
- data/spec/sitehub/logging/access_logger_spec.rb +0 -128
- data/spec/sitehub/logging/error_logger_spec.rb +0 -78
- data/spec/sitehub/logging/log_entry_spec.rb +0 -31
- data/spec/sitehub/logging/log_stash_spec.rb +0 -19
- data/spec/sitehub/logging/log_wrapper_spec.rb +0 -29
- data/spec/sitehub/path_directive_spec.rb +0 -47
- data/spec/sitehub/reverse_proxy_spec.rb +0 -111
- data/spec/sitehub/transaction_id_spec.rb +0 -28
- data/spec/support/async/response_handler.rb +0 -16
- data/spec/support/shared_contexts/async_context.rb +0 -14
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fb7cd90f333ade307a9dd901fb5922709263f78a
|
4
|
+
data.tar.gz: f843541b0caa8a76238aa299158c84a12616bfd8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0f0ea72647bbab0b92f166ade2d2f48eb6621c335bcc0c8ac711017dbb24540e40ced8327e7e67204f5a40439e318b840a27d76bdc30cb5eb73eb1b3a381be33
|
7
|
+
data.tar.gz: cafdd5cae62c9a8036adc64a7ab567ede50ef287f25983039374dd7bca7b9db3da7cffbd2d4d3fb8d9e8e0575d7962d462b2534f054d583823da361136777317
|
data/.codeclimate.yml
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
---
|
2
|
+
engines:
|
3
|
+
bundler-audit:
|
4
|
+
enabled: true
|
5
|
+
duplication:
|
6
|
+
enabled: true
|
7
|
+
config:
|
8
|
+
languages:
|
9
|
+
- ruby
|
10
|
+
- javascript
|
11
|
+
- python
|
12
|
+
- php
|
13
|
+
fixme:
|
14
|
+
enabled: true
|
15
|
+
rubocop:
|
16
|
+
enabled: true
|
17
|
+
reek:
|
18
|
+
enabled: true
|
19
|
+
ratings:
|
20
|
+
paths:
|
21
|
+
- Gemfile.lock
|
22
|
+
- "**.inc"
|
23
|
+
- "**.js"
|
24
|
+
- "**.jsx"
|
25
|
+
- "**.module"
|
26
|
+
- "**.php"
|
27
|
+
- "**.py"
|
28
|
+
- "**.rb"
|
29
|
+
- "**.rake"
|
30
|
+
exclude_paths:
|
31
|
+
- spec/
|
data/.gitignore
CHANGED
data/.reek
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
---
|
2
|
+
IrresponsibleModule:
|
3
|
+
enabled: false
|
4
|
+
|
5
|
+
UtilityFunction:
|
6
|
+
exclude:
|
7
|
+
- NilProxy
|
8
|
+
- collect_middleware
|
9
|
+
- env_for
|
10
|
+
- "Rack::Response#cookie_data"
|
11
|
+
- 'SiteHub::CookieRewriting'
|
12
|
+
- format_as_rack_header_name
|
13
|
+
|
14
|
+
TooManyStatements:
|
15
|
+
enabled: true
|
16
|
+
exclude:
|
17
|
+
- "Builder#add_default_middleware"
|
18
|
+
- "ForwardProxy#initialize"
|
19
|
+
- "SiteHub::ForwardProxyBuilder#initialize"
|
20
|
+
|
21
|
+
FeatureEnvy:
|
22
|
+
exclude:
|
23
|
+
- "SiteHub::DownstreamClient#call"
|
24
|
+
- "SiteHub::LocationRewriters"
|
25
|
+
- 'Rack::Response#cookies'
|
26
|
+
- 'format_http_to_rack_headers'
|
27
|
+
|
28
|
+
TooManyMethods:
|
29
|
+
exclude:
|
30
|
+
- "SiteHub::Request"
|
31
|
+
LongParameterList:
|
32
|
+
exclude:
|
33
|
+
- env_for
|
34
|
+
- "SiteHub::ForwardProxy#initialize"
|
35
|
+
|
36
|
+
TooManyInstanceVariables:
|
37
|
+
exclude:
|
38
|
+
- ForwardProxyBuilder
|
39
|
+
- "SiteHub::Request"
|
40
|
+
- "SiteHub::ForwardProxy"
|
41
|
+
|
data/.simplecov
ADDED
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.6)
|
5
5
|
em-http-request
|
6
6
|
em-synchrony
|
7
7
|
faraday
|
@@ -14,44 +14,58 @@ PATH
|
|
14
14
|
GEM
|
15
15
|
remote: https://rubygems.org/
|
16
16
|
specs:
|
17
|
-
addressable (2.
|
18
|
-
ast (2.
|
17
|
+
addressable (2.4.0)
|
18
|
+
ast (2.3.0)
|
19
|
+
axiom-types (0.1.1)
|
20
|
+
descendants_tracker (~> 0.0.4)
|
21
|
+
ice_nine (~> 0.11.0)
|
22
|
+
thread_safe (~> 0.3, >= 0.3.1)
|
19
23
|
builder (3.2.2)
|
20
|
-
|
24
|
+
codeclimate-engine-rb (0.3.1)
|
25
|
+
virtus (~> 1.0)
|
26
|
+
codeclimate-test-reporter (0.5.2)
|
27
|
+
simplecov (>= 0.7.1, < 1.0.0)
|
28
|
+
coercible (1.0.0)
|
29
|
+
descendants_tracker (~> 0.0.1)
|
30
|
+
cookiejar (0.3.3)
|
21
31
|
crack (0.4.3)
|
22
32
|
safe_yaml (~> 1.0.0)
|
23
33
|
daemons (1.2.3)
|
34
|
+
descendants_tracker (0.0.4)
|
35
|
+
thread_safe (~> 0.3, >= 0.3.1)
|
24
36
|
diff-lcs (1.2.5)
|
25
37
|
docile (1.1.5)
|
26
|
-
em-http-request (1.1.
|
38
|
+
em-http-request (1.1.4)
|
27
39
|
addressable (>= 2.3.4)
|
28
|
-
cookiejar (
|
40
|
+
cookiejar (!= 0.3.1)
|
29
41
|
em-socksify (>= 0.3)
|
30
42
|
eventmachine (>= 1.0.3)
|
31
43
|
http_parser.rb (>= 0.6.0)
|
32
44
|
em-socksify (0.3.1)
|
33
45
|
eventmachine (>= 1.0.0.beta.4)
|
34
|
-
em-synchrony (1.0.
|
46
|
+
em-synchrony (1.0.5)
|
35
47
|
eventmachine (>= 1.0.0.beta.1)
|
36
|
-
|
48
|
+
equalizer (0.0.11)
|
49
|
+
eventmachine (1.2.0.1)
|
37
50
|
faraday (0.9.2)
|
38
51
|
multipart-post (>= 1.2, < 3)
|
39
|
-
geminabox (0.
|
52
|
+
geminabox (0.13.1)
|
40
53
|
builder
|
41
54
|
faraday
|
42
55
|
httpclient (>= 2.2.7)
|
43
56
|
nesty
|
44
57
|
sinatra (>= 1.2.7)
|
45
|
-
hashdiff (0.
|
58
|
+
hashdiff (0.3.0)
|
46
59
|
http_parser.rb (0.6.0)
|
47
|
-
httpclient (2.
|
60
|
+
httpclient (2.8.0)
|
61
|
+
ice_nine (0.11.2)
|
48
62
|
json (1.8.3)
|
49
63
|
macaddr (1.7.1)
|
50
64
|
systemu (~> 2.6.2)
|
51
65
|
memory_profiler (0.9.6)
|
52
66
|
multipart-post (2.0.0)
|
53
67
|
nesty (1.0.2)
|
54
|
-
parser (2.3.1.
|
68
|
+
parser (2.3.1.2)
|
55
69
|
ast (~> 2.2)
|
56
70
|
powerpack (0.1.1)
|
57
71
|
rack (1.6.4)
|
@@ -62,20 +76,24 @@ GEM
|
|
62
76
|
rack-test (0.6.3)
|
63
77
|
rack (>= 1.0)
|
64
78
|
rainbow (2.1.0)
|
65
|
-
rake (
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
rspec
|
71
|
-
rspec-
|
72
|
-
|
79
|
+
rake (11.2.2)
|
80
|
+
reek (4.0.5)
|
81
|
+
codeclimate-engine-rb (~> 0.3.1)
|
82
|
+
parser (~> 2.3.1, >= 2.3.1.2)
|
83
|
+
rainbow (~> 2.0)
|
84
|
+
rspec (3.4.0)
|
85
|
+
rspec-core (~> 3.4.0)
|
86
|
+
rspec-expectations (~> 3.4.0)
|
87
|
+
rspec-mocks (~> 3.4.0)
|
88
|
+
rspec-core (3.4.4)
|
89
|
+
rspec-support (~> 3.4.0)
|
90
|
+
rspec-expectations (3.4.0)
|
73
91
|
diff-lcs (>= 1.2.0, < 2.0)
|
74
|
-
rspec-support (~> 3.
|
75
|
-
rspec-mocks (3.
|
92
|
+
rspec-support (~> 3.4.0)
|
93
|
+
rspec-mocks (3.4.1)
|
76
94
|
diff-lcs (>= 1.2.0, < 2.0)
|
77
|
-
rspec-support (~> 3.
|
78
|
-
rspec-support (3.
|
95
|
+
rspec-support (~> 3.4.0)
|
96
|
+
rspec-support (3.4.1)
|
79
97
|
rubocop (0.40.0)
|
80
98
|
parser (>= 2.3.1.0, < 3.0)
|
81
99
|
powerpack (~> 0.1)
|
@@ -85,26 +103,33 @@ GEM
|
|
85
103
|
ruby-prof (0.15.9)
|
86
104
|
ruby-progressbar (1.8.1)
|
87
105
|
safe_yaml (1.0.4)
|
88
|
-
simplecov (0.11.
|
106
|
+
simplecov (0.11.2)
|
89
107
|
docile (~> 1.1.0)
|
90
108
|
json (~> 1.8)
|
91
109
|
simplecov-html (~> 0.10.0)
|
92
110
|
simplecov-html (0.10.0)
|
93
|
-
sinatra (1.4.
|
94
|
-
rack (~> 1.
|
111
|
+
sinatra (1.4.7)
|
112
|
+
rack (~> 1.5)
|
95
113
|
rack-protection (~> 1.4)
|
96
114
|
tilt (>= 1.3, < 3)
|
97
115
|
systemu (2.6.5)
|
98
|
-
thin (1.
|
116
|
+
thin (1.7.0)
|
99
117
|
daemons (~> 1.0, >= 1.0.9)
|
100
118
|
eventmachine (~> 1.0, >= 1.0.4)
|
101
|
-
rack (
|
102
|
-
|
119
|
+
rack (>= 1, < 3)
|
120
|
+
thread_safe (0.3.5)
|
121
|
+
tilt (2.0.5)
|
122
|
+
timecop (0.8.1)
|
103
123
|
unicode-display_width (1.0.5)
|
104
124
|
uuid (2.3.8)
|
105
125
|
macaddr (~> 1.0)
|
106
|
-
|
107
|
-
|
126
|
+
virtus (1.0.5)
|
127
|
+
axiom-types (~> 0.1)
|
128
|
+
coercible (~> 1.0)
|
129
|
+
descendants_tracker (~> 0.0, >= 0.0.3)
|
130
|
+
equalizer (~> 0.0, >= 0.0.9)
|
131
|
+
webmock (2.1.0)
|
132
|
+
addressable (>= 2.3.6)
|
108
133
|
crack (>= 0.3.2)
|
109
134
|
hashdiff
|
110
135
|
|
@@ -113,15 +138,18 @@ PLATFORMS
|
|
113
138
|
|
114
139
|
DEPENDENCIES
|
115
140
|
bundler (~> 1.5)
|
141
|
+
codeclimate-test-reporter
|
116
142
|
geminabox
|
117
143
|
memory_profiler
|
118
144
|
rack-test
|
119
145
|
rake
|
120
|
-
|
146
|
+
reek
|
147
|
+
rspec (~> 3.4.0)
|
121
148
|
rubocop
|
122
149
|
ruby-prof
|
123
150
|
simplecov
|
124
151
|
sitehub!
|
152
|
+
timecop
|
125
153
|
webmock
|
126
154
|
|
127
155
|
BUNDLED WITH
|
data/README.md
CHANGED
@@ -1,4 +1,8 @@
|
|
1
1
|
# SiteHub
|
2
|
+
[![CircleCI](https://circleci.com/gh/lvl-up/sitehub.svg?style=shield&circle-token=da10bde2f25581f01839fb7078fc2a098a98ca13)](https://circleci.com/gh/lvl-up/sitehub)
|
3
|
+
[![Code Climate](https://codeclimate.com/github/lvl-up/sitehub/badges/gpa.svg)](https://codeclimate.com/github/lvl-up/sitehub)
|
4
|
+
[![Test Coverage](https://codeclimate.com/github/lvl-up/sitehub/badges/coverage.svg)](https://codeclimate.com/github/lvl-up/sitehub/coverage)
|
5
|
+
|
2
6
|
SiteHub is a HTTP proxy written in Ruby with support for A|B testing baked in. SiteHub sits in front of your web application(s) routing all HTTP traffics between it and your users.
|
3
7
|
|
4
8
|
Wouldn't it be cool to write something like:
|
data/Rakefile
CHANGED
data/circle.yml
CHANGED
data/lib/sitehub/builder.rb
CHANGED
@@ -1,20 +1,20 @@
|
|
1
|
-
require 'sitehub/
|
2
|
-
require 'sitehub/transaction_id'
|
3
|
-
require 'sitehub/middleware'
|
1
|
+
require 'sitehub/getter_setter_methods'
|
4
2
|
require 'sitehub/forward_proxy_builder'
|
5
|
-
require 'sitehub/
|
6
|
-
require 'rack/ssl-enforcer'
|
7
|
-
require 'sitehub/logging'
|
8
|
-
require 'rack/fiber_pool'
|
3
|
+
require 'sitehub/middleware'
|
9
4
|
require 'logger'
|
10
5
|
|
11
6
|
class SiteHub
|
12
7
|
class InvalidProxyDefinitionException < Exception
|
13
8
|
end
|
9
|
+
|
14
10
|
class Builder
|
15
11
|
attr_reader :sitehub, :forward_proxies, :reverse_proxies
|
16
12
|
|
17
13
|
include Middleware
|
14
|
+
extend GetterSetterMethods
|
15
|
+
|
16
|
+
getter_setters :access_logger, :error_logger
|
17
|
+
getter_setter :sitehub_cookie_name, RECORDED_ROUTES_COOKIE
|
18
18
|
|
19
19
|
def force_ssl(except: [])
|
20
20
|
@force_ssl = true
|
@@ -27,23 +27,6 @@ class SiteHub
|
|
27
27
|
instance_eval(&block) if block
|
28
28
|
end
|
29
29
|
|
30
|
-
def access_logger(logger = nil)
|
31
|
-
return @access_logger unless logger
|
32
|
-
@access_logger = logger
|
33
|
-
end
|
34
|
-
|
35
|
-
def error_logger(logger = nil)
|
36
|
-
return @error_logger unless logger
|
37
|
-
@error_logger = logger
|
38
|
-
end
|
39
|
-
|
40
|
-
def sitehub_cookie_name(name = nil)
|
41
|
-
@sitehub_cookie_name ||= RECORDED_ROUTES_COOKIE
|
42
|
-
|
43
|
-
return @sitehub_cookie_name unless name
|
44
|
-
@sitehub_cookie_name = name
|
45
|
-
end
|
46
|
-
|
47
30
|
def build
|
48
31
|
forward_proxies.init
|
49
32
|
add_default_middleware
|
@@ -52,27 +35,27 @@ class SiteHub
|
|
52
35
|
end
|
53
36
|
|
54
37
|
def add_default_middleware
|
55
|
-
use ReverseProxy, reverse_proxies
|
56
|
-
use TransactionId
|
57
|
-
use
|
58
|
-
use Logging::
|
38
|
+
use Middleware::ReverseProxy, reverse_proxies
|
39
|
+
use Middleware::TransactionId
|
40
|
+
use Middleware::ErrorHandling
|
41
|
+
use Middleware::Logging::AccessLogger, access_logger || ::Logger.new(STDOUT)
|
42
|
+
use Middleware::Logging::ErrorLogger, error_logger || ::Logger.new(STDERR)
|
59
43
|
use Rack::FiberPool
|
60
44
|
use Rack::SslEnforcer, except: @ssl_exclusions if @force_ssl
|
61
45
|
end
|
62
46
|
|
63
47
|
def proxy(opts = {}, &block)
|
64
|
-
args = { sitehub_cookie_name: sitehub_cookie_name }
|
65
|
-
|
66
48
|
if opts.is_a?(Hash)
|
67
|
-
mapped_path = opts.
|
68
|
-
url = opts.values.first
|
69
|
-
args[:url] = url
|
70
|
-
args[:mapped_path] = mapped_path
|
49
|
+
mapped_path, url = *opts.to_a.flatten
|
71
50
|
else
|
72
|
-
|
51
|
+
mapped_path = opts
|
52
|
+
url = nil
|
73
53
|
end
|
74
54
|
|
75
|
-
forward_proxies << ForwardProxyBuilder.new(
|
55
|
+
forward_proxies << ForwardProxyBuilder.new(sitehub_cookie_name: sitehub_cookie_name,
|
56
|
+
url: url,
|
57
|
+
mapped_path: mapped_path,
|
58
|
+
&block)
|
76
59
|
end
|
77
60
|
|
78
61
|
def reverse_proxy(hash)
|
@@ -8,6 +8,9 @@ class SiteHub
|
|
8
8
|
|
9
9
|
FIXNUM_ERR_MSG = 'splits must be a Fixnum'.freeze
|
10
10
|
SPLIT_ERR_MSG = 'total split percentages can not be greater than 100%'.freeze
|
11
|
+
INVALID_SPILTS_MSG = 'splits do not add up to 100% and no default has been specified'.freeze
|
12
|
+
MAX = 100
|
13
|
+
MIN = 0
|
11
14
|
|
12
15
|
def initialize(hash = {})
|
13
16
|
hash.each do |value, percentage|
|
@@ -17,37 +20,39 @@ class SiteHub
|
|
17
20
|
|
18
21
|
def add(id, value, percentage)
|
19
22
|
raise InvalidSplitException, FIXNUM_ERR_MSG unless percentage.is_a?(Fixnum)
|
20
|
-
|
21
|
-
upper = lower + percentage
|
23
|
+
upper_bound = lower_bound + percentage
|
22
24
|
|
23
|
-
raise InvalidSplitException, SPLIT_ERR_MSG if
|
24
|
-
self[id] = Split.new(
|
25
|
+
raise InvalidSplitException, SPLIT_ERR_MSG if upper_bound > MAX
|
26
|
+
self[id] = Split.new(lower_bound, upper_bound, value)
|
25
27
|
end
|
26
28
|
|
27
29
|
def resolve(*args)
|
28
|
-
random = rand(
|
30
|
+
random = rand(MAX)
|
29
31
|
result = values.find { |split| random >= split.lower && random < split.upper }
|
30
32
|
result ? result.value.resolve(*args) : nil
|
31
33
|
end
|
32
34
|
|
33
|
-
def transform
|
34
|
-
values.each
|
35
|
-
split.value = yield(split.value)
|
36
|
-
end
|
35
|
+
def transform(&block)
|
36
|
+
values.each { |split| split.update_value(&block) }
|
37
37
|
end
|
38
38
|
|
39
39
|
def [](key)
|
40
|
-
|
41
|
-
result && result.value
|
40
|
+
key?(key) ? super(key).value : nil
|
42
41
|
end
|
43
42
|
|
44
43
|
def valid?
|
45
44
|
last = values.last
|
46
|
-
return true if last && last.upper ==
|
45
|
+
return true if last && last.upper == MAX
|
47
46
|
|
48
|
-
warn(
|
47
|
+
warn(INVALID_SPILTS_MSG)
|
49
48
|
false
|
50
49
|
end
|
50
|
+
|
51
|
+
private
|
52
|
+
|
53
|
+
def lower_bound
|
54
|
+
values.empty? ? MIN : values.last.upper
|
55
|
+
end
|
51
56
|
end
|
52
57
|
end
|
53
58
|
end
|