mirror of
https://github.com/songquanpeng/one-api.git
synced 2025-09-30 07:06:38 +08:00
92 lines
3.7 KiB
Go
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-")
|
|
}
|