one-api/providers/bedrock/sigv4/header.go
Buer b81808e839
feat: support amazon bedrock anthropic (#114)
* 🚧 WIP: bedrock

*  feat: support amazon bedrock anthropic
2024-03-18 16:00:35 +08:00

92 lines
3.7 KiB
Go

package sigv4
// ignoredHeaders is a list of headers that are always ignored during signing.
var ignoreHeaders = map[string]struct{}{
"Authorization": {},
"User-Agent": {},
"X-Amzn-Trace-Id": {},
// also include lower case canonical versions
"authorization": {},
"user-agent": {},
"x-amzn-trace-id": {},
}
// requiredHeaderPrefix are header name prefixes that are mandatory for signing.
// If a header has one of these prefixes, it is a mandatory header.
var requiredHeaderPrefix = []string{"X-Amz-Object-Lock-", "X-Amz-Meta-"}
// requiredHeaders is a list of headers that are mandatory for signing.
var requiredHeaders = map[string]struct{}{
"Cache-Control": {},
"Content-Disposition": {},
"Content-Encoding": {},
"Content-Language": {},
"Content-Md5": {},
"Content-Type": {},
"Expires": {},
"If-Match": {},
"If-Modified-Since": {},
"If-None-Match": {},
"If-Unmodified-Since": {},
"Range": {},
"X-Amz-Acl": {},
"X-Amz-Copy-Source": {},
"X-Amz-Copy-Source-If-Match": {},
"X-Amz-Copy-Source-If-Modified-Since": {},
"X-Amz-Copy-Source-If-None-Match": {},
"X-Amz-Copy-Source-If-Unmodified-Since": {},
"X-Amz-Copy-Source-Range": {},
"X-Amz-Copy-Source-Server-Side-Encryption-Customer-Algorithm": {},
"X-Amz-Copy-Source-Server-Side-Encryption-Customer-Key": {},
"X-Amz-Copy-Source-Server-Side-Encryption-Customer-Key-Md5": {},
"X-Amz-Grant-Full-control": {},
"X-Amz-Grant-Read": {},
"X-Amz-Grant-Read-Acp": {},
"X-Amz-Grant-Write": {},
"X-Amz-Grant-Write-Acp": {},
"X-Amz-Metadata-Directive": {},
"X-Amz-Mfa": {},
"X-Amz-Request-Payer": {},
"X-Amz-Server-Side-Encryption": {},
"X-Amz-Server-Side-Encryption-Aws-Kms-Key-Id": {},
"X-Amz-Server-Side-Encryption-Customer-Algorithm": {},
"X-Amz-Server-Side-Encryption-Customer-Key": {},
"X-Amz-Server-Side-Encryption-Customer-Key-Md5": {},
"X-Amz-Storage-Class": {},
"X-Amz-Website-Redirect-Location": {},
"X-Amz-Content-Sha256": {},
"X-Amz-Tagging": {},
}
// headerPredicate is a function that evaluates whether a header is of the
// specific type. For example, whether a header should be ignored during signing.
type headerPredicate func(header string) bool
// isIgnoredHeader returns true if header must be ignored during signing.
func isIgnoredHeader(header string) bool {
_, ok := ignoreHeaders[header]
return ok
}
// isRequiredHeader returns true if header is mandatory for signing.
func isRequiredHeader(header string) bool {
_, ok := requiredHeaders[header]
if ok {
return true
}
for _, v := range requiredHeaderPrefix {
if hasPrefixFold(header, v) {
return true
}
}
return false
}
// isAllowQueryHoisting is a allowed list for Build query headers.
func isAllowQueryHoisting(header string) bool {
if isRequiredHeader(header) {
return false
}
return hasPrefixFold(header, "X-Amz-")
}