Skip to content

Commit a3323de

Browse files
committed
Handle trailing semicolon when parsing Accept-Language header
1 parent 9b93c94 commit a3323de

File tree

2 files changed

+16
-0
lines changed

2 files changed

+16
-0
lines changed

spring-web/src/main/java/org/springframework/http/HttpHeaders.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -502,6 +502,9 @@ public void setAcceptLanguage(List<Locale.LanguageRange> languages) {
502502
*/
503503
public List<Locale.LanguageRange> getAcceptLanguage() {
504504
String value = getFirst(ACCEPT_LANGUAGE);
505+
if (value != null) {
506+
value = StringUtils.trimTrailingCharacter(value, ';');
507+
}
505508
return (StringUtils.hasText(value) ? Locale.LanguageRange.parse(value) : Collections.emptyList());
506509
}
507510

spring-web/src/test/java/org/springframework/http/HttpHeadersTests.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -489,6 +489,19 @@ void acceptLanguage() {
489489
assertThat(headers.getAcceptLanguageAsLocales()).element(0).isEqualTo(Locale.FRANCE);
490490
}
491491

492+
@Test
493+
void acceptLanguageTrailingSemicolon() {
494+
String headerValue = "en-us,en;";
495+
headers.set(HttpHeaders.ACCEPT_LANGUAGE, headerValue);
496+
assertThat(headers.getFirst(HttpHeaders.ACCEPT_LANGUAGE)).isEqualTo(headerValue);
497+
498+
List<Locale.LanguageRange> expectedRanges = Arrays.asList(
499+
new Locale.LanguageRange("en-us"),
500+
new Locale.LanguageRange("en")
501+
);
502+
assertThat(headers.getAcceptLanguage()).isEqualTo(expectedRanges);
503+
}
504+
492505
@Test // SPR-15603
493506
void acceptLanguageWithEmptyValue() {
494507
this.headers.set(HttpHeaders.ACCEPT_LANGUAGE, "");

0 commit comments

Comments
 (0)