Fix multipart form encoding for PUT requests #245
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Summary
This PR fixes a long-standing issue where PUT requests could not properly handle multipart form data with files. PUT requests now correctly set
Content-Type: multipart/form-dataheaders and encode form data identically to POST requests.Problem
PUT requests with multipart form data (containing files) were not being form-encoded correctly:
Content-Type: multipart/form-dataheader was setSolution
Updated the
Putablemodule to mirrorPostablebehavior:form.multipart?detectionhttppostfor multipart forms instead of always usingupload/read_callbackcustomrequest = 'PUT'to override libcurl's default POST behavior when usinghttppostChanges
lib/ethon/easy/http/putable.rb: Updatedset_formmethod to handle multipart formsspec/ethon/easy/http/put_spec.rb: Added comprehensive tests for multipart PUT requestsGemfile+spec/support/localhost_server.rb: Fixed test suite compatibility with modern Rack versionsTesting
All existing tests pass, plus new tests verify:
httppostinstead ofuploadmultipart/form-datacontent type is sent correctlyRelated Issues
Closes:
Related to:
This resolves a 10+ year old issue that affected Ruby HTTP clients generated by OpenAPI Generator and direct Typhoeus/Ethon usage.