Skip to content

Commit 72b9132

Browse files
authored
add contentType metadata support for GCP bucket operations (#3998)
Signed-off-by: MyMirelHub <[email protected]>
1 parent d62196f commit 72b9132

File tree

3 files changed

+61
-3
lines changed

3 files changed

+61
-3
lines changed

bindings/gcp/bucket/bucket.go

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,9 @@ const (
4747
metadataEncodeBase64 = "encodeBase64"
4848
metadataSignTTL = "signTTL"
4949

50-
metadataKey = "key"
51-
maxResults = 1000
50+
metadataContentType = "contentType"
51+
metadataKey = "key"
52+
maxResults = 1000
5253

5354
metadataKeyBC = "name"
5455
signOperation = "sign"
@@ -77,6 +78,7 @@ type gcpMetadata struct {
7778
TokenURI string `json:"token_uri" mapstructure:"tokenURI" mdignore:"true" mapstructurealiases:"token_uri"`
7879
AuthProviderCertURL string `json:"auth_provider_x509_cert_url" mapstructure:"authProviderX509CertURL" mdignore:"true" mapstructurealiases:"auth_provider_x509_cert_url"`
7980
ClientCertURL string `json:"client_x509_cert_url" mapstructure:"clientX509CertURL" mdignore:"true" mapstructurealiases:"client_x509_cert_url"`
81+
ContentType string `json:"contentType,omitempty" mapstructure:"contentType"`
8082

8183
Bucket string `json:"bucket" mapstructure:"bucket"`
8284
DecodeBase64 bool `json:"decodeBase64,string" mapstructure:"decodeBase64"`
@@ -233,6 +235,12 @@ func (g *GCPStorage) create(ctx context.Context, req *bindings.InvokeRequest) (*
233235
}
234236

235237
h := g.client.Bucket(g.metadata.Bucket).Object(name).NewWriter(ctx)
238+
239+
// Set content type if provided
240+
if metadata.ContentType != "" {
241+
h.ContentType = metadata.ContentType
242+
}
243+
236244
// Cannot do `defer h.Close()` as Close() will flush the bytes and need to have error handling.
237245
if _, err = io.Copy(h, r); err != nil {
238246
cerr := h.Close()
@@ -378,9 +386,15 @@ func (metadata gcpMetadata) mergeWithRequestMetadata(req *bindings.InvokeRequest
378386
if val, ok := req.Metadata[metadataEncodeBase64]; ok && val != "" {
379387
merged.EncodeBase64 = strings.IsTruthy(val)
380388
}
389+
381390
if val, ok := req.Metadata[metadataSignTTL]; ok && val != "" {
382391
merged.SignTTL = val
383392
}
393+
394+
if val, ok := req.Metadata[metadataContentType]; ok && val != "" {
395+
merged.ContentType = val
396+
}
397+
384398
return merged, nil
385399
}
386400

bindings/gcp/bucket/bucket_test.go

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,42 @@ func TestMergeWithRequestMetadata(t *testing.T) {
233233
assert.NotNil(t, mergedMeta)
234234
assert.False(t, mergedMeta.EncodeBase64)
235235
})
236+
237+
t.Run("Has merged contentType metadata", func(t *testing.T) {
238+
m := bindings.Metadata{}
239+
m.Properties = map[string]string{
240+
"bucket": "my_bucket",
241+
"projectID": "my_project_id",
242+
"contentType": "text/plain",
243+
}
244+
gs := GCPStorage{logger: logger.NewLogger("test")}
245+
meta, err := gs.parseMetadata(m)
246+
require.NoError(t, err)
247+
assert.Equal(t, "text/plain", meta.ContentType)
248+
249+
// Empty request doesn't override
250+
request := bindings.InvokeRequest{}
251+
request.Metadata = map[string]string{}
252+
mergedMeta, err := meta.mergeWithRequestMetadata(&request)
253+
require.NoError(t, err)
254+
assert.Equal(t, "text/plain", mergedMeta.ContentType)
255+
256+
// Request overrides component
257+
request.Metadata = map[string]string{
258+
"contentType": "text/csv",
259+
}
260+
mergedMeta, err = meta.mergeWithRequestMetadata(&request)
261+
require.NoError(t, err)
262+
assert.Equal(t, "text/csv", mergedMeta.ContentType)
263+
264+
// Empty string doesn't override
265+
request.Metadata = map[string]string{
266+
"contentType": "",
267+
}
268+
mergedMeta, err = meta.mergeWithRequestMetadata(&request)
269+
require.NoError(t, err)
270+
assert.Equal(t, "text/plain", mergedMeta.ContentType)
271+
})
236272
}
237273

238274
func TestInit(t *testing.T) {

bindings/gcp/bucket/metadata.yaml

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,4 +44,12 @@ metadata:
4444
description: |
4545
Configuration to encode base64 file content before return the content.
4646
(In case of saving a file with binary content).
47-
example: '"true, false"'
47+
example: '"true, false"'
48+
- name: contentType
49+
type: string
50+
required: false
51+
description: |
52+
The MIME type of the object being stored. If not specified, GCS will attempt to
53+
auto-detect the type, which may default to application/octet-stream or text/plain.
54+
Common values include text/csv, application/json, image/png, etc.
55+
example: '"text/csv", "application/json"'

0 commit comments

Comments
 (0)