diff --git a/weed/s3api/chunked_reader_v4.go b/weed/s3api/chunked_reader_v4.go index 0d8677b20..31c711921 100644 --- a/weed/s3api/chunked_reader_v4.go +++ b/weed/s3api/chunked_reader_v4.go @@ -31,6 +31,7 @@ import ( "hash/crc32" "io" "net/http" + "strings" "time" "github.com/seaweedfs/seaweedfs/weed/glog" @@ -138,6 +139,7 @@ func (iam *IdentityAccessManagement) newChunkedReader(req *http.Request) (io.Rea func extractChecksumAlgorithm(amzTrailerHeader string) (ChecksumAlgorithm, error) { // Extract checksum algorithm from the x-amz-trailer header. + amzTrailerHeader = strings.ToLower(strings.TrimSpace(amzTrailerHeader)) switch amzTrailerHeader { case "x-amz-checksum-crc32": return ChecksumAlgorithmCRC32, nil diff --git a/weed/s3api/chunked_reader_v4_test.go b/weed/s3api/chunked_reader_v4_test.go index 3da13a71a..e386129c0 100644 --- a/weed/s3api/chunked_reader_v4_test.go +++ b/weed/s3api/chunked_reader_v4_test.go @@ -30,6 +30,16 @@ const ( defaultRegion = "us-east-1" ) +func TestExtractChecksumAlgorithmIsCaseInsensitive(t *testing.T) { + got, err := extractChecksumAlgorithm("X-Amz-Checksum-Crc32") + if err != nil { + t.Fatalf("extractChecksumAlgorithm returned error: %v", err) + } + if got != ChecksumAlgorithmCRC32 { + t.Fatalf("extractChecksumAlgorithm() = %v, want %v", got, ChecksumAlgorithmCRC32) + } +} + func generateStreamingUnsignedPayloadTrailerPayload(includeFinalCRLF bool) string { // This test will implement the following scenario: // https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html