Skip to content
Browse files

Fix rewinding in ActionDispatch::Request#raw_post

If env['RAW_POST_DATA'] is nil, #raw_post will attempt to set it to
the result of #body (which will return env['rack.input'] if
env['RAW_POST_DATA'] is nil). #raw_post will then attempt to rewind
the result of another call to #body. Since env['RAW_POST_DATA'] has
already been set, the result of #body is not env['rack.input'] anymore.
This causes env['rack.input'] to never be rewound.
  • Loading branch information...
1 parent 48583f8 commit 991601ff6e99139e7731212d5ac87385f943fb47 @venables venables committed
5 actionpack/
@@ -1,5 +1,10 @@
## Rails 4.0.0 (unreleased) ##
+* Fix a bug in ActionDispatch::Request#raw_post that caused env['rack.input']
+ to be read but not rewound.
+ *Matt Venables*
* Prevent raising EOFError on multipart GET request (IE issue). *Adam Stankiewicz*
* Rename all action callbacks from *_filter to *_action to avoid the misconception that these
5 actionpack/lib/action_dispatch/http/request.rb
@@ -205,8 +205,9 @@ def server_software
# work with raw requests directly.
def raw_post
unless @env.include? 'RAW_POST_DATA'
- @env['RAW_POST_DATA'] =['CONTENT_LENGTH'].to_i)
- body.rewind if body.respond_to?(:rewind)
+ raw_post_body = body
+ @env['RAW_POST_DATA'] =['CONTENT_LENGTH'].to_i)
+ raw_post_body.rewind if raw_post_body.respond_to?(:rewind)
7 actionpack/test/dispatch/request_test.rb
@@ -650,6 +650,13 @@ def url_for(options = {})
assert_equal Mime::XML, request.negotiate_mime([Mime::XML, Mime::CSV])
+ test "raw_post rewinds rack.input if RAW_POST_DATA is nil" do
+ request = stub_request('rack.input' =>"foo"),
+ assert_equal "foo", request.raw_post
+ assert_equal "foo", request.env['rack.input'].read
+ end
test "process parameter filter" do
test_hashes = [

0 comments on commit 991601f

Please sign in to comment.
Something went wrong with that request. Please try again.