sitehub 0.4.10 → 0.5.0.alpha2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2d94187ef893c9a2c4d268cb7742aec5af3a3dbe
4
- data.tar.gz: 86265225147758c53c9be73618785d8a9dc83f3d
3
+ metadata.gz: f337700fc9aa4189ae5eca245175ce90215feb89
4
+ data.tar.gz: e13f12292d4dfd071025531ffa3a1e318f62e830
5
5
  SHA512:
6
- metadata.gz: 9fb4f9c14ae859297789424346658c018978a0781d4db2a11353b8e6050d49b0624d43ff5e42fb16c72a9051af834a01854f148d9fe7077e86ba0c893affaa65
7
- data.tar.gz: 0ca49b96ca7838ca6e0e384006261fa76c9a553f3cc818c559fcb413852a7541b212cd768670726915c8e6ca374ef7f183d1cb9c3ce077aeebb0d66a18a1fb7f
6
+ metadata.gz: e7d744f3fa8f2fa9170291eab863c4d1f6b79024b3811ec1a292409c188ace0ea62e4289575241b5af4c64d0359affaa25b9571e5c316e8ed2733552d3d587b5
7
+ data.tar.gz: f481d91e80a2e9de3681174c9ca0da813ee4e724395308ec2abbe5fd29e4220ddfa356c58b0f22a25d48424b7284c31799bb453a4929d28b576449ab7e536da7
data/Gemfile.lock CHANGED
@@ -1,11 +1,12 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- sitehub (0.4.10)
4
+ sitehub (0.5.0.alpha2)
5
+ activesupport
5
6
  em-http-request
6
7
  em-synchrony
7
8
  faraday
8
- rack (~> 1.6.8)
9
+ rack
9
10
  rack-fiber_pool
10
11
  rack-ssl-enforcer
11
12
  thin
@@ -14,6 +15,11 @@ PATH
14
15
  GEM
15
16
  remote: https://rubygems.org/
16
17
  specs:
18
+ activesupport (5.0.0)
19
+ concurrent-ruby (~> 1.0, >= 1.0.2)
20
+ i18n (~> 0.7)
21
+ minitest (~> 5.1)
22
+ tzinfo (~> 1.1)
17
23
  addressable (2.4.0)
18
24
  ast (2.3.0)
19
25
  axiom-types (0.1.1)
@@ -27,10 +33,11 @@ GEM
27
33
  simplecov (>= 0.7.1, < 1.0.0)
28
34
  coercible (1.0.0)
29
35
  descendants_tracker (~> 0.0.1)
36
+ concurrent-ruby (1.0.2)
30
37
  cookiejar (0.3.3)
31
38
  crack (0.4.3)
32
39
  safe_yaml (~> 1.0.0)
33
- daemons (1.2.6)
40
+ daemons (1.2.3)
34
41
  descendants_tracker (0.0.4)
35
42
  thread_safe (~> 0.3, >= 0.3.1)
36
43
  diff-lcs (1.2.5)
@@ -43,10 +50,10 @@ GEM
43
50
  http_parser.rb (>= 0.6.0)
44
51
  em-socksify (0.3.1)
45
52
  eventmachine (>= 1.0.0.beta.4)
46
- em-synchrony (1.0.6)
53
+ em-synchrony (1.0.5)
47
54
  eventmachine (>= 1.0.0.beta.1)
48
55
  equalizer (0.0.11)
49
- eventmachine (1.2.5)
56
+ eventmachine (1.2.0.1)
50
57
  faraday (0.9.2)
51
58
  multipart-post (>= 1.2, < 3)
52
59
  geminabox (0.13.1)
@@ -58,17 +65,19 @@ GEM
58
65
  hashdiff (0.3.0)
59
66
  http_parser.rb (0.6.0)
60
67
  httpclient (2.8.0)
68
+ i18n (0.7.0)
61
69
  ice_nine (0.11.2)
62
70
  json (1.8.3)
63
71
  macaddr (1.7.1)
64
72
  systemu (~> 2.6.2)
65
73
  memory_profiler (0.9.6)
74
+ minitest (5.9.0)
66
75
  multipart-post (2.0.0)
67
76
  nesty (1.0.2)
68
77
  parser (2.3.1.2)
69
78
  ast (~> 2.2)
70
79
  powerpack (0.1.1)
71
- rack (1.6.8)
80
+ rack (1.6.4)
72
81
  rack-fiber_pool (0.9.3)
73
82
  rack-protection (1.5.3)
74
83
  rack
@@ -113,13 +122,15 @@ GEM
113
122
  rack-protection (~> 1.4)
114
123
  tilt (>= 1.3, < 3)
115
124
  systemu (2.6.5)
116
- thin (1.7.2)
125
+ thin (1.7.0)
117
126
  daemons (~> 1.0, >= 1.0.9)
118
127
  eventmachine (~> 1.0, >= 1.0.4)
119
128
  rack (>= 1, < 3)
120
129
  thread_safe (0.3.5)
121
130
  tilt (2.0.5)
122
131
  timecop (0.8.1)
132
+ tzinfo (1.2.2)
133
+ thread_safe (~> 0.1)
123
134
  unicode-display_width (1.0.5)
124
135
  uuid (2.3.8)
125
136
  macaddr (~> 1.0)
data/lib/sitehub.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  require 'sitehub/constants'
2
+ require 'sitehub/middleware'
2
3
  require 'sitehub/builder'
3
4
  class SiteHub
4
5
  class << self
@@ -1,20 +1,14 @@
1
- require 'sitehub/getter_setter_methods'
2
- require 'sitehub/forward_proxy_builder'
3
- require 'sitehub/middleware'
4
1
  require 'logger'
2
+ require 'sitehub/core'
3
+ require 'active_support/cache'
5
4
 
6
5
  class SiteHub
7
- class InvalidProxyDefinitionException < Exception
8
- end
9
-
10
6
  class Builder
11
- attr_reader :sitehub, :forward_proxies, :reverse_proxies
12
-
13
7
  include Middleware
14
8
  extend GetterSetterMethods
15
9
 
16
- getter_setters :access_logger, :error_logger
17
- getter_setter :sitehub_cookie_name, RECORDED_ROUTES_COOKIE
10
+ attr_reader :core
11
+ getter_setters :access_logger, :error_logger, :config_server
18
12
 
19
13
  def force_ssl(except: [])
20
14
  @force_ssl = true
@@ -22,41 +16,33 @@ class SiteHub
22
16
  end
23
17
 
24
18
  def initialize(&block)
25
- @reverse_proxies = {}
19
+ @core = Core.new
26
20
  instance_eval(&block) if block
27
21
  end
28
22
 
29
- def forward_proxies
30
- @forward_proxies ||= ForwardProxies.new(sitehub_cookie_name)
31
- end
32
-
33
23
  def build
34
- forward_proxies.init
35
24
  add_default_middleware
36
- middlewares.reverse!
37
- apply_middleware(forward_proxies)
25
+ use ConfigLoader, config_server if config_server
26
+ apply_middleware(core.build)
38
27
  end
39
28
 
40
29
  def add_default_middleware
41
- use Middleware::ReverseProxy, reverse_proxies
42
- use Middleware::TransactionId
43
- use Middleware::ErrorHandling
44
- use Middleware::Logging::AccessLogger, access_logger || ::Logger.new(STDOUT)
45
- use Middleware::Logging::ErrorLogger, error_logger || ::Logger.new(STDERR)
46
- use Rack::FiberPool
47
30
  use Rack::SslEnforcer, except: @ssl_exclusions if @force_ssl
31
+ use Rack::FiberPool
32
+ use Middleware::Logging::ErrorLogger, error_logger || ::Logger.new(STDERR)
33
+ use Middleware::Logging::AccessLogger, access_logger || ::Logger.new(STDOUT)
34
+ use Middleware::ErrorHandling
35
+ use Middleware::TransactionId
48
36
  end
49
37
 
50
- def proxy(opts = {}, &block)
51
- mapped_path, url = *(opts.respond_to?(:to_a) ? opts.to_a : [opts]).flatten
52
-
53
- forward_proxies.add_proxy(url: url,
54
- mapped_path: mapped_path,
55
- &block)
38
+ def respond_to?(method)
39
+ super || core.respond_to?(method)
56
40
  end
57
41
 
58
- def reverse_proxy(hash)
59
- reverse_proxies.merge!(hash)
42
+ def method_missing(method, *args, &block)
43
+ core.send(method, *args, &block)
44
+ rescue NoMethodError
45
+ super
60
46
  end
61
47
  end
62
48
  end
@@ -15,12 +15,6 @@ class SiteHub
15
15
  result = values.find { |route| route.applies?(env) }
16
16
  result && result.resolve(env: env)
17
17
  end
18
-
19
- def transform
20
- each do |id, value|
21
- self[id] = yield(value)
22
- end
23
- end
24
18
  end
25
19
  end
26
20
  end
@@ -0,0 +1,69 @@
1
+ require 'sitehub/route_builder'
2
+ require 'forwardable'
3
+
4
+ class SiteHub
5
+ class InvalidProxyDefinitionException < Exception
6
+ end
7
+
8
+ class ConfigError < Exception
9
+ end
10
+
11
+ module CollectionMethods
12
+ def collection(hash, item)
13
+ hash[item] || []
14
+ end
15
+
16
+ def collection!(hash, item)
17
+ return hash[item] if hash[item]
18
+ raise ConfigError, "missing: #{item}"
19
+ end
20
+ end
21
+
22
+ class Core
23
+ class << self
24
+ # TODO: default action for missing key, throw exception?
25
+ def from_hash(config)
26
+ new do
27
+ extend CollectionMethods
28
+ sitehub_cookie_name config[:sitehub_cookie_name] if config[:sitehub_cookie_name]
29
+
30
+ collection!(config, :proxies).each do |proxy|
31
+ routes.add_route route_builder: RouteBuilder.from_hash(proxy, sitehub_cookie_name)
32
+ end
33
+
34
+ collection(config, :reverse_proxies).each do |proxy|
35
+ reverse_proxy proxy[:downstream_url] => proxy[:path]
36
+ end
37
+ end
38
+ end
39
+ end
40
+
41
+ include Equality
42
+ extend Forwardable
43
+
44
+ attr_reader :routes, :reverse_proxies
45
+ def_delegator :routes, :sitehub_cookie_name
46
+
47
+ def initialize(&block)
48
+ @reverse_proxies = {}
49
+ @routes = Middleware::Routes.new
50
+ instance_eval(&block) if block
51
+ end
52
+
53
+ def build
54
+ Middleware::ReverseProxy.new(routes.init, reverse_proxies)
55
+ end
56
+
57
+ def proxy(opts = {}, &block)
58
+ mapped_path, url = *(opts.respond_to?(:to_a) ? opts.to_a : [opts]).flatten
59
+
60
+ routes.add_route(url: url,
61
+ mapped_path: mapped_path,
62
+ &block)
63
+ end
64
+
65
+ def reverse_proxy(hash)
66
+ reverse_proxies.merge!(hash)
67
+ end
68
+ end
69
+ end
@@ -14,7 +14,6 @@ class SiteHub
14
14
  end
15
15
 
16
16
  def ==(other)
17
- return false unless other.is_a?(_clazz)
18
17
  fields = instance_variables.find_all { |field| !_clazz.transient_fields.include?(field) }
19
18
  fields.all? do |variable|
20
19
  instance_variable_get(variable) == other.instance_variable_get(variable)
@@ -1,18 +1,13 @@
1
- # rubocop:disable Metrics/ParameterLists
2
1
  class SiteHub
3
2
  class ForwardProxy
4
- include Rules, Resolver, Equality
3
+ include Equality
5
4
 
6
- attr_reader :downstream_client, :sitehub_cookie_name, :id, :sitehub_cookie_path, :mapped_path, :mapped_url
5
+ attr_reader :downstream_client, :mapped_path, :mapped_url
7
6
 
8
7
  transient :downstream_client
9
8
 
10
- def initialize(sitehub_cookie_path: nil, sitehub_cookie_name:, id:, rule: nil, mapped_path:, mapped_url:)
9
+ def initialize(mapped_path:, mapped_url:)
11
10
  @downstream_client = DownstreamClient.new
12
- @sitehub_cookie_path = sitehub_cookie_path
13
- @sitehub_cookie_name = sitehub_cookie_name
14
- @id = id
15
- @rule = rule
16
11
  @mapped_path = mapped_path
17
12
  @mapped_url = mapped_url
18
13
  end
@@ -21,15 +16,7 @@ class SiteHub
21
16
  request = env[REQUEST]
22
17
  request.map(mapped_path, mapped_url)
23
18
 
24
- downstream_client.call(request).tap do |response|
25
- response.set_cookie(sitehub_cookie_name,
26
- path: resolve_sitehub_cookie_path(request),
27
- value: id)
28
- end
29
- end
30
-
31
- def resolve_sitehub_cookie_path(request)
32
- sitehub_cookie_path || request.path
19
+ downstream_client.call(request)
33
20
  end
34
21
  end
35
22
  end
@@ -4,6 +4,8 @@ class SiteHub
4
4
  class LocationRewriters < Array
5
5
  DEFAULT = NilLocationRewriter.new
6
6
 
7
+ include Equality
8
+
7
9
  def initialize(map = {})
8
10
  enriched = map.collect do |pattern, path_template|
9
11
  matcher = pattern.is_a?(Regexp) ? pattern : /#{pattern}/
@@ -2,9 +2,11 @@ $LOAD_PATH.unshift(__dir__)
2
2
  require 'middleware/logging'
3
3
  require 'middleware/transaction_id'
4
4
  require 'middleware/error_handling'
5
- require 'middleware/forward_proxies'
5
+ require 'middleware/routes'
6
6
  require 'middleware/reverse_proxy'
7
+ require 'middleware/config_loader'
7
8
  require 'rack/ssl-enforcer'
9
+ require 'middleware/route'
8
10
  require 'rack/fiber_pool'
9
11
 
10
12
  class SiteHub
@@ -0,0 +1,39 @@
1
+ class SiteHub
2
+ class ConfigServer
3
+ attr_reader :server_url, :http_client
4
+ def initialize(url)
5
+ @server_url = url
6
+ @http_client = Faraday.new(ssl: { verify: false }) do |con|
7
+ con.adapter :em_synchrony
8
+ end
9
+ end
10
+
11
+ def get
12
+ JSON(http_client.get(server_url).body, symbolize_names: true)
13
+ end
14
+ end
15
+
16
+ module Middleware
17
+ class ConfigLoader
18
+ attr_reader :config_server, :app, :cache
19
+
20
+ def initialize(_app, config_server_url)
21
+ @config_server = ConfigServer.new(config_server_url)
22
+ @cache = ActiveSupport::Cache::MemoryStore.new(size: 1.megabytes)
23
+ end
24
+
25
+ def call(env)
26
+ load_config
27
+ @app.call env
28
+ end
29
+
30
+ def load_config
31
+ config = cache.fetch(:sitehub_config, expires_in: 30) do
32
+ config_server.get
33
+ end
34
+
35
+ @app = Core.from_hash(config).build
36
+ end
37
+ end
38
+ end
39
+ end
@@ -6,7 +6,7 @@ require 'sitehub/constants'
6
6
  class SiteHub
7
7
  module Middleware
8
8
  class ReverseProxy
9
- include CookieRewriting, Constants::HttpHeaderKeys
9
+ include CookieRewriting, Constants::HttpHeaderKeys, Equality
10
10
 
11
11
  attr_reader :path_directives
12
12
 
@@ -0,0 +1,35 @@
1
+ require 'sitehub/middleware'
2
+ require 'sitehub/rules'
3
+
4
+ class SiteHub
5
+ class Route
6
+ include Middleware, Resolver, Rules, Equality
7
+
8
+ attr_reader :id, :sitehub_cookie_name, :sitehub_cookie_path, :app
9
+
10
+ def initialize(app, id:, sitehub_cookie_name:, sitehub_cookie_path: nil)
11
+ @app = app
12
+ @id = id
13
+ @sitehub_cookie_name = sitehub_cookie_name
14
+ @sitehub_cookie_path = sitehub_cookie_path
15
+ end
16
+
17
+ def call(env)
18
+ request = env[REQUEST]
19
+ @app.call(env).tap do |response|
20
+ response.set_cookie(sitehub_cookie_name,
21
+ path: resolve_sitehub_cookie_path(request),
22
+ value: id)
23
+ end
24
+ end
25
+
26
+ def resolve_sitehub_cookie_path(request)
27
+ sitehub_cookie_path || request.path
28
+ end
29
+
30
+ def init
31
+ @app = apply_middleware(@app)
32
+ self
33
+ end
34
+ end
35
+ end
@@ -1,21 +1,23 @@
1
+ require 'sitehub/getter_setter_methods'
1
2
  require 'sitehub/constants'
2
- require 'sitehub/nil_proxy'
3
+ require 'sitehub/nil_route'
3
4
  require 'rack/request'
4
5
  require 'rack/response'
5
6
  require 'rack/utils'
6
7
  require 'em-http'
7
- require 'forwardable'
8
8
 
9
9
  class SiteHub
10
10
  module Middleware
11
- class ForwardProxies < Hash
12
- NIL_PROXY = NilProxy.new
11
+ class Routes < Hash
12
+ NIL_ROUTE = NilRoute.new
13
13
 
14
- attr_reader :sitehub_cookie_name
14
+ include Equality
15
15
 
16
- def initialize(sitehub_cookie_name)
17
- @sitehub_cookie_name = sitehub_cookie_name
18
- self.default = NIL_PROXY
16
+ extend GetterSetterMethods
17
+ getter_setter :sitehub_cookie_name, RECORDED_ROUTES_COOKIE
18
+
19
+ def initialize
20
+ self.default = NIL_ROUTE
19
21
  end
20
22
 
21
23
  def call(env)
@@ -31,11 +33,17 @@ class SiteHub
31
33
  self
32
34
  end
33
35
 
34
- def add_proxy(url: nil, mapped_path:, &block)
35
- self[mapped_path] = ForwardProxyBuilder.new(sitehub_cookie_name: sitehub_cookie_name,
36
- url: url,
37
- mapped_path: mapped_path,
38
- &block)
36
+ def add_route(url: nil, mapped_path: nil, route_builder: nil, &block)
37
+ if route_builder
38
+ self[route_builder.mapped_path] = route_builder
39
+ return
40
+ end
41
+
42
+ self[mapped_path] = RouteBuilder.new(sitehub_cookie_name: sitehub_cookie_name,
43
+ mapped_path: mapped_path,
44
+ &block).tap do |builder|
45
+ builder.default(url: url) if url
46
+ end
39
47
  end
40
48
 
41
49
  def mapped_proxy(path:, request:)