From d26d52c45ef216309ac8732fced95d6a6f5fb471 Mon Sep 17 00:00:00 2001 From: Bala FA Date: Thu, 23 Jul 2020 01:45:11 +0000 Subject: [PATCH] fix: canonical header computation for multi-spaced header values (#1025) --- api/src/main/java/io/minio/Signer.java | 14 +++++++++++++- functional/FunctionalTest.java | 2 ++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/api/src/main/java/io/minio/Signer.java b/api/src/main/java/io/minio/Signer.java index 7a254d905..e7154cd2c 100644 --- a/api/src/main/java/io/minio/Signer.java +++ b/api/src/main/java/io/minio/Signer.java @@ -29,6 +29,7 @@ import java.util.Map; import java.util.Set; import java.util.TreeMap; +import java.util.stream.Collectors; import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec; import okhttp3.Headers; @@ -142,7 +143,18 @@ private void setCanonicalHeaders() { for (String name : headers.names()) { String signedHeader = name.toLowerCase(Locale.US); if (!IGNORED_HEADERS.contains(signedHeader)) { - this.canonicalHeaders.put(signedHeader, headers.get(name)); + // Convert and add header values as per + // https://docs.aws.amazon.com/general/latest/gr/sigv4-create-canonical-request.html + // * Header having multiple values should be converted to comma separated values. + // * Multi-spaced value of header should be trimmed to single spaced value. + this.canonicalHeaders.put( + signedHeader, + headers.values(name).stream() + .map( + value -> { + return value.replaceAll("( +)", " "); + }) + .collect(Collectors.joining(","))); } } diff --git a/functional/FunctionalTest.java b/functional/FunctionalTest.java index f840844b0..a9131a983 100644 --- a/functional/FunctionalTest.java +++ b/functional/FunctionalTest.java @@ -846,6 +846,8 @@ public static void putObject_test() throws Exception { Map userMetadata = new HashMap<>(); userMetadata.put("My-Project", "Project One"); + userMetadata.put("My-header1", " a b c "); + userMetadata.put("My-Header2", "\"a b c\""); testPutObject( "[user metadata]",