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 |