Skip to content

Commit 3b68482

Browse files
authored
Merge branch 'main' into main
2 parents e4bd92b + 88fce6a commit 3b68482

File tree

52 files changed

+1250
-623
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

52 files changed

+1250
-623
lines changed

.build-tools/go.mod

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,17 +12,17 @@ require (
1212
)
1313

1414
require (
15-
github.com/dapr/kit v0.13.1-0.20240909215017-3823663aa4bb // indirect
15+
github.com/dapr/kit v0.15.3-0.20250516121556-bc7dc566c45d // indirect
1616
github.com/gogo/protobuf v1.3.2 // indirect
1717
github.com/iancoleman/orderedmap v0.0.0-20190318233801-ac98e3ecb4b0 // indirect
1818
github.com/inconshreveable/mousetrap v1.0.1 // indirect
1919
github.com/mitchellh/mapstructure v1.5.1-0.20220423185008-bf980b35cac4 // indirect
20-
github.com/spf13/cast v1.6.0 // indirect
21-
github.com/spf13/pflag v1.0.5 // indirect
20+
github.com/spf13/cast v1.8.0 // indirect
21+
github.com/spf13/pflag v1.0.6 // indirect
2222
github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect
2323
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect
2424
gopkg.in/inf.v0 v0.9.1 // indirect
25-
k8s.io/apimachinery v0.26.10 // indirect
25+
k8s.io/apimachinery v0.27.4 // indirect
2626
)
2727

2828
replace github.com/dapr/components-contrib => ../

.build-tools/go.sum

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
2-
github.com/dapr/kit v0.13.1-0.20240909215017-3823663aa4bb h1:ahLO7pMmX6HAuT6/RxYWBY4AN2fXQJcYlU1msY6Kt7U=
3-
github.com/dapr/kit v0.13.1-0.20240909215017-3823663aa4bb/go.mod h1:Hz1W2LmWfA4UX/12MdA+brsf+np6f/1dJt6C6F63cjI=
2+
github.com/dapr/kit v0.15.3-0.20250516121556-bc7dc566c45d h1:v+kZn9ami23xBsruyZmKErIOSlCdW9pR8wfHUg5+jys=
3+
github.com/dapr/kit v0.15.3-0.20250516121556-bc7dc566c45d/go.mod h1:6w2Pr38zOAtBn+ld/jknwI4kgMfwanCIcFVnPykdPZQ=
44
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
55
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
66
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
@@ -9,8 +9,8 @@ github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7z
99
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
1010
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
1111
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
12-
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
13-
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
12+
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
13+
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
1414
github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=
1515
github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
1616
github.com/iancoleman/orderedmap v0.0.0-20190318233801-ac98e3ecb4b0 h1:i462o439ZjprVSFSZLZxcsoAe592sZB1rci2Z8j4wdk=
@@ -27,20 +27,19 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
2727
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
2828
github.com/mitchellh/mapstructure v1.5.1-0.20220423185008-bf980b35cac4 h1:BpfhmLKZf+SjVanKKhCgf3bg+511DmU9eDQTen7LLbY=
2929
github.com/mitchellh/mapstructure v1.5.1-0.20220423185008-bf980b35cac4/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
30-
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs=
31-
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
3230
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
3331
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
3432
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
3533
github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=
3634
github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=
3735
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
38-
github.com/spf13/cast v1.6.0 h1:GEiTHELF+vaR5dhz3VqZfFSzZjYbgeKDpBxQVS4GYJ0=
39-
github.com/spf13/cast v1.6.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo=
36+
github.com/spf13/cast v1.8.0 h1:gEN9K4b8Xws4EX0+a0reLmhq8moKn7ntRlQYgjPeCDk=
37+
github.com/spf13/cast v1.8.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo=
4038
github.com/spf13/cobra v1.6.1 h1:o94oiPyS4KD1mPy2fmcYYHHfCxLqYjJOhGsCHFZtEzA=
4139
github.com/spf13/cobra v1.6.1/go.mod h1:IOw/AERYS7UzyrGinqmz6HLUo219MORXGxhbaJUqzrY=
42-
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
4340
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
41+
github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o=
42+
github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
4443
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
4544
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
4645
github.com/stretchr/testify v1.3.1-0.20190311161405-34c6fa2dc709/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
@@ -82,14 +81,13 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T
8281
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
8382
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
8483
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
84+
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
8585
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
86-
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU=
87-
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
8886
gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=
8987
gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
9088
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
9189
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
92-
k8s.io/apimachinery v0.26.10 h1:aE+J2KIbjctFqPp3Y0q4Wh2PD+l1p2g3Zp4UYjSvtGU=
93-
k8s.io/apimachinery v0.26.10/go.mod h1:iT1ZP4JBP34wwM+ZQ8ByPEQ81u043iqAcsJYftX9amM=
90+
k8s.io/apimachinery v0.27.4 h1:CdxflD4AF61yewuid0fLl6bM4a3q04jWel0IlP+aYjs=
91+
k8s.io/apimachinery v0.27.4/go.mod h1:XNfZ6xklnMCOGGFNqXG7bUrQCoR04dh/E7FprV6pb+E=
9492
sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E=
9593
sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY=

bindings/aws/s3/s3.go

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ import (
4040
"github.com/dapr/kit/logger"
4141
kitmd "github.com/dapr/kit/metadata"
4242
"github.com/dapr/kit/ptr"
43-
"github.com/dapr/kit/utils"
43+
kitstrings "github.com/dapr/kit/strings"
4444
)
4545

4646
const (
@@ -49,6 +49,7 @@ const (
4949
metadataFilePath = "filePath"
5050
metadataPresignTTL = "presignTTL"
5151
metadataStorageClass = "storageClass"
52+
metadataTags = "tags"
5253

5354
metatadataContentType = "Content-Type"
5455
metadataKey = "key"
@@ -191,6 +192,15 @@ func (s *AWSS3) create(ctx context.Context, req *bindings.InvokeRequest) (*bindi
191192
if contentTypeStr != "" {
192193
contentType = &contentTypeStr
193194
}
195+
196+
var tagging *string
197+
if rawTags, ok := req.Metadata[metadataTags]; ok {
198+
tagging, err = s.parseS3Tags(rawTags)
199+
if err != nil {
200+
return nil, fmt.Errorf("s3 binding error: parsing tags falied error: %w", err)
201+
}
202+
}
203+
194204
var r io.Reader
195205
if metadata.FilePath != "" {
196206
r, err = os.Open(metadata.FilePath)
@@ -209,12 +219,14 @@ func (s *AWSS3) create(ctx context.Context, req *bindings.InvokeRequest) (*bindi
209219
if metadata.StorageClass != "" {
210220
storageClass = aws.String(metadata.StorageClass)
211221
}
222+
212223
resultUpload, err := s.authProvider.S3().Uploader.UploadWithContext(ctx, &s3manager.UploadInput{
213224
Bucket: ptr.Of(metadata.Bucket),
214225
Key: ptr.Of(key),
215226
Body: r,
216227
ContentType: contentType,
217228
StorageClass: storageClass,
229+
Tagging: tagging,
218230
})
219231
if err != nil {
220232
return nil, fmt.Errorf("s3 binding error: uploading failed: %w", err)
@@ -418,16 +430,36 @@ func (s *AWSS3) parseMetadata(md bindings.Metadata) (*s3Metadata, error) {
418430
return &m, nil
419431
}
420432

433+
// Helper for parsing s3 tags metadata
434+
func (s *AWSS3) parseS3Tags(raw string) (*string, error) {
435+
tagEntries := strings.Split(raw, ",")
436+
pairs := make([]string, 0, len(tagEntries))
437+
for _, tagEntry := range tagEntries {
438+
kv := strings.SplitN(strings.TrimSpace(tagEntry), "=", 2)
439+
isInvalidTag := len(kv) != 2 || strings.TrimSpace(kv[0]) == "" || strings.TrimSpace(kv[1]) == ""
440+
if isInvalidTag {
441+
return nil, fmt.Errorf("invalid tag format: '%s' (expected key=value)", tagEntry)
442+
}
443+
pairs = append(pairs, fmt.Sprintf("%s=%s", strings.TrimSpace(kv[0]), strings.TrimSpace(kv[1])))
444+
}
445+
446+
if len(pairs) == 0 {
447+
return nil, nil
448+
}
449+
450+
return aws.String(strings.Join(pairs, "&")), nil
451+
}
452+
421453
// Helper to merge config and request metadata.
422454
func (metadata s3Metadata) mergeWithRequestMetadata(req *bindings.InvokeRequest) (s3Metadata, error) {
423455
merged := metadata
424456

425457
if val, ok := req.Metadata[metadataDecodeBase64]; ok && val != "" {
426-
merged.DecodeBase64 = utils.IsTruthy(val)
458+
merged.DecodeBase64 = kitstrings.IsTruthy(val)
427459
}
428460

429461
if val, ok := req.Metadata[metadataEncodeBase64]; ok && val != "" {
430-
merged.EncodeBase64 = utils.IsTruthy(val)
462+
merged.EncodeBase64 = kitstrings.IsTruthy(val)
431463
}
432464

433465
if val, ok := req.Metadata[metadataFilePath]; ok && val != "" {

bindings/aws/s3/s3_test.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,24 @@ func TestParseMetadata(t *testing.T) {
5353
})
5454
}
5555

56+
func TestParseS3Tags(t *testing.T) {
57+
t.Run("Has parsed s3 tags", func(t *testing.T) {
58+
request := bindings.InvokeRequest{}
59+
request.Metadata = map[string]string{
60+
"decodeBase64": "yes",
61+
"encodeBase64": "false",
62+
"filePath": "/usr/vader.darth",
63+
"storageClass": "STANDARD_IA",
64+
"tags": "project=myproject,year=2024",
65+
}
66+
s3 := AWSS3{}
67+
parsedTags, err := s3.parseS3Tags(request.Metadata["tags"])
68+
69+
require.NoError(t, err)
70+
assert.Equal(t, "project=myproject&year=2024", *parsedTags)
71+
})
72+
}
73+
5674
func TestMergeWithRequestMetadata(t *testing.T) {
5775
t.Run("Has merged metadata", func(t *testing.T) {
5876
m := bindings.Metadata{}

bindings/gcp/bucket/bucket.go

Lines changed: 99 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,12 @@ import (
2525
"net/url"
2626
"reflect"
2727
"strconv"
28+
"sync"
2829
"time"
2930

3031
"cloud.google.com/go/storage"
3132
"github.com/google/uuid"
33+
"go.uber.org/multierr"
3234
"google.golang.org/api/googleapi"
3335
"google.golang.org/api/iterator"
3436
"google.golang.org/api/option"
@@ -37,7 +39,7 @@ import (
3739
"github.com/dapr/components-contrib/metadata"
3840
"github.com/dapr/kit/logger"
3941
kitmd "github.com/dapr/kit/metadata"
40-
"github.com/dapr/kit/utils"
42+
"github.com/dapr/kit/strings"
4143
)
4244

4345
const (
@@ -49,8 +51,9 @@ const (
4951
metadataKey = "key"
5052
maxResults = 1000
5153

52-
metadataKeyBC = "name"
53-
signOperation = "sign"
54+
metadataKeyBC = "name"
55+
signOperation = "sign"
56+
bulkGetOperation = "bulkGet"
5457
)
5558

5659
// GCPStorage allows saving data to GCP bucket storage.
@@ -138,6 +141,7 @@ func (g *GCPStorage) Operations() []bindings.OperationKind {
138141
bindings.DeleteOperation,
139142
bindings.ListOperation,
140143
signOperation,
144+
bulkGetOperation,
141145
}
142146
}
143147

@@ -155,6 +159,8 @@ func (g *GCPStorage) Invoke(ctx context.Context, req *bindings.InvokeRequest) (*
155159
return g.list(ctx, req)
156160
case signOperation:
157161
return g.sign(ctx, req)
162+
case bulkGetOperation:
163+
return g.bulkGet(ctx, req)
158164
default:
159165
return nil, fmt.Errorf("unsupported operation %s", req.Operation)
160166
}
@@ -325,11 +331,11 @@ func (metadata gcpMetadata) mergeWithRequestMetadata(req *bindings.InvokeRequest
325331
merged := metadata
326332

327333
if val, ok := req.Metadata[metadataDecodeBase64]; ok && val != "" {
328-
merged.DecodeBase64 = utils.IsTruthy(val)
334+
merged.DecodeBase64 = strings.IsTruthy(val)
329335
}
330336

331337
if val, ok := req.Metadata[metadataEncodeBase64]; ok && val != "" {
332-
merged.EncodeBase64 = utils.IsTruthy(val)
338+
merged.EncodeBase64 = strings.IsTruthy(val)
333339
}
334340
if val, ok := req.Metadata[metadataSignTTL]; ok && val != "" {
335341
merged.SignTTL = val
@@ -404,3 +410,91 @@ func (g *GCPStorage) signObject(bucket, object, ttl string) (string, error) {
404410
}
405411
return u, nil
406412
}
413+
414+
type objectData struct {
415+
Name string `json:"name"`
416+
Data []byte `json:"data"`
417+
Attrs storage.ObjectAttrs `json:"attrs"`
418+
}
419+
420+
func (g *GCPStorage) bulkGet(ctx context.Context, req *bindings.InvokeRequest) (*bindings.InvokeResponse, error) {
421+
metadata, err := g.metadata.mergeWithRequestMetadata(req)
422+
if err != nil {
423+
return nil, fmt.Errorf("gcp binding error while merging metadata : %w", err)
424+
}
425+
426+
if g.metadata.Bucket == "" {
427+
return nil, errors.New("gcp bucket binding error: bucket is required")
428+
}
429+
430+
var allObjs []*storage.ObjectAttrs
431+
it := g.client.Bucket(g.metadata.Bucket).Objects(ctx, nil)
432+
for {
433+
attrs, err2 := it.Next()
434+
if err2 == iterator.Done {
435+
break
436+
}
437+
allObjs = append(allObjs, attrs)
438+
}
439+
440+
var wg sync.WaitGroup
441+
objectsCh := make(chan objectData, len(allObjs))
442+
errCh := make(chan error, len(allObjs))
443+
444+
for i, obj := range allObjs {
445+
wg.Add(1)
446+
go func(idx int, object *storage.ObjectAttrs) {
447+
defer wg.Done()
448+
449+
rc, err3 := g.client.Bucket(g.metadata.Bucket).Object(object.Name).NewReader(ctx)
450+
if err3 != nil {
451+
errCh <- err3
452+
return
453+
}
454+
defer rc.Close()
455+
456+
data, readErr := io.ReadAll(rc)
457+
if readErr != nil {
458+
errCh <- readErr
459+
return
460+
}
461+
462+
if metadata.EncodeBase64 {
463+
encoded := b64.StdEncoding.EncodeToString(data)
464+
data = []byte(encoded)
465+
}
466+
467+
objectsCh <- objectData{
468+
Name: object.Name,
469+
Data: data,
470+
Attrs: *object,
471+
}
472+
}(i, obj)
473+
}
474+
475+
wg.Wait()
476+
close(errCh)
477+
478+
var multiErr error
479+
for err := range errCh {
480+
multierr.AppendInto(&multiErr, err)
481+
}
482+
483+
if multiErr != nil {
484+
return nil, multiErr
485+
}
486+
487+
response := make([]objectData, 0, len(allObjs))
488+
for obj := range objectsCh {
489+
response = append(response, obj)
490+
}
491+
492+
jsonResponse, err := json.Marshal(response)
493+
if err != nil {
494+
return nil, fmt.Errorf("gcp bucket binding error while marshalling bulk get response: %w", err)
495+
}
496+
497+
return &bindings.InvokeResponse{
498+
Data: jsonResponse,
499+
}, nil
500+
}

bindings/gcp/bucket/bucket_test.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -254,3 +254,14 @@ func TestDeleteOption(t *testing.T) {
254254
require.Error(t, err)
255255
})
256256
}
257+
258+
func TestBulkGetOption(t *testing.T) {
259+
gs := GCPStorage{logger: logger.NewLogger("test")}
260+
gs.metadata = &gcpMetadata{}
261+
262+
t.Run("return error if bucket is missing", func(t *testing.T) {
263+
r := bindings.InvokeRequest{}
264+
_, err := gs.bulkGet(t.Context(), &r)
265+
require.Error(t, err)
266+
})
267+
}

bindings/http/http.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ import (
3434
"github.com/dapr/components-contrib/metadata"
3535
"github.com/dapr/kit/logger"
3636
kitmd "github.com/dapr/kit/metadata"
37-
"github.com/dapr/kit/utils"
37+
kitstrings "github.com/dapr/kit/strings"
3838
)
3939

4040
const (
@@ -137,7 +137,7 @@ func (h *HTTPSource) Init(_ context.Context, meta bindings.Metadata) error {
137137
}
138138

139139
if val := meta.Properties["errorIfNot2XX"]; val != "" {
140-
h.errorIfNot2XX = utils.IsTruthy(val)
140+
h.errorIfNot2XX = kitstrings.IsTruthy(val)
141141
} else {
142142
// Default behavior
143143
h.errorIfNot2XX = true
@@ -252,7 +252,7 @@ func (h *HTTPSource) Invoke(parentCtx context.Context, req *bindings.InvokeReque
252252
u = strings.TrimRight(u, "/") + "/" + strings.TrimLeft(req.Metadata["path"], "/")
253253
}
254254
if req.Metadata["errorIfNot2XX"] != "" {
255-
errorIfNot2XX = utils.IsTruthy(req.Metadata["errorIfNot2XX"])
255+
errorIfNot2XX = kitstrings.IsTruthy(req.Metadata["errorIfNot2XX"])
256256
}
257257

258258
var body io.Reader

0 commit comments

Comments
 (0)