rack_respond_to_malformed_formats 0.0.2 → 0.0.3
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.
@@ -11,10 +11,11 @@ module Rack
|
|
11
11
|
@app = app
|
12
12
|
end
|
13
13
|
|
14
|
-
|
14
|
+
def call(env)
|
15
15
|
if malformed_response = respond_to_malformed_parameters(env)
|
16
16
|
input = env["rack.input"]
|
17
17
|
input.rewind
|
18
|
+
logger = env["rack.logger"]
|
18
19
|
logger.error "Error occurred while parsing request.\nInput:\n\n#{input.read}" if logger
|
19
20
|
malformed_response
|
20
21
|
else
|
@@ -29,11 +30,11 @@ module Rack
|
|
29
30
|
|
30
31
|
case (env["HTTP_X_POST_DATA_FORMAT"] || request.content_type).to_s.downcase
|
31
32
|
when /xml/
|
32
|
-
parse_xml(request.body.read)
|
33
|
+
parse_xml(request.body.read).tap { request.body.rewind }
|
33
34
|
when /yaml/
|
34
|
-
parse_yaml(request.body.read)
|
35
|
+
parse_yaml(request.body.read).tap { request.body.rewind }
|
35
36
|
when /json/
|
36
|
-
parse_json(request.body.read)
|
37
|
+
parse_json(request.body.read).tap { request.body.rewind }
|
37
38
|
else
|
38
39
|
false
|
39
40
|
end
|
@@ -63,9 +64,5 @@ module Rack
|
|
63
64
|
rescue ArgumentError => e
|
64
65
|
[400, {"Content-Type"=> "application/x-yaml"}, [e.to_s]]
|
65
66
|
end
|
66
|
-
|
67
|
-
def logger
|
68
|
-
defined?(Rails.logger) ? Rails.logger : nil
|
69
|
-
end
|
70
67
|
end
|
71
68
|
end
|
@@ -3,7 +3,7 @@ $:.push File.expand_path("../lib", __FILE__)
|
|
3
3
|
|
4
4
|
Gem::Specification.new do |s|
|
5
5
|
s.name = "rack_respond_to_malformed_formats"
|
6
|
-
s.version = "0.0.
|
6
|
+
s.version = "0.0.3"
|
7
7
|
s.platform = Gem::Platform::RUBY
|
8
8
|
s.authors = ["Case Commons, LLC"]
|
9
9
|
s.email = ["casecommons-dev@googlegroups.com"]
|
@@ -1,14 +1,35 @@
|
|
1
1
|
require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper"))
|
2
2
|
|
3
3
|
describe Rack::RespondToMalformedFormats do
|
4
|
+
def wrapped_app(app)
|
5
|
+
Rack::Builder.new do
|
6
|
+
use Rack::Lint
|
7
|
+
use Rack::RespondToMalformedFormats
|
8
|
+
use Rack::Lint
|
9
|
+
run app
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def response_for_env(env)
|
14
|
+
StringIO.new("Got: #{env['rack.input'].read}")
|
15
|
+
end
|
16
|
+
|
17
|
+
def read(body)
|
18
|
+
"".tap do |body_string|
|
19
|
+
body.each do |body_part|
|
20
|
+
body_string << body_part
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
4
25
|
context "when the format is HTML" do
|
5
26
|
it "should do nothing" do
|
6
27
|
test_input = '<html></html>'
|
7
|
-
app = lambda { |env| [200, {"
|
8
|
-
request = Rack::MockRequest.env_for("/", :params => "", "CONTENT_TYPE" => "
|
9
|
-
body =
|
28
|
+
app = lambda { |env| [200, {"Content-Type" => "text/html"}, response_for_env(env)] }
|
29
|
+
request = Rack::MockRequest.env_for("/", :params => "", "CONTENT_TYPE" => "text/html", :input => test_input)
|
30
|
+
body = wrapped_app(app).call(request).last
|
10
31
|
|
11
|
-
body.should ==
|
32
|
+
read(body).should == 'Got: <html></html>'
|
12
33
|
end
|
13
34
|
end
|
14
35
|
|
@@ -16,24 +37,24 @@ describe Rack::RespondToMalformedFormats do
|
|
16
37
|
context "and it is valid" do
|
17
38
|
it "should do nothing" do
|
18
39
|
test_input = '{"foo":"bar"}'
|
19
|
-
app = lambda { |env| [200, {"
|
40
|
+
app = lambda { |env| [200, {"Content-Type" => "application/json"}, response_for_env(env)] }
|
20
41
|
request = Rack::MockRequest.env_for("/", :params => "", "CONTENT_TYPE" => "application/json", :input => test_input)
|
21
|
-
body =
|
42
|
+
body = wrapped_app(app).call(request).last
|
22
43
|
|
23
|
-
body.should ==
|
44
|
+
read(body).should == 'Got: {"foo":"bar"}'
|
24
45
|
end
|
25
46
|
end
|
26
47
|
|
27
48
|
context "and it is invalid" do
|
28
49
|
it "should return a 400 with a message" do
|
29
50
|
test_input = '{"foo":'
|
30
|
-
app = lambda { |env| [200, {"
|
51
|
+
app = lambda { |env| [200, {"Content-Type" => "application/json"}, response_for_env(env)] }
|
31
52
|
request = Rack::MockRequest.env_for("/", :params => "", "CONTENT_TYPE" => "application/json", :input => test_input)
|
32
|
-
response =
|
53
|
+
response = wrapped_app(app).call(request)
|
33
54
|
|
34
55
|
response[0].should == 400
|
35
56
|
response[1]["Content-Type"].should == "application/json"
|
36
|
-
response
|
57
|
+
read(response.last).should =~ /.*error.*unexpected token.*/
|
37
58
|
end
|
38
59
|
end
|
39
60
|
end
|
@@ -42,24 +63,24 @@ describe Rack::RespondToMalformedFormats do
|
|
42
63
|
context "and it is valid" do
|
43
64
|
it "should do nothing" do
|
44
65
|
test_input = '<?xml version="1.0"?><foo>bar</foo>'
|
45
|
-
app = lambda { |env| [200, {"
|
66
|
+
app = lambda { |env| [200, {"Content-Type" => "application/xml"}, response_for_env(env)] }
|
46
67
|
request = Rack::MockRequest.env_for("/", :params => "", "CONTENT_TYPE" => "application/xml", :input => test_input)
|
47
|
-
body =
|
68
|
+
body = wrapped_app(app).call(request).last
|
48
69
|
|
49
|
-
body.should ==
|
70
|
+
read(body).should == 'Got: <?xml version="1.0"?><foo>bar</foo>'
|
50
71
|
end
|
51
72
|
end
|
52
73
|
|
53
74
|
context "and it is invalid" do
|
54
75
|
it "should return a 400 with a message" do
|
55
76
|
test_input = '<ml><foo>bar'
|
56
|
-
app = lambda { |env| [200, {"
|
77
|
+
app = lambda { |env| [200, {"Content-Type" => "application/xml"}, response_for_env(env)] }
|
57
78
|
request = Rack::MockRequest.env_for("/", :params => "", "CONTENT_TYPE" => "application/xml", :input => test_input)
|
58
|
-
response =
|
79
|
+
response = wrapped_app(app).call(request)
|
59
80
|
|
60
81
|
response[0].should == 400
|
61
82
|
response[1]["Content-Type"].should == "application/xml"
|
62
|
-
response
|
83
|
+
read(response.last).should =~ /.*<error>Premature.*<\/error>.*/
|
63
84
|
end
|
64
85
|
end
|
65
86
|
end
|
@@ -68,26 +89,25 @@ describe Rack::RespondToMalformedFormats do
|
|
68
89
|
context "and it is valid" do
|
69
90
|
it "should do nothing" do
|
70
91
|
test_input = "--- \nfoo: bar\n"
|
71
|
-
app = lambda { |env| [200, {"
|
92
|
+
app = lambda { |env| [200, {"Content-Type" => "application/x-yaml"}, response_for_env(env)] }
|
72
93
|
request = Rack::MockRequest.env_for("/", :params => "", "CONTENT_TYPE" => "application/x-yaml", :input => test_input)
|
73
|
-
body =
|
94
|
+
body = wrapped_app(app).call(request).last
|
74
95
|
|
75
|
-
body.should ==
|
96
|
+
read(body).should == "Got: --- \nfoo: bar\n"
|
76
97
|
end
|
77
98
|
end
|
78
99
|
|
79
100
|
context "and it is invalid" do
|
80
101
|
it "should return a 400 with a message" do
|
81
102
|
test_input = "--- what:\nawagasd"
|
82
|
-
app = lambda { |env| [200, {"
|
103
|
+
app = lambda { |env| [200, {"Content-Type" => "application/x-yaml"}, response_for_env(env)] }
|
83
104
|
request = Rack::MockRequest.env_for("/", :params => "", "CONTENT_TYPE" => "application/x-yaml", :input => test_input)
|
84
|
-
response =
|
105
|
+
response = wrapped_app(app).call(request)
|
85
106
|
|
86
107
|
response[0].should == 400
|
87
108
|
response[1]["Content-Type"].should == "application/x-yaml"
|
88
|
-
response
|
109
|
+
read(response.last).should =~ /.*syntax error.*/
|
89
110
|
end
|
90
111
|
end
|
91
112
|
end
|
92
113
|
end
|
93
|
-
|
metadata
CHANGED
@@ -1,12 +1,8 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rack_respond_to_malformed_formats
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
prerelease:
|
5
|
-
|
6
|
-
- 0
|
7
|
-
- 0
|
8
|
-
- 2
|
9
|
-
version: 0.0.2
|
4
|
+
prerelease:
|
5
|
+
version: 0.0.3
|
10
6
|
platform: ruby
|
11
7
|
authors:
|
12
8
|
- Case Commons, LLC
|
@@ -14,7 +10,7 @@ autorequire:
|
|
14
10
|
bindir: bin
|
15
11
|
cert_chain: []
|
16
12
|
|
17
|
-
date: 2011-
|
13
|
+
date: 2011-04-01 00:00:00 -04:00
|
18
14
|
default_executable:
|
19
15
|
dependencies:
|
20
16
|
- !ruby/object:Gem::Dependency
|
@@ -25,10 +21,6 @@ dependencies:
|
|
25
21
|
requirements:
|
26
22
|
- - ">="
|
27
23
|
- !ruby/object:Gem::Version
|
28
|
-
segments:
|
29
|
-
- 1
|
30
|
-
- 4
|
31
|
-
- 4
|
32
24
|
version: 1.4.4
|
33
25
|
type: :runtime
|
34
26
|
version_requirements: *id001
|
@@ -66,21 +58,17 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
66
58
|
requirements:
|
67
59
|
- - ">="
|
68
60
|
- !ruby/object:Gem::Version
|
69
|
-
segments:
|
70
|
-
- 0
|
71
61
|
version: "0"
|
72
62
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
73
63
|
none: false
|
74
64
|
requirements:
|
75
65
|
- - ">="
|
76
66
|
- !ruby/object:Gem::Version
|
77
|
-
segments:
|
78
|
-
- 0
|
79
67
|
version: "0"
|
80
68
|
requirements: []
|
81
69
|
|
82
70
|
rubyforge_project:
|
83
|
-
rubygems_version: 1.
|
71
|
+
rubygems_version: 1.5.2
|
84
72
|
signing_key:
|
85
73
|
specification_version: 3
|
86
74
|
summary: Intercept malformed XML and JSON requests and return XML and JSON 400 responses not HTML 500
|