Direct uploads with Google Cloud Storage: introduce an option to set the Content-Type
🔥 Problem
In Improve Google Cloud Storage support (&9457 - closed), we're working towards improving the Google Cloud Storage support by letting workhorse build a native client (eg. powered by the official GCS client). This unlocks bucket encryption that will work out of the box and improves reliability (through resumable uploads).
This has a hard requirement: object storage must be configured in consolidated mode.
Given how deep this change is (all direct uploads are impacted by this change), a feature flag has been used: #372596 (closed).
Parallel to this, a typebug fix for the Category:Dependency Proxy was made to allow multi arch images: Dependency Proxy is pulling the image with wron... (#325669 - closed).
During the verification of the fix on staging (where the feature flag has been enabled for 1month+), we discovered a problem: the client used by workhorse was setting the Content-Type
of uploaded files to text/plain; charset=utf-8
which causes a problem for docker
clients trying to use the dependency proxy (see #419797 (comment 1498241250)).
🚒 Solution
- The GCS client seems to try finding the right
Content-Type
by reading the first few bytes of the content (see https://github.com/google/go-cloud/issues/3298). - Rails being the "driver" of uploads, one possible solution would be to:
- Let rails to have to possibility to send the
Content-Type
value in the response of thex/authorize
request. - Workhorse would then either:
- Use the instructed
Content-Type
value if there is one or - Use the current behavior
- Use the instructed
- Let rails to have to possibility to send the
- Set the proper
Content-Type
in the dependency proxy uploads so that we can use it even when the feature flag for the GCS client (in workhorse) is enabled.