diff options
author | Vincent Ambo <tazjin@google.com> | 2020-10-29T15·13+0100 |
---|---|---|
committer | Vincent Ambo <mail@tazj.in> | 2020-10-29T16·07+0100 |
commit | cc35bf0fc3a900dccf4f9edcc581cadb5956c439 (patch) | |
tree | ec23fc45ff5c0194e2bbb902d95f18c634c14c2b /tools/nixery/storage/gcs.go | |
parent | 8a5c446babbac860d6eaee6f7e0c5a5a8a6f4183 (diff) |
feat(storage): Add support for content-types (GCS only)
Extends storage.Persist to accept a Content-Type argument, which in the GCS backend is persisted with the object to ensure that the object is served back with this content-type. This is not yet implemented for the filesystem backend, where the parameter is simply ignored. This should help in the case of clients which expect the returned objects to have content-types set when, for example, fetching layers by digest.
Diffstat (limited to 'tools/nixery/storage/gcs.go')
-rw-r--r-- | tools/nixery/storage/gcs.go | 25 |
1 files changed, 22 insertions, 3 deletions
diff --git a/tools/nixery/storage/gcs.go b/tools/nixery/storage/gcs.go index 61b5dea52351..eac34461af76 100644 --- a/tools/nixery/storage/gcs.go +++ b/tools/nixery/storage/gcs.go @@ -80,17 +80,36 @@ func (b *GCSBackend) Name() string { return "Google Cloud Storage (" + b.bucket + ")" } -func (b *GCSBackend) Persist(ctx context.Context, path string, f Persister) (string, int64, error) { +func (b *GCSBackend) Persist(ctx context.Context, path, contentType string, f Persister) (string, int64, error) { obj := b.handle.Object(path) w := obj.NewWriter(ctx) hash, size, err := f(w) if err != nil { - log.WithError(err).WithField("path", path).Error("failed to upload to GCS") + log.WithError(err).WithField("path", path).Error("failed to write to GCS") return hash, size, err } - return hash, size, w.Close() + err = w.Close() + if err != nil { + log.WithError(err).WithField("path", path).Error("failed to complete GCS upload") + return hash, size, err + } + + // GCS natively supports content types for objects, which will be + // used when serving them back. + if contentType != "" { + _, err = obj.Update(ctx, storage.ObjectAttrsToUpdate{ + ContentType: contentType, + }) + + if err != nil { + log.WithError(err).WithField("path", path).Error("failed to update object attrs") + return hash, size, err + } + } + + return hash, size, nil } func (b *GCSBackend) Fetch(ctx context.Context, path string) (io.ReadCloser, error) { |