rack-domain-filter 1.0.0 → 1.0.1
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/.travis.yml +9 -0
- data/README.md +32 -3
- data/Rakefile +1 -1
- data/lib/rack/domain_filter/ext/after_request_handler.rb +11 -0
- data/lib/rack/domain_filter/ext/configuration.rb +53 -0
- data/lib/rack/domain_filter/ext/exception_handler.rb +15 -0
- data/lib/rack/domain_filter/ext/matcher.rb +50 -0
- data/lib/rack/domain_filter/version.rb +1 -1
- data/lib/rack/domain_filter.rb +5 -111
- data/rack-domain-filter.gemspec +1 -2
- metadata +9 -18
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ecad2be7765f37121b0adcce79f408ee0eefc089
|
4
|
+
data.tar.gz: 6c46aa80f6a4af20434246db6fbab7e874bcfb42
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 915dd5d8a5299c746ce40afe428fe229bc336167330223f3ad71910f5e18041710d1cfde6139900b26cc94d90604e24e52f2d82c2a65704060eeba3f1141f842
|
7
|
+
data.tar.gz: e4ab369e3f4c931e6d38c30960def317d19b8853880d151f145bbe920ec06a764a9908aa06aa014306428d4d074f70af142feb2824fba6e9036d8f2ffc35b1b0
|
data/.travis.yml
ADDED
data/README.md
CHANGED
@@ -1,4 +1,6 @@
|
|
1
|
-
#
|
1
|
+
# Rack Domain Filter
|
2
|
+
|
3
|
+
[](https://travis-ci.org/mufid/rack-domain-filter)
|
2
4
|
|
3
5
|
## Prerequisites
|
4
6
|
|
@@ -21,7 +23,10 @@ See Yarddoc for more information.
|
|
21
23
|
Suppose you have `Company` model. In Rails, you can do
|
22
24
|
like this:
|
23
25
|
|
24
|
-
|
26
|
+
# Put this inside application.rb, or
|
27
|
+
# any environment file in config/environments/*.rb
|
28
|
+
|
29
|
+
Rack::DomainFilter.configure do |config|
|
25
30
|
config.filter_for /(.+).local.dev/ do |slug|
|
26
31
|
Thread.current[:company] = Company.find_by!(slug)
|
27
32
|
end
|
@@ -47,7 +52,7 @@ like this:
|
|
47
52
|
end
|
48
53
|
end
|
49
54
|
|
50
|
-
config.middleware.use Rack::
|
55
|
+
config.middleware.use Rack::DomainFilter
|
51
56
|
|
52
57
|
In your controller, you can get your current company with
|
53
58
|
this syntax:
|
@@ -63,3 +68,27 @@ this syntax:
|
|
63
68
|
Thread.current[:company]
|
64
69
|
end
|
65
70
|
end
|
71
|
+
|
72
|
+
You may want to put this into global filter. This
|
73
|
+
is quick but dirty solution.
|
74
|
+
|
75
|
+
class ApplicationRecord < ActiveRecord::Base
|
76
|
+
default_scope do
|
77
|
+
if Thread.current[:company]
|
78
|
+
where(company_id: Thread.current[:company].id)
|
79
|
+
else
|
80
|
+
nil
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
The best way to use this is to explictly
|
86
|
+
ask Model to search in current company scope
|
87
|
+
|
88
|
+
class ApplicationRecord < ActiveRecord::Base
|
89
|
+
scope :in_current_company, -> { where(company: Thread.current[:company]) }
|
90
|
+
end
|
91
|
+
|
92
|
+
class Manager < ApplicationRecord; end
|
93
|
+
|
94
|
+
@managers = Manager.in_current_company
|
data/Rakefile
CHANGED
@@ -0,0 +1,53 @@
|
|
1
|
+
module Rack
|
2
|
+
class DomainFilter
|
3
|
+
|
4
|
+
module ConfigurationDSL
|
5
|
+
def filter_for(pattern, &block)
|
6
|
+
@uri_mapping[pattern] = block
|
7
|
+
end
|
8
|
+
|
9
|
+
def after_request(&block)
|
10
|
+
@after_requests_list << block
|
11
|
+
end
|
12
|
+
|
13
|
+
def catch(klazz, &block)
|
14
|
+
@exception_catcher_mapping[klazz] = block
|
15
|
+
end
|
16
|
+
|
17
|
+
def no_match(&block)
|
18
|
+
raise 'Only allowed 1 no_match block!' if !@no_match.nil?
|
19
|
+
|
20
|
+
@no_match = block
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
# private
|
25
|
+
class Configuration
|
26
|
+
|
27
|
+
attr_accessor :uri_mapping
|
28
|
+
attr_accessor :after_requests_list
|
29
|
+
attr_accessor :exception_catcher_mapping
|
30
|
+
|
31
|
+
def initialize
|
32
|
+
@uri_mapping = {}
|
33
|
+
@after_requests_list = []
|
34
|
+
@exception_catcher_mapping = {}
|
35
|
+
@no_match = nil
|
36
|
+
end
|
37
|
+
|
38
|
+
include ConfigurationDSL
|
39
|
+
|
40
|
+
def no_match_block
|
41
|
+
@no_match
|
42
|
+
end
|
43
|
+
|
44
|
+
def allow_passthrough
|
45
|
+
@allow_passthrough = true
|
46
|
+
end
|
47
|
+
|
48
|
+
def allow_passthrough?
|
49
|
+
@allow_passthrough
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
module Rack
|
2
|
+
class DomainFilter
|
3
|
+
module Matcher
|
4
|
+
# See https://www.youtube.com/watch?v=b77V0rkr5rk
|
5
|
+
# Use host_with_port for better performance
|
6
|
+
# See: https://github.com/rack/rack/blob/master/lib/rack/request.rb
|
7
|
+
def match_uri(env)
|
8
|
+
req = Rack::Request.new(env)
|
9
|
+
config.uri_mapping.each_pair do |pattern, block|
|
10
|
+
if pattern.is_a?(String)
|
11
|
+
break if match_string(pattern, req, block)
|
12
|
+
elsif pattern.is_a?(Regexp)
|
13
|
+
break if match_regex(pattern, req, block)
|
14
|
+
else
|
15
|
+
raise "Unknown pattern: #{pattern}. It must be a regex or a string!"
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def can_respond_no_match?
|
21
|
+
!config.no_match_block.nil?
|
22
|
+
end
|
23
|
+
|
24
|
+
def trigger_no_match(env)
|
25
|
+
config.no_match_block.call(env)
|
26
|
+
end
|
27
|
+
|
28
|
+
def match_regex(regex, req, block)
|
29
|
+
matchdata = req.host_with_port.match(regex)
|
30
|
+
return if matchdata.nil?
|
31
|
+
|
32
|
+
block.call(matchdata[1], req.env)
|
33
|
+
|
34
|
+
@match_found = true
|
35
|
+
|
36
|
+
true
|
37
|
+
end
|
38
|
+
|
39
|
+
def match_string(string, req, block)
|
40
|
+
return if string != req.host_with_port
|
41
|
+
|
42
|
+
block.call(req.env)
|
43
|
+
|
44
|
+
@match_found = true
|
45
|
+
|
46
|
+
true
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
data/lib/rack/domain_filter.rb
CHANGED
@@ -1,76 +1,13 @@
|
|
1
|
+
Dir["#{File.dirname(__FILE__)}/domain_filter/ext/*.rb"].sort.each do |path|
|
2
|
+
require "rack/domain_filter/ext/#{File.basename(path, '.rb')}"
|
3
|
+
end
|
4
|
+
|
1
5
|
module Rack
|
2
6
|
class DomainFilter
|
3
|
-
|
4
|
-
module ExceptionHandler
|
5
|
-
def catch_exception(e)
|
6
|
-
config.exception_catcher_mapping.each_pair do |klazz, block|
|
7
|
-
if e.is_a?(klazz)
|
8
|
-
return block.call(e)
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
|
-
raise e
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
module AfterRequestHandler
|
17
|
-
def run_after_request
|
18
|
-
config.after_requests_list.each do |block|
|
19
|
-
block.call
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
module Matcher
|
25
|
-
# See https://www.youtube.com/watch?v=b77V0rkr5rk
|
26
|
-
# Use host_with_port for better performance
|
27
|
-
# See: https://github.com/rack/rack/blob/master/lib/rack/request.rb
|
28
|
-
def match_uri(env)
|
29
|
-
req = Rack::Request.new(env)
|
30
|
-
config.uri_mapping.each_pair do |pattern, block|
|
31
|
-
if pattern.is_a?(String)
|
32
|
-
break if match_string(pattern, req, block)
|
33
|
-
elsif pattern.is_a?(Regexp)
|
34
|
-
break if match_regex(pattern, req, block)
|
35
|
-
else
|
36
|
-
raise "Unknown pattern: #{pattern}. It must be a regex or a string!"
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
def can_respond_no_match?
|
42
|
-
!config.no_match_block.nil?
|
43
|
-
end
|
44
|
-
|
45
|
-
def trigger_no_match(env)
|
46
|
-
config.no_match_block.call(env)
|
47
|
-
end
|
48
|
-
|
49
|
-
def match_regex(regex, req, block)
|
50
|
-
matchdata = req.host_with_port.match(regex)
|
51
|
-
return if matchdata.nil?
|
52
|
-
|
53
|
-
block.call(matchdata[1], req.env)
|
54
|
-
|
55
|
-
@match_found = true
|
56
|
-
|
57
|
-
true
|
58
|
-
end
|
59
|
-
|
60
|
-
def match_string(string, req, block)
|
61
|
-
return if string != req.host_with_port
|
62
|
-
|
63
|
-
block.call(req.env)
|
64
|
-
|
65
|
-
@match_found = true
|
66
|
-
|
67
|
-
true
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
7
|
def initialize(app, options={})
|
72
8
|
@app = app
|
73
9
|
@config = options[:config] || DomainFilter.global_configuration
|
10
|
+
@match_found = false
|
74
11
|
end
|
75
12
|
|
76
13
|
def call(env)
|
@@ -118,48 +55,5 @@ module Rack
|
|
118
55
|
def verify_configuration!
|
119
56
|
|
120
57
|
end
|
121
|
-
|
122
|
-
class Configuration
|
123
|
-
|
124
|
-
attr_accessor :uri_mapping
|
125
|
-
attr_accessor :after_requests_list
|
126
|
-
attr_accessor :exception_catcher_mapping
|
127
|
-
|
128
|
-
def initialize
|
129
|
-
@uri_mapping = {}
|
130
|
-
@after_requests_list = []
|
131
|
-
@exception_catcher_mapping = {}
|
132
|
-
end
|
133
|
-
|
134
|
-
def filter_for(pattern, &block)
|
135
|
-
@uri_mapping[pattern] = block
|
136
|
-
end
|
137
|
-
|
138
|
-
def after_request(&block)
|
139
|
-
@after_requests_list << block
|
140
|
-
end
|
141
|
-
|
142
|
-
def catch(klazz, &block)
|
143
|
-
@exception_catcher_mapping[klazz] = block
|
144
|
-
end
|
145
|
-
|
146
|
-
def no_match(&block)
|
147
|
-
raise 'Only allowed 1 no_match block!' if !@no_match.nil?
|
148
|
-
|
149
|
-
@no_match = block
|
150
|
-
end
|
151
|
-
|
152
|
-
def no_match_block
|
153
|
-
@no_match
|
154
|
-
end
|
155
|
-
|
156
|
-
def allow_passthrough
|
157
|
-
@allow_passthrough = true
|
158
|
-
end
|
159
|
-
|
160
|
-
def allow_passthrough?
|
161
|
-
@allow_passthrough
|
162
|
-
end
|
163
|
-
end
|
164
58
|
end
|
165
59
|
end
|
data/rack-domain-filter.gemspec
CHANGED
@@ -4,7 +4,7 @@ require 'rack/domain_filter/version'
|
|
4
4
|
|
5
5
|
Gem::Specification.new do |spec|
|
6
6
|
spec.authors = ['Muhammad Mufid Afif']
|
7
|
-
spec.description = '
|
7
|
+
spec.description = 'Per-domain filter for Rack.'
|
8
8
|
spec.email = ['mufidafif@icloud.com']
|
9
9
|
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.start_with?('spec/') }
|
10
10
|
spec.homepage = 'https://github.com/wazaundtechnik/rack-subdomain-company'
|
@@ -16,7 +16,6 @@ Gem::Specification.new do |spec|
|
|
16
16
|
spec.version = Rack::DomainFilter::VERSION
|
17
17
|
|
18
18
|
spec.add_dependency 'rack'
|
19
|
-
spec.add_dependency 'activesupport'
|
20
19
|
|
21
20
|
# Test and build tools
|
22
21
|
# The test shouldn't broken by the incompatible RSpec version.
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rack-domain-filter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Muhammad Mufid Afif
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-04-
|
11
|
+
date: 2018-04-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rack
|
@@ -24,20 +24,6 @@ dependencies:
|
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: activesupport
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- - ">="
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: '0'
|
34
|
-
type: :runtime
|
35
|
-
prerelease: false
|
36
|
-
version_requirements: !ruby/object:Gem::Requirement
|
37
|
-
requirements:
|
38
|
-
- - ">="
|
39
|
-
- !ruby/object:Gem::Version
|
40
|
-
version: '0'
|
41
27
|
- !ruby/object:Gem::Dependency
|
42
28
|
name: bundler
|
43
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -192,7 +178,7 @@ dependencies:
|
|
192
178
|
- - ">="
|
193
179
|
- !ruby/object:Gem::Version
|
194
180
|
version: '0'
|
195
|
-
description:
|
181
|
+
description: Per-domain filter for Rack.
|
196
182
|
email:
|
197
183
|
- mufidafif@icloud.com
|
198
184
|
executables: []
|
@@ -205,6 +191,7 @@ files:
|
|
205
191
|
- ".reek"
|
206
192
|
- ".rspec"
|
207
193
|
- ".rubocop.yml"
|
194
|
+
- ".travis.yml"
|
208
195
|
- ".yardopts"
|
209
196
|
- Gemfile
|
210
197
|
- LICENSE.md
|
@@ -212,6 +199,10 @@ files:
|
|
212
199
|
- Rakefile
|
213
200
|
- lib/rack-domain-filter.rb
|
214
201
|
- lib/rack/domain_filter.rb
|
202
|
+
- lib/rack/domain_filter/ext/after_request_handler.rb
|
203
|
+
- lib/rack/domain_filter/ext/configuration.rb
|
204
|
+
- lib/rack/domain_filter/ext/exception_handler.rb
|
205
|
+
- lib/rack/domain_filter/ext/matcher.rb
|
215
206
|
- lib/rack/domain_filter/version.rb
|
216
207
|
- rack-domain-filter.gemspec
|
217
208
|
homepage: https://github.com/wazaundtechnik/rack-subdomain-company
|
@@ -237,5 +228,5 @@ rubyforge_project:
|
|
237
228
|
rubygems_version: 2.6.13
|
238
229
|
signing_key:
|
239
230
|
specification_version: 4
|
240
|
-
summary:
|
231
|
+
summary: Per-domain filter for Rack.
|
241
232
|
test_files: []
|