summaryrefslogtreecommitdiff
path: root/lib/object_storage
diff options
context:
space:
mode:
authorStan Hu <stanhu@gmail.com>2018-08-20 15:29:41 -0700
committerStan Hu <stanhu@gmail.com>2018-08-23 12:40:24 -0700
commit97cabfb65c0474742b84ec70c0d34d9f7601c59c (patch)
tree2fb3b04b43873aba5394a2c6cb0a38e09b9cd36c /lib/object_storage
parenta78c443de279b98726ed6ec5bc79df0e21dfdf41 (diff)
downloadgitlab-ce-97cabfb65c0474742b84ec70c0d34d9f7601c59c.tar.gz
Send required object storage PUT headers in /uploads/authorize API
As revealed in https://gitlab.com/gitlab-org/gitlab-ce/issues/49957, Rails generates a signed URL with a fixed HTTP header with `Content-Type: application/octet-stream`. However, if we change or remove that for some reason in Workhorse, this breaks the upload with a 403 Unauthorized because the signed URL is not valid. We can make this more robust by doing the following: 1. In the `/uploads/authorize` request, Rails can return a `StoreHeaders` key-value pair in the JSON response containing the required headers that the PUT request must include. 2. Use those HTTP headers if that value is present. 3. For backwards compatibility, if that key is not present, default to the old behavior of sending the fixed `Content-Type` header. See https://gitlab.com/gitlab-org/gitlab-workhorse/merge_requests/297 as well.
Diffstat (limited to 'lib/object_storage')
-rw-r--r--lib/object_storage/direct_upload.rb4
1 files changed, 3 insertions, 1 deletions
diff --git a/lib/object_storage/direct_upload.rb b/lib/object_storage/direct_upload.rb
index 61a69e7ffe4..b372b4af090 100644
--- a/lib/object_storage/direct_upload.rb
+++ b/lib/object_storage/direct_upload.rb
@@ -41,7 +41,9 @@ module ObjectStorage
GetURL: get_url,
StoreURL: store_url,
DeleteURL: delete_url,
- MultipartUpload: multipart_upload_hash
+ MultipartUpload: multipart_upload_hash,
+ CustomPutHeaders: true,
+ PutHeaders: upload_options
}.compact
end