Optimize HttpHeaders.getAcceptLanguageAsLocales
The HttpHeaders.getAcceptLanguageAsLocales was incurring overhead from using a Stream, as well as calling the fairly expensive Locale.getDisplayName method. Switch to using an ArrayList, and skipping over wildcard ranges to avoid needing to check the display name. Closes gh-32318
This commit is contained in:
parent
d45c0e6b8a
commit
beb415dfa3
|
@ -527,10 +527,14 @@ public class HttpHeaders implements MultiValueMap<String, String>, Serializable
|
|||
if (ranges.isEmpty()) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
return ranges.stream()
|
||||
.map(range -> Locale.forLanguageTag(range.getRange()))
|
||||
.filter(locale -> StringUtils.hasText(locale.getDisplayName()))
|
||||
.toList();
|
||||
|
||||
List<Locale> locales = new ArrayList<>(ranges.size());
|
||||
for (Locale.LanguageRange range : ranges) {
|
||||
if (!range.getRange().startsWith("*")) {
|
||||
locales.add(Locale.forLanguageTag(range.getRange()));
|
||||
}
|
||||
}
|
||||
return locales;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -471,22 +471,27 @@ class HttpHeadersTests {
|
|||
|
||||
@Test
|
||||
void acceptLanguage() {
|
||||
String headerValue = "fr-ch, fr;q=0.9, en-*;q=0.8, de;q=0.7, *;q=0.5";
|
||||
String headerValue = "fr-ch, fr;q=0.9, en-*;q=0.8, de;q=0.7, *-us;q=0.6, *;q=0.5";
|
||||
headers.setAcceptLanguage(Locale.LanguageRange.parse(headerValue));
|
||||
assertThat(headers.getFirst(HttpHeaders.ACCEPT_LANGUAGE)).isEqualTo(headerValue);
|
||||
|
||||
List<Locale.LanguageRange> expectedRanges = Arrays.asList(
|
||||
List<Locale.LanguageRange> expectedRanges = List.of(
|
||||
new Locale.LanguageRange("fr-ch"),
|
||||
new Locale.LanguageRange("fr", 0.9),
|
||||
new Locale.LanguageRange("en-*", 0.8),
|
||||
new Locale.LanguageRange("de", 0.7),
|
||||
new Locale.LanguageRange("*-us", 0.6),
|
||||
new Locale.LanguageRange("*", 0.5)
|
||||
);
|
||||
assertThat(headers.getAcceptLanguage()).isEqualTo(expectedRanges);
|
||||
assertThat(headers.getAcceptLanguageAsLocales()).element(0).isEqualTo(Locale.forLanguageTag("fr-ch"));
|
||||
assertThat(headers.getAcceptLanguageAsLocales()).isEqualTo(List.of(
|
||||
Locale.forLanguageTag("fr-ch"),
|
||||
Locale.forLanguageTag("fr"),
|
||||
Locale.forLanguageTag("en"),
|
||||
Locale.forLanguageTag("de")));
|
||||
|
||||
headers.setAcceptLanguageAsLocales(Collections.singletonList(Locale.FRANCE));
|
||||
assertThat(headers.getAcceptLanguageAsLocales()).element(0).isEqualTo(Locale.FRANCE);
|
||||
assertThat(headers.getAcceptLanguageAsLocales()).first().isEqualTo(Locale.FRANCE);
|
||||
}
|
||||
|
||||
@Test // SPR-15603
|
||||
|
|
Loading…
Reference in New Issue