This is an automated email from the ASF dual-hosted git repository.
lzljs3620320 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/paimon.git
The following commit(s) were added to refs/heads/master by this push:
new d26b2947a6 [api] Fix locale-sensitive date formatting in
DLFOpenApiSigner (#7577)
d26b2947a6 is described below
commit d26b2947a6874161b17d6fdfceeb4ff4921e959c
Author: Jiajia Li <[email protected]>
AuthorDate: Thu Apr 2 13:43:42 2026 +0800
[api] Fix locale-sensitive date formatting in DLFOpenApiSigner (#7577)
Pin DateTimeFormatter to Locale.ENGLISH so RFC 1123 date headers are
always in English regardless of JVM default locale. Add tests for
Chinese and Japanese locales.
Fix locale-sensitive date formatting in `DLFOpenApiSigner`. The
`DateTimeFormatter` for RFC 1123 dates was not pinned to
`Locale.ENGLISH`, causing day/month names to be localized on non-English
JVM locales (e.g. zh_CN, ja_JP), which breaks the Aliyun OpenAPI
signature.
---
.../apache/paimon/rest/auth/DLFOpenApiSigner.java | 3 +-
.../paimon/rest/auth/DLFRequestSignerTest.java | 41 ++++++++++++++++++++++
2 files changed, 43 insertions(+), 1 deletion(-)
diff --git
a/paimon-api/src/main/java/org/apache/paimon/rest/auth/DLFOpenApiSigner.java
b/paimon-api/src/main/java/org/apache/paimon/rest/auth/DLFOpenApiSigner.java
index 80f8761850..aaf3713828 100644
--- a/paimon-api/src/main/java/org/apache/paimon/rest/auth/DLFOpenApiSigner.java
+++ b/paimon-api/src/main/java/org/apache/paimon/rest/auth/DLFOpenApiSigner.java
@@ -31,6 +31,7 @@ import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Base64;
import java.util.HashMap;
+import java.util.Locale;
import java.util.Map;
import java.util.TreeMap;
import java.util.UUID;
@@ -65,7 +66,7 @@ public class DLFOpenApiSigner implements DLFRequestSigner {
private static final String API_VERSION = "2026-01-18";
private static final DateTimeFormatter GMT_DATE_FORMATTER =
- DateTimeFormatter.ofPattern("EEE, dd MMM yyyy HH:mm:ss 'GMT'")
+ DateTimeFormatter.ofPattern("EEE, dd MMM yyyy HH:mm:ss 'GMT'",
Locale.ENGLISH)
.withZone(ZoneId.of("GMT"));
@Override
diff --git
a/paimon-api/src/test/java/org/apache/paimon/rest/auth/DLFRequestSignerTest.java
b/paimon-api/src/test/java/org/apache/paimon/rest/auth/DLFRequestSignerTest.java
index ef9d44aa5e..e1b67e3a9e 100644
---
a/paimon-api/src/test/java/org/apache/paimon/rest/auth/DLFRequestSignerTest.java
+++
b/paimon-api/src/test/java/org/apache/paimon/rest/auth/DLFRequestSignerTest.java
@@ -26,6 +26,7 @@ import java.time.ZonedDateTime;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
+import java.util.Locale;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.CountDownLatch;
@@ -274,6 +275,46 @@ public class DLFRequestSignerTest {
assertEquals("2026-01-18", headers.get("x-acs-version"));
}
+ @Test
+ public void testOpenApiDateFormatWithNonEnglishLocale() {
+ Locale originalLocale = Locale.getDefault();
+ try {
+ // Simulate Chinese locale environment (e.g., zh_CN, zh_US_#Hans)
+ Locale.setDefault(Locale.CHINA);
+
+ DLFOpenApiSigner signer = new DLFOpenApiSigner();
+ Instant now = ZonedDateTime.of(2025, 4, 16, 3, 44, 46, 0,
ZoneOffset.UTC).toInstant();
+ String host = "dlfnext.cn-hangzhou.aliyuncs.com";
+
+ Map<String, String> headers = signer.signHeaders(null, now, null,
host);
+ String dateValue = headers.get("Date");
+
+ // Date must always be in English RFC 1123 format regardless of
JVM locale
+ assertEquals("Wed, 16 Apr 2025 03:44:46 GMT", dateValue);
+ } finally {
+ Locale.setDefault(originalLocale);
+ }
+ }
+
+ @Test
+ public void testOpenApiDateFormatWithJapaneseLocale() {
+ Locale originalLocale = Locale.getDefault();
+ try {
+ Locale.setDefault(Locale.JAPAN);
+
+ DLFOpenApiSigner signer = new DLFOpenApiSigner();
+ Instant now = ZonedDateTime.of(2025, 4, 16, 3, 44, 46, 0,
ZoneOffset.UTC).toInstant();
+ String host = "dlfnext.cn-hangzhou.aliyuncs.com";
+
+ Map<String, String> headers = signer.signHeaders(null, now, null,
host);
+ String dateValue = headers.get("Date");
+
+ assertEquals("Wed, 16 Apr 2025 03:44:46 GMT", dateValue);
+ } finally {
+ Locale.setDefault(originalLocale);
+ }
+ }
+
@Test
public void testConcurrentNonceGeneration() throws InterruptedException {
DLFOpenApiSigner signer = new DLFOpenApiSigner();