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
|