apiphobic-middleware 1.3.0 → 1.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 38f3144a28a7e5930de852652b7c9a41687dbc2fb2fd92b85e46c1eaa3bd68e5
4
- data.tar.gz: 0d936500afb0ef3efd63978fbcf7bfc00bccfcfd7f6a2228cddcfa83e7dc3a7a
3
+ metadata.gz: '039dac832a93a77e67edf09b2e1e547a669e81af0f4ff8ef5e8a188a77398bf8'
4
+ data.tar.gz: b7e3a83fb112a41fb340a367ac1cca30a7de7f1b3c95d44a17a6a2c864ae63dc
5
5
  SHA512:
6
- metadata.gz: efcb56a6173466a943720ae94eb095ece3f6c9aab8dffca330601976f95d820427d162ff6ffcdf7a840ca667ea2d25b5584c9561107665b1b8f74f32f2fec6dd
7
- data.tar.gz: b817f214a07895839909625b838d6007d67a8bbf2f01537b9ccdf9359d4ac131cecf0459311d316aea865dd4a187914082db3574db0142d4cf0a4c5b259be330
6
+ metadata.gz: 7a979765e449b759eac028910d132fd7838f477b327cb7c950a2fb9bf9709225d9c4cf6229a3fef466eb5f2eaafb23d141b27366f7c1f3e96bb50494c43d05cc
7
+ data.tar.gz: 90368b2578d966f0d6190ed2e721f589c3aeb644b7ee3d06e03fc32c5a33f92edbc7359d57f5c62ecebdc4c869a2bfcbce3bffe59dd1c84e1ca8ee212d18e2d7
Binary file
data.tar.gz.sig CHANGED
@@ -1,2 +1,2 @@
1
- Ӊo�ò����KD�/� >z��.@�2����'
2
- a�b~U%*���O׸=W\G���3Z���;)�(G3'K��H��"9ʅ��ј���6
1
+ lx���o!����"��ȿ����&����������O:2A��ѥ~*?��&�W�U�{�C����!��d�iu�I���&]��T|#�;�I�2x���ohy�`����P���o�kPI��v@x�"0D
2
+ $�eqz�@�#D��ꃒ�������-_�9G���P�.��1��v�/�;�B��CAlr��'ݑi�~=_���cB>������K*��\>u�>H���T ��Ǒ�X�!E���9_�B
@@ -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: allowed_api_subdomains,
18
- allowed_subdomains: allowed_subdomains,
19
- application_name: application_name,
20
- default_api_version: default_api_version,
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
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Apiphobic
4
4
  module Middleware
5
- VERSION = '1.3.0'
5
+ VERSION = '1.4.0'
6
6
  end
7
7
  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[content_parameter] = request_body_with_underscored_json_keys
24
- request['CONTENT_LENGTH'] = content_length.to_s
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 ||= if content_parameter == 'rack.input'
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
- if request['rack.input']
83
- request['rack.input'].read
84
- else
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: (env['rack.input'] || env['RACK_INPUT']).to_s,
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[content_parameter] = transformed_body
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 ||= if headers['rack.input']
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.3.0
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-21 00:00:00.000000000 Z
34
+ date: 2018-05-25 00:00:00.000000000 Z
35
35
  dependencies:
36
36
  - !ruby/object:Gem::Dependency
37
- name: apple_core
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.3'
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.3'
55
+ version: '1.0'
50
56
  - !ruby/object:Gem::Dependency
51
- name: apiphobic-tokens
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.0'
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.0'
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