hyperdrive 0.0.21 → 0.0.22

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
  SHA1:
3
- metadata.gz: ed1d1fd26b439a04e08d7fa1ba6e3106ded9bf3f
4
- data.tar.gz: 7bf1556e09a0dbcbe4bcbebdfcbad9d241fad8b9
3
+ metadata.gz: 0b5a8dba0ecc2580c9ab5880da0499cd5a9bcd8e
4
+ data.tar.gz: 8746e9594475c4297e69e2e3852d8e1bd33aeb03
5
5
  SHA512:
6
- metadata.gz: 63fc14ccc429e1a6840d83fcce3b60d8b5f2e78ae727bdc6d80c07dbc4b431a35715cc5c695187b59325b0ba8a064533edd2e006283228633ef02d0b355e94e1
7
- data.tar.gz: 75002d0ad8130aa4e186c7b5699ae5476a61107c8b7acf522d9ee42c637dae719530947b285a5acb2df69c90fccec9b848d1b28ae60dcd11038c867d836f21d0
6
+ metadata.gz: 07610251fb906637c086757dfd289c35413d4abaa79d3c676898deb14c10ed829a0a75322b2ce435dd09cd9e429b93e5c2fc2533477f17d33e9e7178b159bc35
7
+ data.tar.gz: edde3f5f65a6f0157f1c538be9b938d3500d92455025d1a843283ff5544a4c9a4fbd2efdb034b9851d7ae0d7b9c4fd2a6f5f2bccba06653fa911a350bbaba30b
@@ -1,6 +1,7 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  require 'hyperdrive/middleware/accept'
4
+ require 'hyperdrive/middleware/charset'
4
5
  require 'hyperdrive/middleware/cors'
5
6
  require 'hyperdrive/middleware/content_negotiation'
6
7
  require 'hyperdrive/middleware/error'
@@ -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
@@ -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]
@@ -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
@@ -1,3 +1,3 @@
1
1
  module Hyperdrive
2
- VERSION = "0.0.21"
2
+ VERSION = "0.0.22"
3
3
  end
@@ -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
@@ -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.21
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-09-10 00:00:00.000000000 Z
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