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
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'sitehub/equality'
|
2
|
+
class SiteHub
|
3
|
+
module Middleware
|
4
|
+
module Logging
|
5
|
+
class LogWrapper
|
6
|
+
include Equality
|
7
|
+
|
8
|
+
attr_reader :logger
|
9
|
+
|
10
|
+
def initialize(logger)
|
11
|
+
@logger = logger
|
12
|
+
end
|
13
|
+
|
14
|
+
def write(msg)
|
15
|
+
if logger.respond_to?(:<<)
|
16
|
+
logger << msg
|
17
|
+
elsif logger.respond_to?(:write)
|
18
|
+
logger.write(msg)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
class SiteHub
|
2
|
+
module Middleware
|
3
|
+
module Logging
|
4
|
+
class RequestLog
|
5
|
+
FORMAT = %(%s - %s [%s] transaction_id:%s: "%s %s%s => %s %s" %d %s %0.4f\n).freeze
|
6
|
+
ZERO_STRING = '0'.freeze
|
7
|
+
|
8
|
+
attr_reader :request, :response
|
9
|
+
def initialize(request, response)
|
10
|
+
@request = request
|
11
|
+
@response = response
|
12
|
+
end
|
13
|
+
|
14
|
+
def to_s
|
15
|
+
format(FORMAT, *data)
|
16
|
+
end
|
17
|
+
|
18
|
+
def extract_content_length
|
19
|
+
(value = response.headers[Constants::HttpHeaderKeys::CONTENT_LENGTH]) || (return HYPHEN)
|
20
|
+
value.to_s == ZERO_STRING ? HYPHEN : value
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def data
|
26
|
+
[source_address, remote_user,
|
27
|
+
response_time,
|
28
|
+
request.transaction_id,
|
29
|
+
request_method,
|
30
|
+
request.path,
|
31
|
+
query_string,
|
32
|
+
mapped_url,
|
33
|
+
request.http_version,
|
34
|
+
status,
|
35
|
+
extract_content_length,
|
36
|
+
time_taken]
|
37
|
+
end
|
38
|
+
|
39
|
+
def time_taken
|
40
|
+
response.time - request.time
|
41
|
+
end
|
42
|
+
|
43
|
+
def response_time
|
44
|
+
response.time.strftime(TIME_STAMP_FORMAT)
|
45
|
+
end
|
46
|
+
|
47
|
+
def request_method
|
48
|
+
request.request_method.upcase
|
49
|
+
end
|
50
|
+
|
51
|
+
def status
|
52
|
+
response.status
|
53
|
+
end
|
54
|
+
|
55
|
+
def remote_user
|
56
|
+
request.remote_user || HYPHEN
|
57
|
+
end
|
58
|
+
|
59
|
+
def source_address
|
60
|
+
request.source_address || HYPHEN
|
61
|
+
end
|
62
|
+
|
63
|
+
def mapped_url
|
64
|
+
request.mapped? ? request.mapping.mapped_url.to_s : EMPTY_STRING
|
65
|
+
end
|
66
|
+
|
67
|
+
def query_string
|
68
|
+
query_string = request.query_string
|
69
|
+
query_string.empty? ? EMPTY_STRING : QUESTION_MARK + query_string
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'sitehub/cookie_rewriting'
|
2
|
+
require 'sitehub/location_rewriters'
|
3
|
+
require 'sitehub/request_mapping'
|
4
|
+
require 'sitehub/constants'
|
5
|
+
|
6
|
+
class SiteHub
|
7
|
+
module Middleware
|
8
|
+
class ReverseProxy
|
9
|
+
include CookieRewriting, Constants::HttpHeaderKeys
|
10
|
+
|
11
|
+
attr_reader :path_directives
|
12
|
+
|
13
|
+
def initialize(app, directives)
|
14
|
+
@app = app
|
15
|
+
@path_directives = LocationRewriters.new(directives)
|
16
|
+
end
|
17
|
+
|
18
|
+
def call(env)
|
19
|
+
status, headers, body = @app.call(env).to_a
|
20
|
+
mapping = env[REQUEST].mapping
|
21
|
+
|
22
|
+
headers[LOCATION_HEADER] = location(headers, mapping.source_url) if headers[LOCATION_HEADER]
|
23
|
+
|
24
|
+
rewrite_cookies(headers, substitute_domain: mapping.host) if headers[SET_COOKIE]
|
25
|
+
|
26
|
+
[status, HttpHeaders.new(headers), body]
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def location(headers, source_url)
|
32
|
+
location_header = headers[LOCATION_HEADER]
|
33
|
+
path_directives.find(location_header).apply(location_header, source_url)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'uuid'
|
2
|
+
require 'sitehub/constants'
|
3
|
+
class SiteHub
|
4
|
+
module Middleware
|
5
|
+
class TransactionId
|
6
|
+
include Constants
|
7
|
+
|
8
|
+
def initialize(app)
|
9
|
+
@app = app
|
10
|
+
end
|
11
|
+
|
12
|
+
def call(env)
|
13
|
+
env[RackHttpHeaderKeys::TRANSACTION_ID] ||= UUID.generate(:compact)
|
14
|
+
@app.call env
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,101 @@
|
|
1
|
+
require 'rack/request'
|
2
|
+
require 'sitehub/string_utils'
|
3
|
+
require 'sitehub/http_headers'
|
4
|
+
require 'sitehub/memoize'
|
5
|
+
require 'forwardable'
|
6
|
+
class SiteHub
|
7
|
+
class Request
|
8
|
+
include Constants, Constants::HttpHeaderKeys
|
9
|
+
|
10
|
+
extend Forwardable, Memoize
|
11
|
+
|
12
|
+
def_delegator :@rack_request, :params
|
13
|
+
def_delegator :@rack_request, :url
|
14
|
+
def_delegator :@rack_request, :path
|
15
|
+
def_delegator :@rack_request, :query_string
|
16
|
+
|
17
|
+
attr_reader :env, :rack_request, :mapped_path, :mapped_url, :time
|
18
|
+
|
19
|
+
def initialize(env:)
|
20
|
+
@rack_request = Rack::Request.new(env)
|
21
|
+
@env = HttpHeaders.from_rack_env(env)
|
22
|
+
@time = Time.now
|
23
|
+
end
|
24
|
+
|
25
|
+
def map(path, url)
|
26
|
+
@mapped_path = path
|
27
|
+
@mapped_url = url
|
28
|
+
end
|
29
|
+
|
30
|
+
def request_method
|
31
|
+
rack_request.request_method.downcase.to_sym
|
32
|
+
end
|
33
|
+
|
34
|
+
def body
|
35
|
+
rack_request.body.read
|
36
|
+
end
|
37
|
+
|
38
|
+
def headers
|
39
|
+
@env.tap do |headers|
|
40
|
+
headers[X_FORWARDED_FOR_HEADER] = x_forwarded_for
|
41
|
+
|
42
|
+
headers[X_FORWARDED_HOST_HEADER] = x_forwarded_host
|
43
|
+
|
44
|
+
headers[HOST_HEADER] = if mapped?
|
45
|
+
mapped_uri = URI(mapped_url)
|
46
|
+
"#{mapped_uri.host}:#{mapped_uri.port}"
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def mapping
|
52
|
+
RequestMapping.new(source_url: rack_request.url, mapped_url: mapped_url.to_s, mapped_path: mapped_path)
|
53
|
+
end
|
54
|
+
|
55
|
+
def mapped?
|
56
|
+
mapped_path.is_a?(String)
|
57
|
+
end
|
58
|
+
|
59
|
+
def remote_user
|
60
|
+
rack_request.env[RackHttpHeaderKeys::REMOTE_USER]
|
61
|
+
end
|
62
|
+
|
63
|
+
def transaction_id
|
64
|
+
env[HttpHeaderKeys::TRANSACTION_ID]
|
65
|
+
end
|
66
|
+
|
67
|
+
def http_version
|
68
|
+
rack_env[RackHttpHeaderKeys::HTTP_VERSION]
|
69
|
+
end
|
70
|
+
|
71
|
+
def source_address
|
72
|
+
rack_env[RackHttpHeaderKeys::X_FORWARDED_FOR] || rack_env[RackHttpHeaderKeys::REMOTE_ADDR]
|
73
|
+
end
|
74
|
+
|
75
|
+
def uri
|
76
|
+
mapping.computed_uri
|
77
|
+
end
|
78
|
+
|
79
|
+
memoize :url, :path, :uri, :mapped?, :mapping, :headers, :body, :request_method
|
80
|
+
|
81
|
+
private
|
82
|
+
|
83
|
+
def rack_env
|
84
|
+
rack_request.env
|
85
|
+
end
|
86
|
+
|
87
|
+
def remote_address
|
88
|
+
rack_request.env[RackHttpHeaderKeys::REMOTE_ADDRESS_ENV_KEY]
|
89
|
+
end
|
90
|
+
|
91
|
+
def x_forwarded_host
|
92
|
+
StringUtils.split(env[HttpHeaderKeys::X_FORWARDED_HOST_HEADER])
|
93
|
+
.push(env[HttpHeaderKeys::HOST_HEADER])
|
94
|
+
.join(COMMA)
|
95
|
+
end
|
96
|
+
|
97
|
+
def x_forwarded_for
|
98
|
+
StringUtils.split(env[HttpHeaderKeys::X_FORWARDED_FOR_HEADER]).push(remote_address).join(COMMA)
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
@@ -1,40 +1,38 @@
|
|
1
1
|
require 'sitehub/constants'
|
2
|
+
require 'sitehub/memoize'
|
2
3
|
class SiteHub
|
3
4
|
class RequestMapping
|
5
|
+
extend Memoize
|
6
|
+
include Equality
|
7
|
+
|
4
8
|
attr_reader :source_url, :mapped_url, :mapped_path
|
5
9
|
|
6
10
|
BASE_URL_MATCHER = %r{^\w+://[\w+\.-]+(:\d+)?}
|
7
11
|
CAPTURE_GROUP_REFERENCE = '$%s'.freeze
|
8
12
|
USER_SUPPLIED_CAPTURE = 1..-1
|
9
13
|
|
10
|
-
def initialize(source_url:,
|
14
|
+
def initialize(source_url:, mapped_url: EMPTY_STRING, mapped_path:)
|
11
15
|
@source_url = source_url
|
12
|
-
@mapped_url = mapped_url.dup
|
16
|
+
@mapped_url = mapped_url.to_s.dup
|
17
|
+
mapped_path = mapped_path.to_s.dup
|
13
18
|
@mapped_path = mapped_path.is_a?(Regexp) ? mapped_path : Regexp.new(mapped_path)
|
14
|
-
@downstream_url = downstream_url
|
15
|
-
end
|
16
|
-
|
17
|
-
def cookie_path
|
18
|
-
mapped_path.source[/^(.*)?\(/, 1].gsub(%r{/$}, '') if mapped_path.is_a?(Regexp)
|
19
19
|
end
|
20
20
|
|
21
21
|
def computed_uri
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
url.gsub!(CAPTURE_GROUP_REFERENCE % (index + 1), match)
|
27
|
-
end
|
22
|
+
url_components = url_scanner_regex.match(source_url).captures[USER_SUPPLIED_CAPTURE]
|
23
|
+
mapped_url.tap do |url|
|
24
|
+
url_components.each_with_index do |match, index|
|
25
|
+
url.gsub!(CAPTURE_GROUP_REFERENCE % (index + 1), match)
|
28
26
|
end
|
29
27
|
end
|
28
|
+
URI(mapped_url)
|
30
29
|
end
|
30
|
+
memoize :computed_uri
|
31
31
|
|
32
|
-
def
|
33
|
-
|
34
|
-
source_url == other.source_url &&
|
35
|
-
mapped_url == other.mapped_url &&
|
36
|
-
mapped_path == other.mapped_path
|
32
|
+
def host
|
33
|
+
URI(source_url).host
|
37
34
|
end
|
35
|
+
memoize :host
|
38
36
|
|
39
37
|
private
|
40
38
|
|
data/lib/sitehub/resolver.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
#
|
1
|
+
# this helper module is for the benefit of middleware that may not otherwse respond to resolve.
|
2
2
|
# THis is to ensure that middleware wrapping the core forward proxy apps had the resolve method also.
|
3
3
|
#
|
4
4
|
class SiteHub
|
data/lib/sitehub/version.rb
CHANGED
data/sitehub.gemspec
CHANGED
@@ -29,13 +29,16 @@ Gem::Specification.new do |spec|
|
|
29
29
|
|
30
30
|
spec.add_development_dependency 'bundler', '~> 1.5'
|
31
31
|
spec.add_development_dependency 'rake'
|
32
|
-
spec.add_development_dependency 'rspec', '~> 3.
|
32
|
+
spec.add_development_dependency 'rspec', '~> 3.4.0'
|
33
33
|
spec.add_development_dependency 'webmock'
|
34
34
|
spec.add_development_dependency 'rack-test'
|
35
35
|
spec.add_development_dependency 'geminabox'
|
36
36
|
spec.add_development_dependency 'simplecov'
|
37
37
|
spec.add_development_dependency 'rubocop'
|
38
38
|
spec.add_development_dependency 'memory_profiler'
|
39
|
+
spec.add_development_dependency 'codeclimate-test-reporter'
|
40
|
+
spec.add_development_dependency 'reek'
|
41
|
+
spec.add_development_dependency 'timecop'
|
39
42
|
|
40
43
|
spec.add_development_dependency 'ruby-prof'
|
41
44
|
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
class SiteHub
|
2
|
+
describe Equality do
|
3
|
+
subject(:test_class) do
|
4
|
+
Class.new do
|
5
|
+
include Equality
|
6
|
+
|
7
|
+
def initialize(first_attribute, second_attribute)
|
8
|
+
@first_attribute = first_attribute
|
9
|
+
@second_attribute = second_attribute
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
subject do
|
14
|
+
test_class.new(:foo, :bar)
|
15
|
+
end
|
16
|
+
|
17
|
+
describe '#==' do
|
18
|
+
context 'match' do
|
19
|
+
it 'returns true' do
|
20
|
+
match = test_class.new(:foo, :bar)
|
21
|
+
expect(subject).to eq(match)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
context 'mismatch' do
|
25
|
+
it 'returns false' do
|
26
|
+
match = test_class.new(:wrong, :bar)
|
27
|
+
expect(subject).to_not eq(match)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -24,7 +24,8 @@ class SiteHub
|
|
24
24
|
end
|
25
25
|
|
26
26
|
it 'the defined route is used 100% of the time' do
|
27
|
-
expected_proxy = ForwardProxyBuilder.new(mapped_path: '/
|
27
|
+
expected_proxy = ForwardProxyBuilder.new(mapped_path: '/app1',
|
28
|
+
sitehub_cookie_name: RECORDED_ROUTES_COOKIE).tap do |route|
|
28
29
|
route.default(url: :endpoint)
|
29
30
|
end
|
30
31
|
expect(subject.forward_proxies.forward_proxies['/app1']).to eq(expected_proxy)
|
@@ -41,7 +42,8 @@ class SiteHub
|
|
41
42
|
end
|
42
43
|
|
43
44
|
it 'passes the block to the route constructor' do
|
44
|
-
expected_route = ForwardProxyBuilder.new(mapped_path: '/
|
45
|
+
expected_route = ForwardProxyBuilder.new(mapped_path: '/app',
|
46
|
+
sitehub_cookie_name: RECORDED_ROUTES_COOKIE).tap do |route|
|
45
47
|
route.split url: :endpoint, percentage: 100, label: :label
|
46
48
|
end
|
47
49
|
|
@@ -54,16 +56,16 @@ class SiteHub
|
|
54
56
|
it ' sets the logger' do
|
55
57
|
subject.access_logger :access_logger
|
56
58
|
sitehub = subject.build
|
57
|
-
logger_middleware = find_middleware(sitehub, Logging::AccessLogger)
|
58
|
-
expect(logger_middleware.logger).to eq(Logging::LogWrapper.new(:access_logger))
|
59
|
+
logger_middleware = find_middleware(sitehub, Middleware::Logging::AccessLogger)
|
60
|
+
expect(logger_middleware.logger).to eq(Middleware::Logging::LogWrapper.new(:access_logger))
|
59
61
|
end
|
60
62
|
|
61
63
|
it 'defaults to STDOUT' do
|
62
64
|
allow(::Logger).to receive(:new).and_return(:a_logger)
|
63
65
|
expect(::Logger).to receive(:new).with(STDOUT).and_return(:stdout_logger)
|
64
66
|
sitehub = subject.build
|
65
|
-
logger_middleware = find_middleware(sitehub, Logging::AccessLogger)
|
66
|
-
expect(logger_middleware.logger).to eq(Logging::LogWrapper.new(:stdout_logger))
|
67
|
+
logger_middleware = find_middleware(sitehub, Middleware::Logging::AccessLogger)
|
68
|
+
expect(logger_middleware.logger).to eq(Middleware::Logging::LogWrapper.new(:stdout_logger))
|
67
69
|
end
|
68
70
|
end
|
69
71
|
|
@@ -90,16 +92,16 @@ class SiteHub
|
|
90
92
|
it 'sets the logger' do
|
91
93
|
subject.error_logger :error_logger
|
92
94
|
sitehub = subject.build
|
93
|
-
logger_middleware = find_middleware(sitehub,
|
94
|
-
expect(logger_middleware.logger).to eq(Logging::LogWrapper.new(:error_logger))
|
95
|
+
logger_middleware = find_middleware(sitehub, Middleware::Logging::ErrorLogger)
|
96
|
+
expect(logger_middleware.logger).to eq(Middleware::Logging::LogWrapper.new(:error_logger))
|
95
97
|
end
|
96
98
|
|
97
99
|
it 'defaults to STDERR' do
|
98
100
|
allow(::Logger).to receive(:new).and_return(:a_logger)
|
99
101
|
expect(::Logger).to receive(:new).with(STDERR).and_return(:stderr_logger)
|
100
102
|
sitehub = subject.build
|
101
|
-
logger_middleware = find_middleware(sitehub,
|
102
|
-
expect(logger_middleware.logger).to eq(Logging::LogWrapper.new(:stderr_logger))
|
103
|
+
logger_middleware = find_middleware(sitehub, Middleware::Logging::ErrorLogger)
|
104
|
+
expect(logger_middleware.logger).to eq(Middleware::Logging::LogWrapper.new(:stderr_logger))
|
103
105
|
end
|
104
106
|
end
|
105
107
|
|
@@ -111,34 +113,38 @@ class SiteHub
|
|
111
113
|
|
112
114
|
context 'default middleware' do
|
113
115
|
it 'adds TransactionId middleware to the sitehub' do
|
114
|
-
expect(subject.build).to be_using(TransactionId)
|
116
|
+
expect(subject.build).to be_using(Middleware::TransactionId)
|
115
117
|
end
|
116
118
|
|
117
119
|
it 'adds a forward proxies' do
|
118
|
-
expect(subject.build).to be_using(ForwardProxies)
|
120
|
+
expect(subject.build).to be_using(Middleware::ForwardProxies)
|
119
121
|
end
|
120
122
|
|
121
123
|
it 'adds a AccessLogger' do
|
122
|
-
expect(subject.build).to be_using(Logging::AccessLogger)
|
124
|
+
expect(subject.build).to be_using(Middleware::Logging::AccessLogger)
|
123
125
|
end
|
124
126
|
|
125
127
|
it 'adds a ErrorLogger' do
|
126
|
-
expect(subject.build).to be_using(Logging::ErrorLogger)
|
128
|
+
expect(subject.build).to be_using(Middleware::Logging::ErrorLogger)
|
127
129
|
end
|
128
130
|
it 'adds a Rack FiberPool' do
|
129
131
|
expect(subject.build).to be_using(Rack::FiberPool)
|
130
132
|
end
|
131
133
|
|
134
|
+
it 'adds a ErrorHandler' do
|
135
|
+
expect(subject.build).to be_using(Middleware::ErrorHandling)
|
136
|
+
end
|
137
|
+
|
132
138
|
context 'reverse proxy' do
|
133
139
|
it 'adds a reverse proxy' do
|
134
|
-
expect(subject.build).to be_using(ReverseProxy)
|
140
|
+
expect(subject.build).to be_using(Middleware::ReverseProxy)
|
135
141
|
end
|
136
142
|
|
137
143
|
it 'uses configured reverse proxy directives' do
|
138
144
|
subject.reverse_proxy(downstream_url: :upstream_path.to_s)
|
139
|
-
reverse_proxy = find_middleware(subject.build, ReverseProxy)
|
145
|
+
reverse_proxy = find_middleware(subject.build, Middleware::ReverseProxy)
|
140
146
|
|
141
|
-
expect(reverse_proxy.path_directives).to eq(
|
147
|
+
expect(reverse_proxy.path_directives).to eq(LocationRewriters.new(downstream_url: :upstream_path.to_s))
|
142
148
|
end
|
143
149
|
end
|
144
150
|
|
@@ -146,11 +152,12 @@ class SiteHub
|
|
146
152
|
middleware_stack = collect_middleware(subject.build).collect(&:class)
|
147
153
|
|
148
154
|
expected_middleware = [Rack::FiberPool,
|
149
|
-
Logging::ErrorLogger,
|
150
|
-
Logging::AccessLogger,
|
151
|
-
|
152
|
-
|
153
|
-
|
155
|
+
Middleware::Logging::ErrorLogger,
|
156
|
+
Middleware::Logging::AccessLogger,
|
157
|
+
Middleware::ErrorHandling,
|
158
|
+
Middleware::TransactionId,
|
159
|
+
Middleware::ReverseProxy,
|
160
|
+
Middleware::ForwardProxies]
|
154
161
|
|
155
162
|
expect(middleware_stack).to eq(expected_middleware)
|
156
163
|
end
|