diff --git a/paimon-api/src/main/java/org/apache/paimon/rest/auth/DLFOpenApiV4Signer.java b/paimon-api/src/main/java/org/apache/paimon/rest/auth/DLFOpenApiV4Signer.java index 4c090c7a8b09..1b7e833210ba 100644 --- a/paimon-api/src/main/java/org/apache/paimon/rest/auth/DLFOpenApiV4Signer.java +++ b/paimon-api/src/main/java/org/apache/paimon/rest/auth/DLFOpenApiV4Signer.java @@ -34,6 +34,7 @@ import java.util.Arrays; import java.util.HashMap; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.UUID; @@ -252,7 +253,7 @@ private static CanonicalHeadersResult buildCanonicalHeaders(Map Map valueMap = new HashMap<>(); for (Map.Entry entry : headers.entrySet()) { - String lowerKey = entry.getKey().toLowerCase(); + String lowerKey = entry.getKey().toLowerCase(Locale.ROOT); if (lowerKey.startsWith("x-acs-") || lowerKey.equals(HOST_HEADER) || lowerKey.equals(CONTENT_TYPE_HEADER)) { diff --git a/paimon-api/src/test/java/org/apache/paimon/rest/auth/DLFOpenApiV4SignerTest.java b/paimon-api/src/test/java/org/apache/paimon/rest/auth/DLFOpenApiV4SignerTest.java index a81358aa8811..67d40499de78 100644 --- a/paimon-api/src/test/java/org/apache/paimon/rest/auth/DLFOpenApiV4SignerTest.java +++ b/paimon-api/src/test/java/org/apache/paimon/rest/auth/DLFOpenApiV4SignerTest.java @@ -25,6 +25,7 @@ import java.time.ZonedDateTime; import java.util.HashMap; import java.util.LinkedHashMap; +import java.util.Locale; import java.util.Map; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -164,6 +165,27 @@ public void testDeterministicSignature() throws Exception { assertEquals(auth1, auth2); } + @Test + public void testAuthorizationWithTurkishLocale() throws Exception { + Locale originalLocale = Locale.getDefault(); + try { + Locale.setDefault(Locale.US); + DLFOpenApiV4Signer signer = new DLFOpenApiV4Signer(REGION); + DLFToken token = new DLFToken("TestAKId", "TestAKSecret", null, null); + RESTAuthParameter restAuthParameter = + new RESTAuthParameter("/test/path", new HashMap<>(), "GET", null); + Map headers = signer.signHeaders(null, NOW, null, HOST); + headers.put("x-acs-signature-nonce", "fixed-nonce-for-test"); + headers.put("X-ACS-SIGNATURE-NONCE", headers.remove("x-acs-signature-nonce")); + + String expected = signer.authorization(restAuthParameter, token, HOST, headers); + Locale.setDefault(new Locale("tr", "TR")); + assertEquals(expected, signer.authorization(restAuthParameter, token, HOST, headers)); + } finally { + Locale.setDefault(originalLocale); + } + } + @Test public void testSignatureCoversQueryParameters() throws Exception { DLFOpenApiV4Signer signer = new DLFOpenApiV4Signer(REGION);