Merge branch 'master' into feature/pubsub-batching
This commit is contained in:
commit
38c58ac87b
|
@ -46,7 +46,8 @@ const (
|
|||
|
||||
metadataKey = "key"
|
||||
|
||||
maxResults = 1000
|
||||
maxResults = 1000
|
||||
presignOperation = "presign"
|
||||
)
|
||||
|
||||
// AWSS3 is a binding for an AWS S3 storage bucket.
|
||||
|
@ -80,6 +81,10 @@ type createResponse struct {
|
|||
PresignURL string `json:"presignURL,omitempty"`
|
||||
}
|
||||
|
||||
type presignResponse struct {
|
||||
PresignURL string `json:"presignURL"`
|
||||
}
|
||||
|
||||
type listPayload struct {
|
||||
Marker string `json:"marker"`
|
||||
Prefix string `json:"prefix"`
|
||||
|
@ -138,6 +143,7 @@ func (s *AWSS3) Operations() []bindings.OperationKind {
|
|||
bindings.GetOperation,
|
||||
bindings.DeleteOperation,
|
||||
bindings.ListOperation,
|
||||
presignOperation,
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -184,18 +190,9 @@ func (s *AWSS3) create(ctx context.Context, req *bindings.InvokeRequest) (*bindi
|
|||
|
||||
var presignURL string
|
||||
if metadata.PresignTTL != "" {
|
||||
d, parseErr := time.ParseDuration(metadata.PresignTTL)
|
||||
if parseErr != nil {
|
||||
return nil, fmt.Errorf("s3 binding error: Cannot parse duration %s: %s", metadata.PresignTTL, parseErr)
|
||||
}
|
||||
|
||||
req, _ := s.s3Client.GetObjectRequest(&s3.GetObjectInput{
|
||||
Bucket: aws.String(metadata.Bucket),
|
||||
Key: aws.String(key),
|
||||
})
|
||||
url, signErr := req.Presign(d)
|
||||
if signErr != nil {
|
||||
return nil, fmt.Errorf("s3 binding error: Failed to presign URL: %s", signErr)
|
||||
url, presignErr := s.presignObject(metadata.Bucket, key, metadata.PresignTTL)
|
||||
if presignErr != nil {
|
||||
return nil, fmt.Errorf("s3 binding error: %s", presignErr)
|
||||
}
|
||||
|
||||
presignURL = url
|
||||
|
@ -215,6 +212,57 @@ func (s *AWSS3) create(ctx context.Context, req *bindings.InvokeRequest) (*bindi
|
|||
}, nil
|
||||
}
|
||||
|
||||
func (s *AWSS3) presign(ctx context.Context, req *bindings.InvokeRequest) (*bindings.InvokeResponse, error) {
|
||||
metadata, err := s.metadata.mergeWithRequestMetadata(req)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("s3 binding error: error merging metadata: %w", err)
|
||||
}
|
||||
var key string
|
||||
if val, ok := req.Metadata[metadataKey]; ok && val != "" {
|
||||
key = val
|
||||
} else {
|
||||
return nil, fmt.Errorf("s3 binding error: required metadata '%s' missing", metadataKey)
|
||||
}
|
||||
|
||||
if metadata.PresignTTL == "" {
|
||||
return nil, fmt.Errorf("s3 binding error: required metadata '%s' missing", metadataPresignTTL)
|
||||
}
|
||||
|
||||
url, err := s.presignObject(metadata.Bucket, key, metadata.PresignTTL)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("s3 binding error: %w", err)
|
||||
}
|
||||
|
||||
jsonResponse, err := json.Marshal(presignResponse{
|
||||
PresignURL: url,
|
||||
})
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("s3 binding error: Error marshalling presign response: %w", err)
|
||||
}
|
||||
|
||||
return &bindings.InvokeResponse{
|
||||
Data: jsonResponse,
|
||||
}, nil
|
||||
}
|
||||
|
||||
func (s *AWSS3) presignObject(bucket, key, ttl string) (string, error) {
|
||||
d, err := time.ParseDuration(ttl)
|
||||
if err != nil {
|
||||
return "", fmt.Errorf("cannot parse duration %s: %w", ttl, err)
|
||||
}
|
||||
|
||||
objReq, _ := s.s3Client.GetObjectRequest(&s3.GetObjectInput{
|
||||
Bucket: aws.String(bucket),
|
||||
Key: aws.String(key),
|
||||
})
|
||||
url, err := objReq.Presign(d)
|
||||
if err != nil {
|
||||
return "", fmt.Errorf("failed to presign URL: %w", err)
|
||||
}
|
||||
|
||||
return url, nil
|
||||
}
|
||||
|
||||
func (s *AWSS3) get(ctx context.Context, req *bindings.InvokeRequest) (*bindings.InvokeResponse, error) {
|
||||
metadata, err := s.metadata.mergeWithRequestMetadata(req)
|
||||
if err != nil {
|
||||
|
@ -316,6 +364,8 @@ func (s *AWSS3) Invoke(ctx context.Context, req *bindings.InvokeRequest) (*bindi
|
|||
return s.delete(ctx, req)
|
||||
case bindings.ListOperation:
|
||||
return s.list(ctx, req)
|
||||
case presignOperation:
|
||||
return s.presign(ctx, req)
|
||||
default:
|
||||
return nil, fmt.Errorf("s3 binding error. unsupported operation %s", req.Operation)
|
||||
}
|
||||
|
|
|
@ -73,17 +73,22 @@ func (m *Middleware) GetHandler(metadata middleware.Metadata) (func(h fasthttp.R
|
|||
TokenURL: meta.TokenURL,
|
||||
},
|
||||
}
|
||||
|
||||
session := sessions.StartFasthttp(ctx)
|
||||
if session.GetString(meta.AuthHeaderName) != "" {
|
||||
ctx.Request.Header.Add(meta.AuthHeaderName, session.GetString(meta.AuthHeaderName))
|
||||
h(ctx)
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
state := string(ctx.FormValue(stateParam))
|
||||
//nolint:nestif
|
||||
if state == "" {
|
||||
id, _ := uuid.NewUUID()
|
||||
id, err := uuid.NewRandom()
|
||||
if err != nil {
|
||||
ctx.Error(fasthttp.StatusMessage(fasthttp.StatusInternalServerError), fasthttp.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
session.Set(savedState, id.String())
|
||||
session.Set(redirectPath, string(ctx.RequestURI()))
|
||||
url := conf.AuthCodeURL(id.String(), oauth2.AccessTypeOffline)
|
||||
|
@ -100,15 +105,17 @@ func (m *Middleware) GetHandler(metadata middleware.Metadata) (func(h fasthttp.R
|
|||
code := string(ctx.FormValue(codeParam))
|
||||
if code == "" {
|
||||
ctx.Error("code not found", fasthttp.StatusBadRequest)
|
||||
} else {
|
||||
token, err := conf.Exchange(context.Background(), code)
|
||||
if err != nil {
|
||||
ctx.Error(err.Error(), fasthttp.StatusInternalServerError)
|
||||
}
|
||||
session.Set(meta.AuthHeaderName, token.Type()+" "+token.AccessToken)
|
||||
ctx.Request.Header.Add(meta.AuthHeaderName, token.Type()+" "+token.AccessToken)
|
||||
ctx.Redirect(redirectURL, 302)
|
||||
return
|
||||
}
|
||||
|
||||
token, err := conf.Exchange(context.Background(), code)
|
||||
if err != nil {
|
||||
ctx.Error(err.Error(), fasthttp.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
session.Set(meta.AuthHeaderName, token.Type()+" "+token.AccessToken)
|
||||
ctx.Request.Header.Add(meta.AuthHeaderName, token.Type()+" "+token.AccessToken)
|
||||
ctx.Redirect(redirectURL, 302)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue