rack-parser 0.6.1 → 0.7.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +1 -1
- data/README.md +2 -0
- data/lib/rack/parser.rb +20 -6
- data/rack-parser.gemspec +1 -1
- data/spec/parser_spec.rb +42 -4
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 74f69a416e4aa2289dcad838a169cfce39ad19cd
|
4
|
+
data.tar.gz: a521face89c84772bf670a9a2ce783c2f4001caa
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 564feba9cd26974578068efea5dfb8850cebf497f2e9935509d928dd5d2397c0934d0d98a46ad8339ce5a5291ddb4671f20d2d87e4c45db8bee79b69c1e2890b
|
7
|
+
data.tar.gz: 71c633ee487073bb5e3ab2e48a7a149dc266f75e3ef2f36b56215e8237de81e33bb6e8d58dc1770c2eff4219bbf23effeab495cca422de17b2b95839b5017653
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -75,6 +75,8 @@ http://www.mikeperham.com/2012/03/03/the-perils-of-rescue-exception/
|
|
75
75
|
With version `0.4.0`, you can specify regex matches for the content
|
76
76
|
types that you want the `parsers` and `handlers` to match.
|
77
77
|
|
78
|
+
NOTE: you need to explicitly pass a `Regexp` for it to regex match.
|
79
|
+
|
78
80
|
```ruby
|
79
81
|
parser = proc { |data| JSON.parse data }
|
80
82
|
handler = proc { |e, type| [400, {}, 'boop'] }
|
data/lib/rack/parser.rb
CHANGED
@@ -4,6 +4,7 @@ module Rack
|
|
4
4
|
POST_BODY = 'rack.input'.freeze
|
5
5
|
FORM_INPUT = 'rack.request.form_input'.freeze
|
6
6
|
FORM_HASH = 'rack.request.form_hash'.freeze
|
7
|
+
PARSER_RESULT = 'rack.parser.result'.freeze
|
7
8
|
|
8
9
|
JSON_PARSER = proc { |data| JSON.parse data }
|
9
10
|
ERROR_HANDLER = proc { |err, type| [400, {}, ['']] }
|
@@ -12,23 +13,24 @@ module Rack
|
|
12
13
|
|
13
14
|
def initialize(app, options = {})
|
14
15
|
@app = app
|
15
|
-
@parsers = options
|
16
|
-
@handlers = options
|
17
|
-
@logger = options
|
16
|
+
@parsers = options[:parsers] || { %r{json} => JSON_PARSER }
|
17
|
+
@handlers = options[:handlers] || {}
|
18
|
+
@logger = options[:logger]
|
18
19
|
end
|
19
20
|
|
20
21
|
def call(env)
|
21
22
|
type = Rack::Request.new(env).media_type
|
22
|
-
parser = parsers
|
23
|
+
parser = match_content_types_for(parsers, type) if type
|
23
24
|
return @app.call(env) unless parser
|
24
25
|
body = env[POST_BODY].read ; env[POST_BODY].rewind
|
25
26
|
return @app.call(env) unless body && !body.empty?
|
26
27
|
begin
|
27
28
|
parsed = parser.last.call body
|
28
|
-
env
|
29
|
+
env[PARSER_RESULT] = parsed
|
30
|
+
env.update FORM_HASH => parsed, FORM_INPUT => env[POST_BODY] if parsed.is_a?(Hash)
|
29
31
|
rescue StandardError => e
|
30
32
|
warn! e, type
|
31
|
-
handler = handlers
|
33
|
+
handler = match_content_types_for handlers, type
|
32
34
|
handler ||= ['default', ERROR_HANDLER]
|
33
35
|
return handler.last.call(e, type)
|
34
36
|
end
|
@@ -45,5 +47,17 @@ module Rack
|
|
45
47
|
message = "[Rack::Parser] Error on %s : %s" % [type, error.to_s]
|
46
48
|
logger.warn message
|
47
49
|
end
|
50
|
+
|
51
|
+
# Private: matches content types for the given media type
|
52
|
+
#
|
53
|
+
# content_types - An array of the parsers or handlers options
|
54
|
+
# type - The media type. gathered from the Rack::Request
|
55
|
+
#
|
56
|
+
# Returns The match from the parser/handler hash or nil
|
57
|
+
def match_content_types_for(content_types, type)
|
58
|
+
content_types.detect do |content_type, _|
|
59
|
+
content_type.is_a?(Regexp) ? type.match(content_type) : type == content_type
|
60
|
+
end
|
61
|
+
end
|
48
62
|
end
|
49
63
|
end
|
data/rack-parser.gemspec
CHANGED
@@ -3,7 +3,7 @@ $:.push File.expand_path("../lib", __FILE__)
|
|
3
3
|
|
4
4
|
Gem::Specification.new do |s|
|
5
5
|
s.name = "rack-parser"
|
6
|
-
s.version = "0.
|
6
|
+
s.version = "0.7.0"
|
7
7
|
s.authors = ["Arthur Chiu"]
|
8
8
|
s.email = ["mr.arthur.chiu@gmail.com"]
|
9
9
|
s.homepage = "https://www.github.com/achiu/rack-parser"
|
data/spec/parser_spec.rb
CHANGED
@@ -3,12 +3,18 @@ require File.expand_path('../spec_helper', __FILE__)
|
|
3
3
|
describe Rack::Parser do
|
4
4
|
|
5
5
|
it "allows you to setup parsers for content types" do
|
6
|
-
middleware = Rack::Parser.new ParserApp, :parsers => { 'foo' => 'bar' }
|
6
|
+
middleware = Rack::Parser.new ParserApp, :parsers => { 'foo' => 'bar' }
|
7
7
|
assert_equal 'bar', middleware.parsers['foo']
|
8
8
|
end
|
9
9
|
|
10
|
+
it "should not remove fields from options in setup" do
|
11
|
+
options = {:parsers => { 'foo' => 'bar' }}
|
12
|
+
middleware = Rack::Parser.new ParserApp, options
|
13
|
+
refute_nil options[:parsers]
|
14
|
+
end
|
15
|
+
|
10
16
|
it "allows you to setup error handlers" do
|
11
|
-
stack = Rack::Parser.new ParserApp, :handlers => { 'foo' => 'bar' }
|
17
|
+
stack = Rack::Parser.new ParserApp, :handlers => { 'foo' => 'bar' }
|
12
18
|
assert_equal 'bar', stack.handlers['foo']
|
13
19
|
end
|
14
20
|
|
@@ -42,6 +48,16 @@ describe Rack::Parser do
|
|
42
48
|
assert_equal "{\"a\"=>2}", last_response.body
|
43
49
|
end
|
44
50
|
|
51
|
+
it 'matches ambiguous string Content-Type and forces explicit regex' do
|
52
|
+
payload = JSON.dump(:a => 2)
|
53
|
+
parser = proc { |data| JSON.parse data }
|
54
|
+
stack Rack::Parser, :parsers => { 'application/vnd.foo+json' => parser }
|
55
|
+
post '/post', payload, { 'CONTENT_TYPE' => 'application/vnd.foo+json' }
|
56
|
+
|
57
|
+
assert last_response.ok?
|
58
|
+
assert_equal "{\"a\"=>2}", last_response.body
|
59
|
+
end
|
60
|
+
|
45
61
|
it "handles upstream errors" do
|
46
62
|
assert_raises StandardError, 'error!' do
|
47
63
|
parser = proc { |data| JSON.parse data }
|
@@ -52,7 +68,7 @@ describe Rack::Parser do
|
|
52
68
|
|
53
69
|
it "returns a default error" do
|
54
70
|
parser = proc { |data| raise StandardError, 'wah wah' }
|
55
|
-
stack Rack::Parser, :parsers => { %r{json} => parser }
|
71
|
+
stack Rack::Parser, :parsers => { %r{json} => parser }
|
56
72
|
post '/post', '{}', { 'CONTENT_TYPE' => 'application/vnd.foo+json' }
|
57
73
|
|
58
74
|
assert_equal 400, last_response.status
|
@@ -61,11 +77,33 @@ describe Rack::Parser do
|
|
61
77
|
it "returns a custom error message" do
|
62
78
|
parser = proc { |data| raise StandardError, "wah wah" }
|
63
79
|
handler = proc { |err, type| [500, {}, "%s : %s" % [type, err]] }
|
64
|
-
stack Rack::Parser, :parsers => { %r{json} => parser },
|
80
|
+
stack Rack::Parser, :parsers => { %r{json} => parser },
|
65
81
|
:handlers => { %r{json} => handler }
|
66
82
|
post '/post', '{}', { 'CONTENT_TYPE' => 'application/vnd.foo+json' }
|
67
83
|
|
68
84
|
assert_equal 500, last_response.status
|
69
85
|
assert_equal 'application/vnd.foo+json : wah wah', last_response.body
|
70
86
|
end
|
87
|
+
|
88
|
+
it 'returns a custome error for ambiguous string Content-Type and forces explicit regex' do
|
89
|
+
parser = proc { |data| raise StandardError, "wah wah" }
|
90
|
+
handler = proc { |err, type| [500, {}, "%s : %s" % [type, err]] }
|
91
|
+
stack Rack::Parser, :parsers => { %r{json} => parser },
|
92
|
+
:handlers => { 'application/vnd.foo+json' => handler }
|
93
|
+
post '/post', '{}', { 'CONTENT_TYPE' => 'application/vnd.foo+json' }
|
94
|
+
|
95
|
+
assert_equal 500, last_response.status
|
96
|
+
assert_equal 'application/vnd.foo+json : wah wah', last_response.body
|
97
|
+
end
|
98
|
+
|
99
|
+
it "parses an array but do not set it to params" do
|
100
|
+
payload = JSON.dump([1,2,3])
|
101
|
+
parser = proc { |data| JSON.parse data }
|
102
|
+
stack Rack::Parser, :parsers => { 'application/json' => parser }
|
103
|
+
post '/post', payload, { 'CONTENT_TYPE' => 'application/json' }
|
104
|
+
|
105
|
+
assert last_response.ok?
|
106
|
+
assert_equal last_request.env['rack.parser.result'], [1, 2, 3]
|
107
|
+
assert_equal last_request.env['rack.request.form_hash'], nil
|
108
|
+
end
|
71
109
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rack-parser
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.7.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Arthur Chiu
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-04-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rack
|
@@ -88,7 +88,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
88
88
|
version: '0'
|
89
89
|
requirements: []
|
90
90
|
rubyforge_project: rack-parser
|
91
|
-
rubygems_version: 2.2.
|
91
|
+
rubygems_version: 2.2.3
|
92
92
|
signing_key:
|
93
93
|
specification_version: 4
|
94
94
|
summary: Rack Middleware for parsing post body data
|