Skip to content

Commit

Permalink
Rescue EOFError error from rack on a multipart request
Browse files Browse the repository at this point in the history
  • Loading branch information
nvasilevski committed Aug 15, 2022
1 parent d6973d5 commit 3b0d8c1
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 1 deletion.
4 changes: 4 additions & 0 deletions actionpack/CHANGELOG.md
@@ -1,3 +1,7 @@
* Rescue `EOFError` exception from `rack` on a multipart request.

*Nikita Vasilevsky*

* Log redirects from routes the same way as redirects from controllers.

*Dennis Paagman*
Expand Down
2 changes: 1 addition & 1 deletion actionpack/lib/action_dispatch/http/request.rb
Expand Up @@ -406,7 +406,7 @@ def POST
Request::Utils.check_param_encoding(pr)
self.request_parameters = Request::Utils.normalize_encode_params(pr)
end
rescue Rack::Utils::ParameterTypeError, Rack::Utils::InvalidParameterError => e
rescue Rack::Utils::ParameterTypeError, Rack::Utils::InvalidParameterError, EOFError => e
raise ActionController::BadRequest.new("Invalid request parameters: #{e.message}")
end
alias :request_parameters :POST
Expand Down
32 changes: 32 additions & 0 deletions actionpack/test/dispatch/request_test.rb
Expand Up @@ -609,6 +609,38 @@ class RequestParamsParsing < BaseRequestTest
request = stub_request("REQUEST_URI" => "foo")
assert_equal({}, request.query_parameters)
end

# partially mimics https://github.com/rack/rack/blob/249dd785625f0cbe617d3144401de90ecf77025a/test/spec_multipart.rb#L114
test "request_parameters raises BadRequest when content length lower than actual data length for a multipart request" do
request = stub_request(
"CONTENT_TYPE" => "multipart/form-data; boundary=AaB03x",
"CONTENT_LENGTH" => "9", # lower than data length
"REQUEST_METHOD" => "POST",
"rack.input" => StringIO.new("0123456789")
)

err = assert_raises(ActionController::BadRequest) do
request.request_parameters
end

# original error message is Rack::Multipart::EmptyContentError for rack > 3 otherwise EOFError
assert_match "Invalid request parameters:", err.message
end

test "request_parameters raises BadRequest when content length is higher than actual data length" do
request = stub_request(
"CONTENT_TYPE" => "multipart/form-data; boundary=AaB03x",
"CONTENT_LENGTH" => "11", # higher than data length
"REQUEST_METHOD" => "POST",
"rack.input" => StringIO.new("0123456789")
)

err = assert_raises(ActionController::BadRequest) do
request.request_parameters
end

assert_equal "Invalid request parameters: bad content body", err.message
end
end

class RequestRewind < BaseRequestTest
Expand Down

0 comments on commit 3b0d8c1

Please sign in to comment.