Fix #to_rack to handle non-array response bodies. #150

Merged
merged 1 commit into from Jan 22, 2012
Jump to file or symbol
Failed to load files and symbols.
+29 −2
Split
@@ -10,12 +10,18 @@ def evaluate(request)
status, headers, response = @app.call(env)
Response.new(
- :body => response.join,
+ :body => body_from_rack_response(response),
:headers => headers,
:status => status
)
end
+ def body_from_rack_response(response)
+ body = ""
+ response.each { |line| body << line }
+ return body
+ end
+
def build_rack_env(request)
uri = request.uri
headers = request.headers || {}
@@ -1,18 +1,31 @@
require 'rack'
class MyRackApp
+ class NonArrayResponse
+ # The rack response body need not implement #join,
+ # but it must implement #each. It need not be an Array.
+ # ActionDispatch::Response, for example, exercises that fact.
+ # See: http://rack.rubyforge.org/doc/SPEC.html
+
+ def each(*args, &blk)
+ ["This is not in an array!"].each(*args, &blk)
+ end
+ end
+
def self.call(env)
case env.values_at('REQUEST_METHOD', 'PATH_INFO')
when ['GET', '/']
[200, {}, ["This is my root!"]]
when ['GET', '/greet']
name = env['QUERY_STRING'][/name=([^&]*)/, 1] || "World"
[200, {}, ["Hello, #{name}"]]
+ when ['GET', '/non_array_response']
+ [200, {}, NonArrayResponse.new]
when ['POST', '/greet']
name = env["rack.input"].read[/name=([^&]*)/, 1] || "World"
[200, {}, ["Good to meet you, #{name}!"]]
else
[404, {}, ['']]
end
end
-end
+end
@@ -13,6 +13,14 @@
response.body.should include('This is my root!')
end
+ it "should behave correctly when the rack response is not a simple array of strings" do
+ request = WebMock::RequestSignature.new(:get, 'www.example.com/non_array_response')
+ response = @rack_response.evaluate(request)
+
+ response.status.first.should == 200
+ response.body.should include('This is not in an array!')
+ end
+
it "should send along params" do
request = WebMock::RequestSignature.new(:get, 'www.example.com/greet?name=Johnny')