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
         |