Skip to content

Commit bf8f398

Browse files
committed
Merge pull request #32318 from kilink:http-headers-getAcceptLanguageAsLocales-optimization
* gh-32318: Polishing external contribution Optimize HttpHeaders.getAcceptLanguageAsLocales
2 parents d45c0e6 + 3370551 commit bf8f398

File tree

2 files changed

+17
-8
lines changed

2 files changed

+17
-8
lines changed

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

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -527,10 +527,14 @@ public List<Locale> getAcceptLanguageAsLocales() {
527527
if (ranges.isEmpty()) {
528528
return Collections.emptyList();
529529
}
530-
return ranges.stream()
531-
.map(range -> Locale.forLanguageTag(range.getRange()))
532-
.filter(locale -> StringUtils.hasText(locale.getDisplayName()))
533-
.toList();
530+
531+
List<Locale> locales = new ArrayList<>(ranges.size());
532+
for (Locale.LanguageRange range : ranges) {
533+
if (!range.getRange().startsWith("*")) {
534+
locales.add(Locale.forLanguageTag(range.getRange()));
535+
}
536+
}
537+
return locales;
534538
}
535539

536540
/**

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

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -471,22 +471,27 @@ void accessControlRequestMethod() {
471471

472472
@Test
473473
void acceptLanguage() {
474-
String headerValue = "fr-ch, fr;q=0.9, en-*;q=0.8, de;q=0.7, *;q=0.5";
474+
String headerValue = "fr-ch, fr;q=0.9, en-*;q=0.8, de;q=0.7, *-us;q=0.6, *;q=0.5";
475475
headers.setAcceptLanguage(Locale.LanguageRange.parse(headerValue));
476476
assertThat(headers.getFirst(HttpHeaders.ACCEPT_LANGUAGE)).isEqualTo(headerValue);
477477

478-
List<Locale.LanguageRange> expectedRanges = Arrays.asList(
478+
List<Locale.LanguageRange> expectedRanges = List.of(
479479
new Locale.LanguageRange("fr-ch"),
480480
new Locale.LanguageRange("fr", 0.9),
481481
new Locale.LanguageRange("en-*", 0.8),
482482
new Locale.LanguageRange("de", 0.7),
483+
new Locale.LanguageRange("*-us", 0.6),
483484
new Locale.LanguageRange("*", 0.5)
484485
);
485486
assertThat(headers.getAcceptLanguage()).isEqualTo(expectedRanges);
486-
assertThat(headers.getAcceptLanguageAsLocales()).element(0).isEqualTo(Locale.forLanguageTag("fr-ch"));
487+
assertThat(headers.getAcceptLanguageAsLocales()).containsExactly(
488+
Locale.forLanguageTag("fr-ch"),
489+
Locale.forLanguageTag("fr"),
490+
Locale.forLanguageTag("en"),
491+
Locale.forLanguageTag("de"));
487492

488493
headers.setAcceptLanguageAsLocales(Collections.singletonList(Locale.FRANCE));
489-
assertThat(headers.getAcceptLanguageAsLocales()).element(0).isEqualTo(Locale.FRANCE);
494+
assertThat(headers.getAcceptLanguageAsLocales()).first().isEqualTo(Locale.FRANCE);
490495
}
491496

492497
@Test // SPR-15603

0 commit comments

Comments
 (0)