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.
Shrine's presign endpoint returns URL, fields and headers that the client (browser) needs to upload to. The
Shrine::Storage::GoogleCloudStorage#presign
method, which the presign endpoint calls, never returns any headers, which means that the presign endpoint always returns"headers": {}
in the response. When the browser then tries to upload the file to the URL, but because the request headers required by GCS weren't included, the upload fails.The solution is for
Shrine::Storage::GoogleCloudStorage#presign
to return appropriate headers when either:content_type
,content_md5
orheaders
options were given, which will make the presign endpoint automatically return them, and then the client (browser) can then include them in the upload request.I also updated the
:method
to bePUT
(the default isGET
), because presigned URLs are meant for uploading, not downloading. Uploading doesn't work ifmethod: "PUT"
is not specified.Btw, I also switched from Net::HTTP to HTTP.rb, because Net::HTTP has a really horrible API 😛, while HTTP.rb has a really nice and intuitive API.
Fixes #22