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