From a3323de5da924215c8ae9710e4fc684d4f9af2e1 Mon Sep 17 00:00:00 2001 From: Napster Date: Tue, 13 Feb 2024 16:59:42 +0100 Subject: [PATCH] Handle trailing semicolon when parsing Accept-Language header --- .../java/org/springframework/http/HttpHeaders.java | 3 +++ .../org/springframework/http/HttpHeadersTests.java | 13 +++++++++++++ 2 files changed, 16 insertions(+) diff --git a/spring-web/src/main/java/org/springframework/http/HttpHeaders.java b/spring-web/src/main/java/org/springframework/http/HttpHeaders.java index d1656fbf843d..5e16013e1723 100644 --- a/spring-web/src/main/java/org/springframework/http/HttpHeaders.java +++ b/spring-web/src/main/java/org/springframework/http/HttpHeaders.java @@ -502,6 +502,9 @@ public void setAcceptLanguage(List languages) { */ public List getAcceptLanguage() { String value = getFirst(ACCEPT_LANGUAGE); + if (value != null) { + value = StringUtils.trimTrailingCharacter(value, ';'); + } return (StringUtils.hasText(value) ? Locale.LanguageRange.parse(value) : Collections.emptyList()); } diff --git a/spring-web/src/test/java/org/springframework/http/HttpHeadersTests.java b/spring-web/src/test/java/org/springframework/http/HttpHeadersTests.java index 18696a7a1609..a95bdc6c9dce 100644 --- a/spring-web/src/test/java/org/springframework/http/HttpHeadersTests.java +++ b/spring-web/src/test/java/org/springframework/http/HttpHeadersTests.java @@ -489,6 +489,19 @@ void acceptLanguage() { assertThat(headers.getAcceptLanguageAsLocales()).element(0).isEqualTo(Locale.FRANCE); } + @Test + void acceptLanguageTrailingSemicolon() { + String headerValue = "en-us,en;"; + headers.set(HttpHeaders.ACCEPT_LANGUAGE, headerValue); + assertThat(headers.getFirst(HttpHeaders.ACCEPT_LANGUAGE)).isEqualTo(headerValue); + + List expectedRanges = Arrays.asList( + new Locale.LanguageRange("en-us"), + new Locale.LanguageRange("en") + ); + assertThat(headers.getAcceptLanguage()).isEqualTo(expectedRanges); + } + @Test // SPR-15603 void acceptLanguageWithEmptyValue() { this.headers.set(HttpHeaders.ACCEPT_LANGUAGE, "");