apill 4.0.0 → 4.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/apill/matchers/accept_header.rb +3 -1
- data/lib/apill/matchers/generic.rb +12 -4
- data/lib/apill/matchers/subdomain.rb +7 -5
- data/lib/apill/matchers/version.rb +3 -1
- data/lib/apill/middleware/api_request.rb +5 -5
- data/lib/apill/version.rb +1 -1
- data/spec/apill/matchers/accept_header_spec.rb +14 -14
- data/spec/apill/matchers/subdomain_spec.rb +16 -20
- data/spec/apill/matchers/version_spec.rb +10 -15
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 03e1a8c3d7621029eab5a87a4180786a121230f9
|
4
|
+
data.tar.gz: 434bd913e8c60b006c33f4144a22a5ac5917ae28
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b9ac29a6cc63975df8d0b54b3b369fd54be33c675a81fad922221877c65812cf681d40346363c4b249341e3b91e78d8bc0b012c25e095a9be01a2d8a3340995a
|
7
|
+
data.tar.gz: 79b641b0689d7ae9e4c2ed79f17c370b212ac775ae09a701e5c6563901d291088b9f8be4ce63cd19dc7052d1f72d3730467b503ecda8e25bf6f433b24be095ff
|
@@ -5,14 +5,22 @@ module Generic
|
|
5
5
|
:accept_header,
|
6
6
|
:request
|
7
7
|
|
8
|
-
def initialize(
|
8
|
+
def initialize(**args)
|
9
9
|
args.each do |variable, value|
|
10
10
|
__send__("#{variable}=", value)
|
11
11
|
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def matches?(request)
|
15
|
+
self.request = request
|
16
|
+
end
|
17
|
+
|
18
|
+
def application
|
19
|
+
request.application_name
|
20
|
+
end
|
12
21
|
|
13
|
-
|
14
|
-
|
15
|
-
self.accept_header = request.accept_header
|
22
|
+
def accept_header
|
23
|
+
request.accept_header
|
16
24
|
end
|
17
25
|
end
|
18
26
|
end
|
@@ -2,19 +2,21 @@ module Apill
|
|
2
2
|
module Matchers
|
3
3
|
class Subdomain
|
4
4
|
def initialize(allowed_subdomains: Apill.configuration.allowed_subdomains,
|
5
|
-
allowed_api_subdomains: Apill.configuration.allowed_api_subdomains
|
6
|
-
request:)
|
5
|
+
allowed_api_subdomains: Apill.configuration.allowed_api_subdomains)
|
7
6
|
|
8
7
|
self.allowed_subdomains = Array(allowed_subdomains)
|
9
8
|
self.allowed_api_subdomains = Array(allowed_api_subdomains)
|
10
|
-
self.request = request
|
11
9
|
end
|
12
10
|
|
13
|
-
def matches?
|
11
|
+
def matches?(request)
|
12
|
+
self.request = request
|
13
|
+
|
14
14
|
allowed_subdomains.include? request.subdomain
|
15
15
|
end
|
16
16
|
|
17
|
-
def matches_api_subdomain?
|
17
|
+
def matches_api_subdomain?(request)
|
18
|
+
self.request = request
|
19
|
+
|
18
20
|
allowed_api_subdomains.include? request.subdomain
|
19
21
|
end
|
20
22
|
|
@@ -19,13 +19,13 @@ class ApiRequest
|
|
19
19
|
env['HTTP_X_APPLICATION_NAME'] = Apill.configuration.application_name
|
20
20
|
|
21
21
|
request = Requests::Base.resolve(env)
|
22
|
-
subdomain_matcher = Matchers::Subdomain.new
|
23
|
-
accept_header_matcher = Matchers::AcceptHeader.new
|
22
|
+
subdomain_matcher = Matchers::Subdomain.new
|
23
|
+
accept_header_matcher = Matchers::AcceptHeader.new
|
24
24
|
token = request.authorization_token
|
25
25
|
|
26
|
-
return Responses::InvalidSubdomain.call(env) unless subdomain_matcher.matches?
|
27
|
-
return Responses::InvalidApiRequest.call(env) unless !subdomain_matcher.matches_api_subdomain? ||
|
28
|
-
accept_header_matcher.matches?
|
26
|
+
return Responses::InvalidSubdomain.call(env) unless subdomain_matcher.matches?(request)
|
27
|
+
return Responses::InvalidApiRequest.call(env) unless !subdomain_matcher.matches_api_subdomain?(request) ||
|
28
|
+
accept_header_matcher.matches?(request)
|
29
29
|
return Responses::InvalidToken.call(env) unless token.valid?
|
30
30
|
|
31
31
|
env['HTTP_X_JSON_WEB_TOKEN'] = token.to_h
|
data/lib/apill/version.rb
CHANGED
@@ -12,9 +12,9 @@ describe AcceptHeader do
|
|
12
12
|
}
|
13
13
|
request = Requests::Base.resolve(env)
|
14
14
|
|
15
|
-
matcher = AcceptHeader.new
|
15
|
+
matcher = AcceptHeader.new
|
16
16
|
|
17
|
-
expect(matcher).to
|
17
|
+
expect(matcher.matches?(request)).to be_a TrueClass
|
18
18
|
end
|
19
19
|
|
20
20
|
it 'matches if the subdomain is API and the accept header is passed in as ' \
|
@@ -26,9 +26,9 @@ describe AcceptHeader do
|
|
26
26
|
}
|
27
27
|
request = Requests::Base.resolve(env)
|
28
28
|
|
29
|
-
matcher = AcceptHeader.new
|
29
|
+
matcher = AcceptHeader.new
|
30
30
|
|
31
|
-
expect(matcher).to
|
31
|
+
expect(matcher.matches?(request)).to be_a TrueClass
|
32
32
|
end
|
33
33
|
|
34
34
|
it 'matches if the subdomain is API and the accept header is passed in as a ' \
|
@@ -41,9 +41,9 @@ describe AcceptHeader do
|
|
41
41
|
}
|
42
42
|
request = Requests::Base.resolve(env)
|
43
43
|
|
44
|
-
matcher = AcceptHeader.new
|
44
|
+
matcher = AcceptHeader.new
|
45
45
|
|
46
|
-
expect(matcher).to
|
46
|
+
expect(matcher.matches?(request)).to be_a TrueClass
|
47
47
|
end
|
48
48
|
|
49
49
|
it 'matches the header accept header if the subdomain is API and the accept header ' \
|
@@ -56,8 +56,8 @@ describe AcceptHeader do
|
|
56
56
|
}
|
57
57
|
request = Requests::Base.resolve(env)
|
58
58
|
|
59
|
-
matcher = AcceptHeader.new
|
60
|
-
matcher.matches?
|
59
|
+
matcher = AcceptHeader.new
|
60
|
+
matcher.matches?(request)
|
61
61
|
|
62
62
|
expect(matcher.accept_header.version).to eql '1.0.0'
|
63
63
|
end
|
@@ -72,8 +72,8 @@ describe AcceptHeader do
|
|
72
72
|
}
|
73
73
|
request = Requests::Base.resolve(env)
|
74
74
|
|
75
|
-
matcher = AcceptHeader.new
|
76
|
-
matcher.matches?
|
75
|
+
matcher = AcceptHeader.new
|
76
|
+
matcher.matches?(request)
|
77
77
|
|
78
78
|
expect(matcher.accept_header.version).to eql '2.0.0'
|
79
79
|
end
|
@@ -88,8 +88,8 @@ describe AcceptHeader do
|
|
88
88
|
}
|
89
89
|
request = Requests::Base.resolve(env)
|
90
90
|
|
91
|
-
matcher = AcceptHeader.new
|
92
|
-
matcher.matches?
|
91
|
+
matcher = AcceptHeader.new
|
92
|
+
matcher.matches?(request)
|
93
93
|
|
94
94
|
expect(matcher.accept_header.raw_accept_header).to eql \
|
95
95
|
'application/vndmatrix+zion;version=1.0.0'
|
@@ -103,9 +103,9 @@ describe AcceptHeader do
|
|
103
103
|
}
|
104
104
|
request = Requests::Base.resolve(env)
|
105
105
|
|
106
|
-
matcher = AcceptHeader.new
|
106
|
+
matcher = AcceptHeader.new
|
107
107
|
|
108
|
-
expect(matcher).
|
108
|
+
expect(matcher.matches?(request)).to be_a FalseClass
|
109
109
|
end
|
110
110
|
end
|
111
111
|
end
|
@@ -14,67 +14,63 @@ describe Subdomain do
|
|
14
14
|
it 'matches if the subdomain is API' do
|
15
15
|
env = { 'HTTP_HOST' => 'api.example.com' }
|
16
16
|
request = Requests::Base.resolve(env)
|
17
|
-
matcher = Subdomain.new
|
17
|
+
matcher = Subdomain.new
|
18
18
|
|
19
|
-
expect(matcher.matches?).to be_a TrueClass
|
19
|
+
expect(matcher.matches?(request)).to be_a TrueClass
|
20
20
|
end
|
21
21
|
|
22
22
|
it 'matches if the first subdomain is API' do
|
23
23
|
env = { 'HTTP_HOST' => 'api.matrix.example.com' }
|
24
24
|
request = Requests::Base.resolve(env)
|
25
|
-
matcher = Subdomain.new
|
25
|
+
matcher = Subdomain.new
|
26
26
|
|
27
|
-
expect(matcher.matches?).to be_a TrueClass
|
27
|
+
expect(matcher.matches?(request)).to be_a TrueClass
|
28
28
|
end
|
29
29
|
|
30
30
|
it 'does not match if the first subdomain is not API' do
|
31
31
|
env = { 'HTTP_HOST' => 'matrix.example.com' }
|
32
32
|
request = Requests::Base.resolve(env)
|
33
|
-
matcher = Subdomain.new
|
33
|
+
matcher = Subdomain.new
|
34
34
|
|
35
|
-
expect(matcher.matches?).to be_a FalseClass
|
35
|
+
expect(matcher.matches?(request)).to be_a FalseClass
|
36
36
|
end
|
37
37
|
|
38
38
|
it 'allows the matched subdomain to be specified' do
|
39
39
|
env = { 'HTTP_HOST' => 'matrix.example.com' }
|
40
40
|
request = Requests::Base.resolve(env)
|
41
|
-
matcher = Subdomain.new(allowed_subdomains: 'matrix'
|
42
|
-
request: request)
|
41
|
+
matcher = Subdomain.new(allowed_subdomains: 'matrix')
|
43
42
|
|
44
|
-
expect(matcher.matches?).to be_a TrueClass
|
43
|
+
expect(matcher.matches?(request)).to be_a TrueClass
|
45
44
|
end
|
46
45
|
|
47
46
|
it 'allows more than one subdomain to be matched' do
|
48
47
|
env = { 'HTTP_HOST' => 'matrix.example.com' }
|
49
48
|
request = Requests::Base.resolve(env)
|
50
|
-
matcher = Subdomain.new(allowed_subdomains: %w{api matrix}
|
51
|
-
request: request)
|
49
|
+
matcher = Subdomain.new(allowed_subdomains: %w{api matrix})
|
52
50
|
|
53
|
-
expect(matcher.matches?).to be_a TrueClass
|
51
|
+
expect(matcher.matches?(request)).to be_a TrueClass
|
54
52
|
|
55
53
|
env = { 'HTTP_HOST' => 'api.example.com' }
|
56
54
|
request = Requests::Base.resolve(env)
|
57
|
-
matcher = Subdomain.new(allowed_subdomains: %w{api matrix}
|
58
|
-
request: request)
|
55
|
+
matcher = Subdomain.new(allowed_subdomains: %w{api matrix})
|
59
56
|
|
60
|
-
expect(matcher.matches?).to be_a TrueClass
|
57
|
+
expect(matcher.matches?(request)).to be_a TrueClass
|
61
58
|
end
|
62
59
|
|
63
60
|
it 'can match only the api subdomain' do
|
64
61
|
env = { 'HTTP_HOST' => 'matrix.example.com' }
|
65
62
|
request = Requests::Base.resolve(env)
|
66
|
-
matcher = Subdomain.new(allowed_api_subdomains: %w{matrix}
|
67
|
-
request: request)
|
63
|
+
matcher = Subdomain.new(allowed_api_subdomains: %w{matrix})
|
68
64
|
|
69
|
-
expect(matcher.matches_api_subdomain?).to be_a TrueClass
|
65
|
+
expect(matcher.matches_api_subdomain?(request)).to be_a TrueClass
|
70
66
|
end
|
71
67
|
|
72
68
|
it 'matches "api" as an api subdomain by default' do
|
73
69
|
env = { 'HTTP_HOST' => 'api.example.com' }
|
74
70
|
request = Requests::Base.resolve(env)
|
75
|
-
matcher = Subdomain.new
|
71
|
+
matcher = Subdomain.new
|
76
72
|
|
77
|
-
expect(matcher.matches_api_subdomain?).to be_a TrueClass
|
73
|
+
expect(matcher.matches_api_subdomain?(request)).to be_a TrueClass
|
78
74
|
end
|
79
75
|
end
|
80
76
|
end
|
@@ -15,10 +15,9 @@ describe Version do
|
|
15
15
|
}
|
16
16
|
request = Requests::Base.resolve(env)
|
17
17
|
|
18
|
-
matcher = Version.new(
|
19
|
-
version_constraint: '10.1')
|
18
|
+
matcher = Version.new(version_constraint: '10.1')
|
20
19
|
|
21
|
-
expect(matcher).
|
20
|
+
expect(matcher.matches?(request)).to be_a FalseClass
|
22
21
|
end
|
23
22
|
|
24
23
|
it 'does match if the subdomain is API and the requested version equals the ' \
|
@@ -30,10 +29,9 @@ describe Version do
|
|
30
29
|
}
|
31
30
|
request = Requests::Base.resolve(env)
|
32
31
|
|
33
|
-
matcher = Version.new(
|
34
|
-
version_constraint: '10.0')
|
32
|
+
matcher = Version.new(version_constraint: '10.0')
|
35
33
|
|
36
|
-
expect(matcher).to
|
34
|
+
expect(matcher.matches?(request)).to be_a TrueClass
|
37
35
|
end
|
38
36
|
end
|
39
37
|
|
@@ -47,11 +45,10 @@ describe Version do
|
|
47
45
|
}
|
48
46
|
request = Requests::Base.resolve(env)
|
49
47
|
|
50
|
-
matcher = Version.new(
|
51
|
-
version_constraint: '10.1',
|
48
|
+
matcher = Version.new(version_constraint: '10.1',
|
52
49
|
default_version: '10.0')
|
53
50
|
|
54
|
-
expect(matcher).
|
51
|
+
expect(matcher.matches?(request)).to be_a FalseClass
|
55
52
|
end
|
56
53
|
|
57
54
|
it 'does match if the subdomain is API and the requested version equals the ' \
|
@@ -63,11 +60,10 @@ describe Version do
|
|
63
60
|
}
|
64
61
|
request = Requests::Base.resolve(env)
|
65
62
|
|
66
|
-
matcher = Version.new(
|
67
|
-
version_constraint: '10.0',
|
63
|
+
matcher = Version.new(version_constraint: '10.0',
|
68
64
|
default_version: '10.0')
|
69
65
|
|
70
|
-
expect(matcher).to
|
66
|
+
expect(matcher.matches?(request)).to be_a TrueClass
|
71
67
|
end
|
72
68
|
end
|
73
69
|
|
@@ -80,10 +76,9 @@ describe Version do
|
|
80
76
|
}
|
81
77
|
request = Requests::Base.resolve(env)
|
82
78
|
|
83
|
-
matcher = Version.new(
|
84
|
-
version_constraint: '100.0')
|
79
|
+
matcher = Version.new(version_constraint: '100.0')
|
85
80
|
|
86
|
-
expect(matcher).to
|
81
|
+
expect(matcher.matches?(request)).to be_a TrueClass
|
87
82
|
end
|
88
83
|
end
|
89
84
|
end
|