hyperdrive 0.0.21 → 0.0.22
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
- data/lib/hyperdrive/middleware.rb +1 -0
- data/lib/hyperdrive/middleware/charset.rb +19 -0
- data/lib/hyperdrive/server.rb +1 -0
- data/lib/hyperdrive/utils.rb +17 -0
- data/lib/hyperdrive/version.rb +1 -1
- data/spec/hyperdrive/middleware/charset_spec.rb +22 -0
- data/spec/hyperdrive/utils_spec.rb +24 -0
- data/spec/spec_helper.rb +3 -0
- metadata +5 -2
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 0b5a8dba0ecc2580c9ab5880da0499cd5a9bcd8e
         | 
| 4 | 
            +
              data.tar.gz: 8746e9594475c4297e69e2e3852d8e1bd33aeb03
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 07610251fb906637c086757dfd289c35413d4abaa79d3c676898deb14c10ed829a0a75322b2ce435dd09cd9e429b93e5c2fc2533477f17d33e9e7178b159bc35
         | 
| 7 | 
            +
              data.tar.gz: edde3f5f65a6f0157f1c538be9b938d3500d92455025d1a843283ff5544a4c9a4fbd2efdb034b9851d7ae0d7b9c4fd2a6f5f2bccba06653fa911a350bbaba30b
         | 
| @@ -0,0 +1,19 @@ | |
| 1 | 
            +
            # encoding: utf-8
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module Hyperdrive
         | 
| 4 | 
            +
              module Middleware
         | 
| 5 | 
            +
                class Charset
         | 
| 6 | 
            +
                  def initialize(app)
         | 
| 7 | 
            +
                    @app = app
         | 
| 8 | 
            +
                  end
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                  def call(env)
         | 
| 11 | 
            +
                    unless %w(OPTIONS TRACE).include? env['REQUEST_METHOD']
         | 
| 12 | 
            +
                      charset = Rack::Accept::Charset.new(env['HTTP_ACCEPT_CHARSET'])
         | 
| 13 | 
            +
                      Hyperdrive::Utils.enforce_charset!(charset, env['hyperdrive.params'])
         | 
| 14 | 
            +
                    end
         | 
| 15 | 
            +
                    @app.call(env)
         | 
| 16 | 
            +
                  end
         | 
| 17 | 
            +
                end
         | 
| 18 | 
            +
              end
         | 
| 19 | 
            +
            end
         | 
    
        data/lib/hyperdrive/server.rb
    CHANGED
    
    | @@ -30,6 +30,7 @@ module Hyperdrive | |
| 30 30 | 
             
                        use Hyperdrive::Middleware::RequestMethod
         | 
| 31 31 | 
             
                        use Hyperdrive::Middleware::ParseJSONBody
         | 
| 32 32 | 
             
                        use Hyperdrive::Middleware::SanitizeParams
         | 
| 33 | 
            +
                        use Hyperdrive::Middleware::Charset
         | 
| 33 34 | 
             
                        use Hyperdrive::Middleware::Pagination
         | 
| 34 35 | 
             
                        use Hyperdrive::Middleware::RequiredParams
         | 
| 35 36 | 
             
                        use Hyperdrive::Middleware::CORS, hyperdrive.config[:cors]
         | 
    
        data/lib/hyperdrive/utils.rb
    CHANGED
    
    | @@ -23,5 +23,22 @@ module Hyperdrive | |
| 23 23 | 
             
                    ])
         | 
| 24 24 | 
             
                  end
         | 
| 25 25 | 
             
                end
         | 
| 26 | 
            +
             | 
| 27 | 
            +
                def self.enforce_charset!(charset, params)
         | 
| 28 | 
            +
                  encoding = charset.value == '*' ? 'UTF-8' : find_encoding(charset.value)
         | 
| 29 | 
            +
                  params.each_value do |value|
         | 
| 30 | 
            +
                    value.encode!(encoding) if value.is_a? String
         | 
| 31 | 
            +
                  end
         | 
| 32 | 
            +
                end
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                private
         | 
| 35 | 
            +
             | 
| 36 | 
            +
                def self.find_encoding(charset_value)
         | 
| 37 | 
            +
                  begin
         | 
| 38 | 
            +
                    Encoding.find(charset_value)
         | 
| 39 | 
            +
                  rescue
         | 
| 40 | 
            +
                    raise Hyperdrive::Errors::NotAcceptable.new(charset_value)
         | 
| 41 | 
            +
                  end
         | 
| 42 | 
            +
                end
         | 
| 26 43 | 
             
              end
         | 
| 27 44 | 
             
            end
         | 
    
        data/lib/hyperdrive/version.rb
    CHANGED
    
    
| @@ -0,0 +1,22 @@ | |
| 1 | 
            +
            # encoding: utf-8
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            require 'spec_helper'
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            describe Hyperdrive::Middleware::Charset do
         | 
| 6 | 
            +
             | 
| 7 | 
            +
              def app
         | 
| 8 | 
            +
                inner_app = ->(env) { [200, {}, [env['hyperdrive.params']]] }
         | 
| 9 | 
            +
                Hyperdrive::Middleware::Charset.new(inner_app)
         | 
| 10 | 
            +
              end
         | 
| 11 | 
            +
             | 
| 12 | 
            +
              before do
         | 
| 13 | 
            +
                @env = default_rack_env(default_resource).merge('hyperdrive.params' => {})
         | 
| 14 | 
            +
                @env.merge!('REQUEST_METHOD' => 'POST')
         | 
| 15 | 
            +
                @params = { id: '1001', name: 'John Connor'.encode('ASCII-8BIT') }
         | 
| 16 | 
            +
              end
         | 
| 17 | 
            +
             | 
| 18 | 
            +
              it "will enforce accept-charset encoding on param values" do
         | 
| 19 | 
            +
                post '/', @params, @env.merge('hyperdrive.params' => @params)
         | 
| 20 | 
            +
                last_response.body.must_equal "{:id=>\"1001\", :name=>\"John Connor\"}"
         | 
| 21 | 
            +
              end
         | 
| 22 | 
            +
            end
         | 
| @@ -39,4 +39,28 @@ describe Hyperdrive::Utils do | |
| 39 39 | 
             
                  @subject[:collection].first[:skylanders].must_equal 155
         | 
| 40 40 | 
             
                end
         | 
| 41 41 | 
             
              end
         | 
| 42 | 
            +
             | 
| 43 | 
            +
              context '.enforce_charset!' do
         | 
| 44 | 
            +
                before do
         | 
| 45 | 
            +
                  @params = { id: '1001', name: 'John Connor'.encode('ASCII-8BIT') }
         | 
| 46 | 
            +
                end
         | 
| 47 | 
            +
             | 
| 48 | 
            +
                it 'enforces a specific encoding' do
         | 
| 49 | 
            +
                  encoding = Rack::Accept::Charset.new('ISO-8859-1')
         | 
| 50 | 
            +
                  Hyperdrive::Utils.enforce_charset!(encoding, @params)
         | 
| 51 | 
            +
                  @params[:name].encoding.must_equal Encoding.find('ISO-8859-1')
         | 
| 52 | 
            +
                end
         | 
| 53 | 
            +
             | 
| 54 | 
            +
                it 'enforces a default encoding' do
         | 
| 55 | 
            +
                  encoding = Rack::Accept::Charset.new('*')
         | 
| 56 | 
            +
                  Hyperdrive::Utils.enforce_charset!(encoding, @params)
         | 
| 57 | 
            +
                  @params[:name].encoding.must_equal Encoding.find('UTF-8')
         | 
| 58 | 
            +
                end
         | 
| 59 | 
            +
             | 
| 60 | 
            +
                it 'raises an exception for an invalid encoding' do
         | 
| 61 | 
            +
                  encoding = Rack::Accept::Charset.new('nonsense')
         | 
| 62 | 
            +
                  -> { Hyperdrive::Utils.enforce_charset!(encoding, @params) }
         | 
| 63 | 
            +
                    .must_raise Hyperdrive::Errors::NotAcceptable
         | 
| 64 | 
            +
                end
         | 
| 65 | 
            +
              end
         | 
| 42 66 | 
             
            end
         | 
    
        data/spec/spec_helper.rb
    CHANGED
    
    | @@ -32,7 +32,9 @@ module Hyperdrive | |
| 32 32 | 
             
                def default_hyperdrive_env
         | 
| 33 33 | 
             
                  {
         | 
| 34 34 | 
             
                    'HTTP_ACCEPT' => 'application/vnd.hyperdrive.things+hal+json',
         | 
| 35 | 
            +
                    'HTTP_ACCEPT_CHARSET' => 'UTF-8',
         | 
| 35 36 | 
             
                    'hyperdrive.accept' => Rack::Accept::MediaType.new('HTTP_ACCEPT' => 'application/vnd.hyperdrive.things+hal+json;q=0.8'),
         | 
| 37 | 
            +
                    'hyperdrive.accept_charset' => Rack::Accept::Charset.new('HTTP_ACCEPT_CHARSET' => 'UTF-8'),
         | 
| 36 38 | 
             
                    'hyperdrive.resource' => hyperdrive.resources[:things],
         | 
| 37 39 | 
             
                    'hyperdrive.media_type' => 'application/vnd.hyperdrive.things+hal+json'
         | 
| 38 40 | 
             
                  }
         | 
| @@ -54,6 +56,7 @@ module Hyperdrive | |
| 54 56 | 
             
                    'hyperdrive.media_type' => 'application/vnd.hyperdrive.things+hal+json'
         | 
| 55 57 | 
             
                  }
         | 
| 56 58 | 
             
                  default_env.merge!('hyperdrive.accept' => Rack::Accept::MediaType.new(default_env['HTTP_ACCEPT']))
         | 
| 59 | 
            +
                  default_env.merge!('hyperdrive.accept_charset' => Rack::Accept::Charset.new(default_env['HTTP_ACCEPT_CHARSET']))
         | 
| 57 60 | 
             
                  default_env.merge!('hyperdrive.resource' => resource) if resource
         | 
| 58 61 | 
             
                  default_env
         | 
| 59 62 | 
             
                end
         | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: hyperdrive
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0.0. | 
| 4 | 
            +
              version: 0.0.22
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - StyleSeek Engineering
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2014- | 
| 11 | 
            +
            date: 2014-10-03 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: linguistics
         | 
| @@ -151,6 +151,7 @@ files: | |
| 151 151 | 
             
            - lib/hyperdrive/instrumenters/noop.rb
         | 
| 152 152 | 
             
            - lib/hyperdrive/middleware.rb
         | 
| 153 153 | 
             
            - lib/hyperdrive/middleware/accept.rb
         | 
| 154 | 
            +
            - lib/hyperdrive/middleware/charset.rb
         | 
| 154 155 | 
             
            - lib/hyperdrive/middleware/content_negotiation.rb
         | 
| 155 156 | 
             
            - lib/hyperdrive/middleware/cors.rb
         | 
| 156 157 | 
             
            - lib/hyperdrive/middleware/error.rb
         | 
| @@ -188,6 +189,7 @@ files: | |
| 188 189 | 
             
            - spec/hyperdrive/instrumenters/memory_spec.rb
         | 
| 189 190 | 
             
            - spec/hyperdrive/instrumenters/noop_spec.rb
         | 
| 190 191 | 
             
            - spec/hyperdrive/middleware/accept_spec.rb
         | 
| 192 | 
            +
            - spec/hyperdrive/middleware/charset_spec.rb
         | 
| 191 193 | 
             
            - spec/hyperdrive/middleware/content_negotiation_spec.rb
         | 
| 192 194 | 
             
            - spec/hyperdrive/middleware/cors_spec.rb
         | 
| 193 195 | 
             
            - spec/hyperdrive/middleware/error_spec.rb
         | 
| @@ -250,6 +252,7 @@ test_files: | |
| 250 252 | 
             
            - spec/hyperdrive/instrumenters/memory_spec.rb
         | 
| 251 253 | 
             
            - spec/hyperdrive/instrumenters/noop_spec.rb
         | 
| 252 254 | 
             
            - spec/hyperdrive/middleware/accept_spec.rb
         | 
| 255 | 
            +
            - spec/hyperdrive/middleware/charset_spec.rb
         | 
| 253 256 | 
             
            - spec/hyperdrive/middleware/content_negotiation_spec.rb
         | 
| 254 257 | 
             
            - spec/hyperdrive/middleware/cors_spec.rb
         | 
| 255 258 | 
             
            - spec/hyperdrive/middleware/error_spec.rb
         |