Skip to content

Commit 099d016

Browse files
committed
Handle trailing semicolon in Accept-Language
Closes gh-32259
1 parent 1d0af7e commit 099d016

File tree

2 files changed

+28
-1
lines changed

2 files changed

+28
-1
lines changed

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

+14-1
Original file line numberDiff line numberDiff line change
@@ -509,7 +509,20 @@ public void setAcceptLanguage(List<Locale.LanguageRange> languages) {
509509
*/
510510
public List<Locale.LanguageRange> getAcceptLanguage() {
511511
String value = getFirst(ACCEPT_LANGUAGE);
512-
return (StringUtils.hasText(value) ? Locale.LanguageRange.parse(value) : Collections.emptyList());
512+
if (StringUtils.hasText(value)) {
513+
try {
514+
return Locale.LanguageRange.parse(value);
515+
}
516+
catch (IllegalArgumentException ignored) {
517+
String[] tokens = StringUtils.tokenizeToStringArray(value, ",");
518+
for (int i = 0; i < tokens.length; i++) {
519+
tokens[i] = StringUtils.trimTrailingCharacter(tokens[i], ';');
520+
}
521+
value = StringUtils.arrayToCommaDelimitedString(tokens);
522+
return Locale.LanguageRange.parse(value);
523+
}
524+
}
525+
return Collections.emptyList();
513526
}
514527

515528
/**

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

+14
Original file line numberDiff line numberDiff line change
@@ -517,6 +517,20 @@ void acceptLanguage() {
517517
assertThat(headers.getAcceptLanguageAsLocales()).first().isEqualTo(Locale.FRANCE);
518518
}
519519

520+
@Test // gh-32259
521+
void acceptLanguageTrailingSemicolon() {
522+
String headerValue = "en-us,en;,nl;";
523+
headers.set(HttpHeaders.ACCEPT_LANGUAGE, headerValue);
524+
assertThat(headers.getFirst(HttpHeaders.ACCEPT_LANGUAGE)).isEqualTo(headerValue);
525+
526+
List<Locale.LanguageRange> expectedRanges = Arrays.asList(
527+
new Locale.LanguageRange("en-us"),
528+
new Locale.LanguageRange("en"),
529+
new Locale.LanguageRange("nl")
530+
);
531+
assertThat(headers.getAcceptLanguage()).isEqualTo(expectedRanges);
532+
}
533+
520534
@Test // SPR-15603
521535
void acceptLanguageWithEmptyValue() {
522536
this.headers.set(HttpHeaders.ACCEPT_LANGUAGE, "");

0 commit comments

Comments
 (0)