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 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