From d5dc396200c28b927ea9affcb50b5afece007247 Mon Sep 17 00:00:00 2001 From: YuXiaoFeng <43255432@qq.com> Date: Wed, 12 Nov 2025 17:31:38 +0800 Subject: [PATCH 1/6] Specify Locale for Last-Modified header formatter Signed-off-by: YuXiaoFeng <43255432@qq.com> --- .../contrib/providers/gofeatureflag/api/GoFeatureFlagApi.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/providers/go-feature-flag/src/main/java/dev/openfeature/contrib/providers/gofeatureflag/api/GoFeatureFlagApi.java b/providers/go-feature-flag/src/main/java/dev/openfeature/contrib/providers/gofeatureflag/api/GoFeatureFlagApi.java index a8f05eace..6a8bf1ab1 100644 --- a/providers/go-feature-flag/src/main/java/dev/openfeature/contrib/providers/gofeatureflag/api/GoFeatureFlagApi.java +++ b/providers/go-feature-flag/src/main/java/dev/openfeature/contrib/providers/gofeatureflag/api/GoFeatureFlagApi.java @@ -284,7 +284,7 @@ private Date extractLastUpdatedFromHeaders(final HttpResponse response) String headerValue = response.headers() .firstValue(Const.HTTP_HEADER_LAST_MODIFIED) .orElse(null); - SimpleDateFormat lastModifiedHeaderFormatter = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss zzz"); + SimpleDateFormat lastModifiedHeaderFormatter = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss zzz", Locale.ENGLISH); return headerValue != null ? lastModifiedHeaderFormatter.parse(headerValue) : null; } catch (Exception e) { log.debug("Error parsing Last-Modified header: {}", e.getMessage()); From 17f8c20fda3a5469ed5fce2db29aed911909f894 Mon Sep 17 00:00:00 2001 From: YuXiaoFeng <43255432@qq.com> Date: Wed, 12 Nov 2025 17:40:47 +0800 Subject: [PATCH 2/6] Add import for Locale in GoFeatureFlagApi Signed-off-by: YuXiaoFeng <43255432@qq.com> --- .../contrib/providers/gofeatureflag/api/GoFeatureFlagApi.java | 1 + 1 file changed, 1 insertion(+) diff --git a/providers/go-feature-flag/src/main/java/dev/openfeature/contrib/providers/gofeatureflag/api/GoFeatureFlagApi.java b/providers/go-feature-flag/src/main/java/dev/openfeature/contrib/providers/gofeatureflag/api/GoFeatureFlagApi.java index 6a8bf1ab1..61bbc5760 100644 --- a/providers/go-feature-flag/src/main/java/dev/openfeature/contrib/providers/gofeatureflag/api/GoFeatureFlagApi.java +++ b/providers/go-feature-flag/src/main/java/dev/openfeature/contrib/providers/gofeatureflag/api/GoFeatureFlagApi.java @@ -34,6 +34,7 @@ import java.time.Duration; import java.util.Collections; import java.util.Date; +import java.util.Locale; import java.util.List; import java.util.Map; import lombok.Builder; From 15e96d8f0fffe72ba94386f530742b51e0898760 Mon Sep 17 00:00:00 2001 From: YuXiaoFeng <43255432@qq.com> Date: Thu, 13 Nov 2025 09:49:18 +0800 Subject: [PATCH 3/6] Refactor Last-Modified header parsing logic Signed-off-by: YuXiaoFeng <43255432@qq.com> --- .../gofeatureflag/api/GoFeatureFlagApi.java | 24 ++++++++++++------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/providers/go-feature-flag/src/main/java/dev/openfeature/contrib/providers/gofeatureflag/api/GoFeatureFlagApi.java b/providers/go-feature-flag/src/main/java/dev/openfeature/contrib/providers/gofeatureflag/api/GoFeatureFlagApi.java index 61bbc5760..bbbf89bd9 100644 --- a/providers/go-feature-flag/src/main/java/dev/openfeature/contrib/providers/gofeatureflag/api/GoFeatureFlagApi.java +++ b/providers/go-feature-flag/src/main/java/dev/openfeature/contrib/providers/gofeatureflag/api/GoFeatureFlagApi.java @@ -32,9 +32,11 @@ import java.net.http.HttpResponse; import java.text.SimpleDateFormat; import java.time.Duration; +import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeParseException; import java.util.Collections; import java.util.Date; -import java.util.Locale; import java.util.List; import java.util.Map; import lombok.Builder; @@ -281,14 +283,20 @@ private FlagConfigResponse handleFlagConfigurationSuccess(final HttpResponse response) { + Optional headerOpt = response.headers() + .firstValue(Const.HTTP_HEADER_LAST_MODIFIED); + if (!headerOpt.isPresent()) { + log.debug("Last-Modified header is not present in the response"); + return null; + } + String headerValue = headerOpt.get(); try { - String headerValue = response.headers() - .firstValue(Const.HTTP_HEADER_LAST_MODIFIED) - .orElse(null); - SimpleDateFormat lastModifiedHeaderFormatter = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss zzz", Locale.ENGLISH); - return headerValue != null ? lastModifiedHeaderFormatter.parse(headerValue) : null; - } catch (Exception e) { - log.debug("Error parsing Last-Modified header: {}", e.getMessage()); + return Date.from( + ZonedDateTime.parse(headerValue, DateTimeFormatter.RFC_1123_DATE_TIME) + .toInstant() + ); + } catch (DateTimeParseException e) { + log.debug("Failed to parse Last-Modified header: '{}'. Cause: {}", headerValue, e.getMessage()); return null; } } From 5f72ec80291e6b500ac3db8b19fe4d13c51bb661 Mon Sep 17 00:00:00 2001 From: YuXiaoFeng <43255432@qq.com> Date: Thu, 13 Nov 2025 18:55:36 +0800 Subject: [PATCH 4/6] Fix formatting of log debug statement Signed-off-by: YuXiaoFeng <43255432@qq.com> --- .../contrib/providers/gofeatureflag/api/GoFeatureFlagApi.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/providers/go-feature-flag/src/main/java/dev/openfeature/contrib/providers/gofeatureflag/api/GoFeatureFlagApi.java b/providers/go-feature-flag/src/main/java/dev/openfeature/contrib/providers/gofeatureflag/api/GoFeatureFlagApi.java index bbbf89bd9..2c1eed0ee 100644 --- a/providers/go-feature-flag/src/main/java/dev/openfeature/contrib/providers/gofeatureflag/api/GoFeatureFlagApi.java +++ b/providers/go-feature-flag/src/main/java/dev/openfeature/contrib/providers/gofeatureflag/api/GoFeatureFlagApi.java @@ -39,6 +39,7 @@ import java.util.Date; import java.util.List; import java.util.Map; +import java.util.Optional; import lombok.Builder; import lombok.extern.slf4j.Slf4j; import lombok.val; @@ -296,7 +297,7 @@ private Date extractLastUpdatedFromHeaders(final HttpResponse response) .toInstant() ); } catch (DateTimeParseException e) { - log.debug("Failed to parse Last-Modified header: '{}'. Cause: {}", headerValue, e.getMessage()); + log.debug("Failed to parse Last-Modified header: '{}'. Cause: {}", headerValue, e.getMessage()); return null; } } From c6f7a3ae72919b60e41df19099d44a6897d9ca74 Mon Sep 17 00:00:00 2001 From: YuXiaoFeng <43255432@qq.com> Date: Tue, 18 Nov 2025 10:34:09 +0800 Subject: [PATCH 5/6] Update GoFeatureFlagApi.java Signed-off-by: YuXiaoFeng <43255432@qq.com> --- .../gofeatureflag/api/GoFeatureFlagApi.java | 25 ++++++------------- 1 file changed, 8 insertions(+), 17 deletions(-) diff --git a/providers/go-feature-flag/src/main/java/dev/openfeature/contrib/providers/gofeatureflag/api/GoFeatureFlagApi.java b/providers/go-feature-flag/src/main/java/dev/openfeature/contrib/providers/gofeatureflag/api/GoFeatureFlagApi.java index 2c1eed0ee..a70cd1e49 100644 --- a/providers/go-feature-flag/src/main/java/dev/openfeature/contrib/providers/gofeatureflag/api/GoFeatureFlagApi.java +++ b/providers/go-feature-flag/src/main/java/dev/openfeature/contrib/providers/gofeatureflag/api/GoFeatureFlagApi.java @@ -32,14 +32,11 @@ import java.net.http.HttpResponse; import java.text.SimpleDateFormat; import java.time.Duration; -import java.time.ZonedDateTime; -import java.time.format.DateTimeFormatter; -import java.time.format.DateTimeParseException; import java.util.Collections; import java.util.Date; import java.util.List; +import java.util.Locale; import java.util.Map; -import java.util.Optional; import lombok.Builder; import lombok.extern.slf4j.Slf4j; import lombok.val; @@ -284,20 +281,14 @@ private FlagConfigResponse handleFlagConfigurationSuccess(final HttpResponse response) { - Optional headerOpt = response.headers() - .firstValue(Const.HTTP_HEADER_LAST_MODIFIED); - if (!headerOpt.isPresent()) { - log.debug("Last-Modified header is not present in the response"); - return null; - } - String headerValue = headerOpt.get(); try { - return Date.from( - ZonedDateTime.parse(headerValue, DateTimeFormatter.RFC_1123_DATE_TIME) - .toInstant() - ); - } catch (DateTimeParseException e) { - log.debug("Failed to parse Last-Modified header: '{}'. Cause: {}", headerValue, e.getMessage()); + String headerValue = response.headers() + .firstValue(Const.HTTP_HEADER_LAST_MODIFIED) + .orElse(null); + SimpleDateFormat lastModifiedHeaderFormatter = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss zzz", Locale.ENGLISH); + return headerValue != null ? lastModifiedHeaderFormatter.parse(headerValue) : null; + } catch (Exception e) { + log.debug("Error parsing Last-Modified header: {}", e.getMessage()); return null; } } From 8d0f9975499a74fefc647a881c3e7917155d6a58 Mon Sep 17 00:00:00 2001 From: YuXiaoFeng <43255432@qq.com> Date: Thu, 20 Nov 2025 10:48:48 +0800 Subject: [PATCH 6/6] Refactor date formatter initialization for clarity Signed-off-by: YuXiaoFeng <43255432@qq.com> --- .../contrib/providers/gofeatureflag/api/GoFeatureFlagApi.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/providers/go-feature-flag/src/main/java/dev/openfeature/contrib/providers/gofeatureflag/api/GoFeatureFlagApi.java b/providers/go-feature-flag/src/main/java/dev/openfeature/contrib/providers/gofeatureflag/api/GoFeatureFlagApi.java index a70cd1e49..591a05338 100644 --- a/providers/go-feature-flag/src/main/java/dev/openfeature/contrib/providers/gofeatureflag/api/GoFeatureFlagApi.java +++ b/providers/go-feature-flag/src/main/java/dev/openfeature/contrib/providers/gofeatureflag/api/GoFeatureFlagApi.java @@ -285,7 +285,8 @@ private Date extractLastUpdatedFromHeaders(final HttpResponse response) String headerValue = response.headers() .firstValue(Const.HTTP_HEADER_LAST_MODIFIED) .orElse(null); - SimpleDateFormat lastModifiedHeaderFormatter = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss zzz", Locale.ENGLISH); + SimpleDateFormat lastModifiedHeaderFormatter = + new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss zzz", Locale.ENGLISH); return headerValue != null ? lastModifiedHeaderFormatter.parse(headerValue) : null; } catch (Exception e) { log.debug("Error parsing Last-Modified header: {}", e.getMessage());