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