73 lines
2.1 KiB
Go
73 lines
2.1 KiB
Go
|
package middleware
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
"fmt"
|
||
|
"time"
|
||
|
|
||
|
"git.frostfs.info/TrueCloudLab/frostfs-s3-gw/api/auth"
|
||
|
"git.frostfs.info/TrueCloudLab/frostfs-s3-gw/creds/accessbox"
|
||
|
)
|
||
|
|
||
|
// keyWrapper is wrapper for context keys.
|
||
|
type keyWrapper string
|
||
|
|
||
|
// authHeaders is a wrapper for authentication headers of a request.
|
||
|
var authHeadersKey = keyWrapper("__context_auth_headers_key")
|
||
|
|
||
|
// boxData is an ID used to store accessbox.Box in a context.
|
||
|
var boxDataKey = keyWrapper("__context_box_key")
|
||
|
|
||
|
// clientTime is an ID used to store client time.Time in a context.
|
||
|
var clientTimeKey = keyWrapper("__context_client_time")
|
||
|
|
||
|
// GetBoxData extracts accessbox.Box from context.
|
||
|
func GetBoxData(ctx context.Context) (*accessbox.Box, error) {
|
||
|
var box *accessbox.Box
|
||
|
data, ok := ctx.Value(boxDataKey).(*accessbox.Box)
|
||
|
if !ok || data == nil {
|
||
|
return nil, fmt.Errorf("couldn't get box data from context")
|
||
|
}
|
||
|
|
||
|
box = data
|
||
|
if box.Gate == nil {
|
||
|
box.Gate = &accessbox.GateData{}
|
||
|
}
|
||
|
return box, nil
|
||
|
}
|
||
|
|
||
|
// GetAuthHeaders extracts auth.AuthHeader from context.
|
||
|
func GetAuthHeaders(ctx context.Context) (*auth.AuthHeader, error) {
|
||
|
authHeaders, ok := ctx.Value(authHeadersKey).(*auth.AuthHeader)
|
||
|
if !ok {
|
||
|
return nil, fmt.Errorf("couldn't get auth headers from context")
|
||
|
}
|
||
|
|
||
|
return authHeaders, nil
|
||
|
}
|
||
|
|
||
|
// GetClientTime extracts time.Time from context.
|
||
|
func GetClientTime(ctx context.Context) (time.Time, error) {
|
||
|
clientTime, ok := ctx.Value(clientTimeKey).(time.Time)
|
||
|
if !ok {
|
||
|
return time.Time{}, fmt.Errorf("couldn't get client time from context")
|
||
|
}
|
||
|
|
||
|
return clientTime, nil
|
||
|
}
|
||
|
|
||
|
// SetBoxData sets accessbox.Box in the context.
|
||
|
func SetBoxData(ctx context.Context, box *accessbox.Box) context.Context {
|
||
|
return context.WithValue(ctx, boxDataKey, box)
|
||
|
}
|
||
|
|
||
|
// SetAuthHeaders sets auth.AuthHeader in the context.
|
||
|
func SetAuthHeaders(ctx context.Context, header *auth.AuthHeader) context.Context {
|
||
|
return context.WithValue(ctx, authHeadersKey, header)
|
||
|
}
|
||
|
|
||
|
// SetClientTime sets time.Time in the context.
|
||
|
func SetClientTime(ctx context.Context, newTime time.Time) context.Context {
|
||
|
return context.WithValue(ctx, clientTimeKey, newTime)
|
||
|
}
|