apiphobic-middleware 1.3.0 → 1.4.0
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
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +2 -2
- data/lib/apiphobic-middleware.rb +1 -0
- data/lib/apiphobic/middleware/configuration.rb +10 -4
- data/lib/apiphobic/middleware/converters/request_method.rb +52 -0
- data/lib/apiphobic/middleware/version.rb +1 -1
- data/lib/apiphobic/requests/transform_json_api.rb +6 -16
- data/lib/apiphobic/responses/invalid_request_body.rb +1 -1
- data/lib/apiphobic/responses/transform_json_api.rb +2 -18
- metadata +29 -14
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: '039dac832a93a77e67edf09b2e1e547a669e81af0f4ff8ef5e8a188a77398bf8'
|
4
|
+
data.tar.gz: b7e3a83fb112a41fb340a367ac1cca30a7de7f1b3c95d44a17a6a2c864ae63dc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7a979765e449b759eac028910d132fd7838f477b327cb7c950a2fb9bf9709225d9c4cf6229a3fef466eb5f2eaafb23d141b27366f7c1f3e96bb50494c43d05cc
|
7
|
+
data.tar.gz: 90368b2578d966f0d6190ed2e721f589c3aeb644b7ee3d06e03fc32c5a33f92edbc7359d57f5c62ecebdc4c869a2bfcbce3bffe59dd1c84e1ca8ee212d18e2d7
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data.tar.gz.sig
CHANGED
@@ -1,2 +1,2 @@
|
|
1
|
-
|
2
|
-
�
|
1
|
+
lx���o!����"��ȿ����&����������O:2A��ѥ~*?��&�W�U�{�C����!��d�iu�I���&]��T|#�;�I�2x���oh�y�`����P���o�kPI��v@x�"0D
|
2
|
+
$�e�qz�@�#D��ꃒ�������-_�9G���P�.��1��v�/�;�B��CA�lr��'ݑi�~=_���cB>������K*��\>u�>H���T� ��Ǒ�X�!E���9_�B
|
data/lib/apiphobic-middleware.rb
CHANGED
@@ -4,6 +4,7 @@ require 'apiphobic/matchers/version'
|
|
4
4
|
require 'apiphobic/middleware/configuration'
|
5
5
|
require 'apiphobic/middleware/converters/content_type'
|
6
6
|
require 'apiphobic/middleware/converters/json_api_parameters'
|
7
|
+
require 'apiphobic/middleware/converters/request_method'
|
7
8
|
require 'apiphobic/middleware/validators/accept_header'
|
8
9
|
require 'apiphobic/middleware/validators/authorization_token'
|
9
10
|
require 'apiphobic/middleware/validators/subdomain'
|
@@ -9,15 +9,17 @@ module Middleware
|
|
9
9
|
|
10
10
|
attr_accessor :application_name
|
11
11
|
attr_writer :allowed_api_subdomains,
|
12
|
+
:allowed_method_overrides,
|
12
13
|
:allowed_subdomains,
|
13
14
|
:default_api_version
|
14
15
|
|
15
16
|
def to_h
|
16
17
|
{
|
17
|
-
allowed_api_subdomains:
|
18
|
-
|
19
|
-
|
20
|
-
|
18
|
+
allowed_api_subdomains: allowed_api_subdomains,
|
19
|
+
allowed_method_overrides: allowed_method_overrides,
|
20
|
+
allowed_subdomains: allowed_subdomains,
|
21
|
+
application_name: application_name,
|
22
|
+
default_api_version: default_api_version,
|
21
23
|
}
|
22
24
|
end
|
23
25
|
|
@@ -25,6 +27,10 @@ module Middleware
|
|
25
27
|
@allowed_subdomains || ['api']
|
26
28
|
end
|
27
29
|
|
30
|
+
def allowed_method_overrides
|
31
|
+
@allowed_method_overrides || {}
|
32
|
+
end
|
33
|
+
|
28
34
|
def allowed_api_subdomains
|
29
35
|
@allowed_api_subdomains || ['api']
|
30
36
|
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'rack'
|
4
|
+
require 'apiphobic/middleware/configurable'
|
5
|
+
|
6
|
+
module Apiphobic
|
7
|
+
module Middleware
|
8
|
+
module Converters
|
9
|
+
class RequestMethod
|
10
|
+
include Configurable
|
11
|
+
|
12
|
+
OVERRIDE_KEY = '_method'
|
13
|
+
|
14
|
+
attr_accessor :request
|
15
|
+
|
16
|
+
def initialize(app)
|
17
|
+
@app = app
|
18
|
+
end
|
19
|
+
|
20
|
+
def call(env)
|
21
|
+
self.request = Rack::Request.new(env)
|
22
|
+
allowed_overrides = configuration.allowed_method_overrides
|
23
|
+
|
24
|
+
allowed_overrides.each do |path_pattern, method_mappings|
|
25
|
+
path_pattern = path_pattern
|
26
|
+
.gsub(':uuid', '[0-9a-f]{8}\\-(?:[0-9a-f]{4}\\-){3}[0-9a-f]{12}')
|
27
|
+
|
28
|
+
next unless env['PATH_INFO'] =~ Regexp.new("\\A#{path_pattern}\\z")
|
29
|
+
|
30
|
+
method_mappings.each do |from, to|
|
31
|
+
next unless from.include?(env['REQUEST_METHOD'].downcase)
|
32
|
+
next unless to.include?(overridden_method.downcase)
|
33
|
+
|
34
|
+
env['rack.methodoverride.original_method'] = env['REQUEST_METHOD']
|
35
|
+
env['REQUEST_METHOD'] = overridden_method.upcase
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
@app.call(env)
|
40
|
+
end
|
41
|
+
|
42
|
+
private
|
43
|
+
|
44
|
+
def overridden_method
|
45
|
+
@overridden_method ||= (request.query_string && request.GET[OVERRIDE_KEY]) ||
|
46
|
+
(request.body && request.POST[OVERRIDE_KEY]) ||
|
47
|
+
''
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -20,8 +20,8 @@ class TransformJsonApi
|
|
20
20
|
request['QUERY_STRING'] = query_string_with_underscored_parameters
|
21
21
|
|
22
22
|
if has_content? && json?
|
23
|
-
request[
|
24
|
-
request['CONTENT_LENGTH']
|
23
|
+
request['rack.input'] = request_body_with_underscored_json_keys
|
24
|
+
request['CONTENT_LENGTH'] = content_length.to_s
|
25
25
|
end
|
26
26
|
|
27
27
|
request
|
@@ -41,16 +41,8 @@ class TransformJsonApi
|
|
41
41
|
underscored_request_json.bytesize
|
42
42
|
end
|
43
43
|
|
44
|
-
def content_parameter
|
45
|
-
request['rack.input'] ? 'rack.input' : 'RACK_INPUT'
|
46
|
-
end
|
47
|
-
|
48
44
|
def request_body_with_underscored_json_keys
|
49
|
-
@request_body_with_underscored_json_keys ||=
|
50
|
-
StringIO.new(underscored_request_json)
|
51
|
-
else
|
52
|
-
underscored_request_json
|
53
|
-
end
|
45
|
+
@request_body_with_underscored_json_keys ||= StringIO.new(underscored_request_json)
|
54
46
|
end
|
55
47
|
|
56
48
|
def query_string_with_underscored_parameters
|
@@ -79,11 +71,9 @@ class TransformJsonApi
|
|
79
71
|
end
|
80
72
|
|
81
73
|
def request_body
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
request['RACK_INPUT'].to_s
|
86
|
-
end
|
74
|
+
request['rack.input']&.read.to_s
|
75
|
+
ensure
|
76
|
+
request['rack.input']&.rewind
|
87
77
|
end
|
88
78
|
|
89
79
|
def query_string
|
@@ -8,7 +8,7 @@ module Responses
|
|
8
8
|
class InvalidRequestBody < Responses::Invalid
|
9
9
|
def self.call(env)
|
10
10
|
error ||= Errors::InvalidRequestBody.new(
|
11
|
-
request_body:
|
11
|
+
request_body: env['rack.input'].read,
|
12
12
|
)
|
13
13
|
|
14
14
|
super(env, error: error)
|
@@ -24,19 +24,11 @@ class TransformJsonApi
|
|
24
24
|
private
|
25
25
|
|
26
26
|
def transformed_headers
|
27
|
-
headers[
|
27
|
+
headers['rack.input'] = StringIO.new(transformed_json_body)
|
28
28
|
|
29
29
|
headers
|
30
30
|
end
|
31
31
|
|
32
|
-
def transformed_body
|
33
|
-
if content_parameter == 'rack.input'
|
34
|
-
StringIO.new(transformed_json_body)
|
35
|
-
else
|
36
|
-
transformed_json_body
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
32
|
def transformed_json_body
|
41
33
|
return request_body if request_body == '' || request_body.nil?
|
42
34
|
|
@@ -50,20 +42,12 @@ class TransformJsonApi
|
|
50
42
|
JSON.dump(request_hash)
|
51
43
|
end
|
52
44
|
|
53
|
-
def content_parameter
|
54
|
-
headers['rack.input'] ? 'rack.input' : 'RACK_INPUT'
|
55
|
-
end
|
56
|
-
|
57
45
|
def request_hash
|
58
46
|
@request_hash ||= JSON.parse(request_body)
|
59
47
|
end
|
60
48
|
|
61
49
|
def request_body
|
62
|
-
@request_body ||=
|
63
|
-
headers['rack.input'].read
|
64
|
-
else
|
65
|
-
headers['RACK_INPUT'].to_s
|
66
|
-
end
|
50
|
+
@request_body ||= headers['rack.input']&.read.to_s
|
67
51
|
ensure
|
68
52
|
headers['rack.input']&.rewind
|
69
53
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: apiphobic-middleware
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- thegranddesign
|
@@ -31,42 +31,42 @@ cert_chain:
|
|
31
31
|
Y2GAoHKstmfIVhc4XHOPpmTd2o/C29O9oaRgjrkfQEhF/KvJ/PhoV5hvokzsCyI5
|
32
32
|
iUeXPfvrGD/itYIBCgk+fnzyQQ4QtE5hTQaWQ3o2
|
33
33
|
-----END CERTIFICATE-----
|
34
|
-
date: 2018-05-
|
34
|
+
date: 2018-05-25 00:00:00.000000000 Z
|
35
35
|
dependencies:
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
|
-
name:
|
37
|
+
name: apiphobic-tokens
|
38
38
|
requirement: !ruby/object:Gem::Requirement
|
39
39
|
requirements:
|
40
|
+
- - ">="
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
version: 1.0.1
|
40
43
|
- - "~>"
|
41
44
|
- !ruby/object:Gem::Version
|
42
|
-
version: '1.
|
45
|
+
version: '1.0'
|
43
46
|
type: :runtime
|
44
47
|
prerelease: false
|
45
48
|
version_requirements: !ruby/object:Gem::Requirement
|
46
49
|
requirements:
|
50
|
+
- - ">="
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: 1.0.1
|
47
53
|
- - "~>"
|
48
54
|
- !ruby/object:Gem::Version
|
49
|
-
version: '1.
|
55
|
+
version: '1.0'
|
50
56
|
- !ruby/object:Gem::Dependency
|
51
|
-
name:
|
57
|
+
name: apple_core
|
52
58
|
requirement: !ruby/object:Gem::Requirement
|
53
59
|
requirements:
|
54
|
-
- - ">="
|
55
|
-
- !ruby/object:Gem::Version
|
56
|
-
version: 1.0.1
|
57
60
|
- - "~>"
|
58
61
|
- !ruby/object:Gem::Version
|
59
|
-
version: '1.
|
62
|
+
version: '1.3'
|
60
63
|
type: :runtime
|
61
64
|
prerelease: false
|
62
65
|
version_requirements: !ruby/object:Gem::Requirement
|
63
66
|
requirements:
|
64
|
-
- - ">="
|
65
|
-
- !ruby/object:Gem::Version
|
66
|
-
version: 1.0.1
|
67
67
|
- - "~>"
|
68
68
|
- !ruby/object:Gem::Version
|
69
|
-
version: '1.
|
69
|
+
version: '1.3'
|
70
70
|
- !ruby/object:Gem::Dependency
|
71
71
|
name: erratum
|
72
72
|
requirement: !ruby/object:Gem::Requirement
|
@@ -87,6 +87,20 @@ dependencies:
|
|
87
87
|
- - "~>"
|
88
88
|
- !ruby/object:Gem::Version
|
89
89
|
version: '3.1'
|
90
|
+
- !ruby/object:Gem::Dependency
|
91
|
+
name: rack
|
92
|
+
requirement: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '2.0'
|
97
|
+
type: :runtime
|
98
|
+
prerelease: false
|
99
|
+
version_requirements: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '2.0'
|
90
104
|
- !ruby/object:Gem::Dependency
|
91
105
|
name: rspec
|
92
106
|
requirement: !ruby/object:Gem::Requirement
|
@@ -150,6 +164,7 @@ files:
|
|
150
164
|
- lib/apiphobic/middleware/configuration.rb
|
151
165
|
- lib/apiphobic/middleware/converters/content_type.rb
|
152
166
|
- lib/apiphobic/middleware/converters/json_api_parameters.rb
|
167
|
+
- lib/apiphobic/middleware/converters/request_method.rb
|
153
168
|
- lib/apiphobic/middleware/validators/accept_header.rb
|
154
169
|
- lib/apiphobic/middleware/validators/authorization_token.rb
|
155
170
|
- lib/apiphobic/middleware/validators/subdomain.rb
|
metadata.gz.sig
CHANGED
Binary file
|