Skip to content

Commit 9764d57

Browse files
committed
Add set/getAcceptLanguage() to HttpHeaders
Issue: SPR-15024
1 parent 8a74670 commit 9764d57

File tree

2 files changed

+50
-0
lines changed

2 files changed

+50
-0
lines changed

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

+33
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020
import java.net.InetSocketAddress;
2121
import java.net.URI;
2222
import java.nio.charset.Charset;
23+
import java.text.DecimalFormat;
24+
import java.text.DecimalFormatSymbols;
2325
import java.text.ParseException;
2426
import java.text.SimpleDateFormat;
2527
import java.util.ArrayList;
@@ -37,6 +39,7 @@
3739
import java.util.TimeZone;
3840
import java.util.regex.Matcher;
3941
import java.util.regex.Pattern;
42+
import java.util.stream.Collectors;
4043

4144
import org.springframework.util.Assert;
4245
import org.springframework.util.LinkedCaseInsensitiveMap;
@@ -384,6 +387,8 @@ public class HttpHeaders implements MultiValueMap<String, String>, Serializable
384387
*/
385388
private static final Pattern ETAG_HEADER_VALUE_PATTERN = Pattern.compile("\\*|\\s*((W\\/)?(\"[^\"]*\"))\\s*,?");
386389

390+
private static final DecimalFormatSymbols DECIMAL_FORMAT_SYMBOLS = new DecimalFormatSymbols(Locale.ENGLISH);
391+
387392
private static TimeZone GMT = TimeZone.getTimeZone("GMT");
388393

389394

@@ -434,6 +439,34 @@ public List<MediaType> getAccept() {
434439
return MediaType.parseMediaTypes(get(ACCEPT));
435440
}
436441

442+
/**
443+
* Set the acceptable language ranges,
444+
* as specified by the {@literal Accept-Language} header.
445+
* @see Locale.LanguageRange
446+
*/
447+
public void setAcceptLanguage(List<Locale.LanguageRange> languages) {
448+
Assert.notNull(languages, "'languages' must not be null");
449+
DecimalFormat df = new DecimalFormat("0.0", DECIMAL_FORMAT_SYMBOLS);
450+
List<String> values = languages
451+
.stream()
452+
.map(r -> (r.getWeight() == Locale.LanguageRange.MAX_WEIGHT ? r.getRange() : r.getRange() + ";q=" + df.format(r.getWeight())))
453+
.collect(Collectors.toList());
454+
set(ACCEPT_LANGUAGE, toCommaDelimitedString(values));
455+
}
456+
457+
/**
458+
* Return the acceptable language ranges,
459+
* as specified by the {@literal Accept-Language} header
460+
* @see Locale.LanguageRange
461+
*/
462+
public List<Locale.LanguageRange> getAcceptLanguage() {
463+
String value = getFirst(ACCEPT_LANGUAGE);
464+
if (value != null) {
465+
return Locale.LanguageRange.parse(value);
466+
}
467+
return Collections.emptyList();
468+
}
469+
437470
/**
438471
* Set the (new) value of the {@code Access-Control-Allow-Credentials} response header.
439472
*/

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

+17
Original file line numberDiff line numberDiff line change
@@ -422,4 +422,21 @@ public void accessControlRequestMethod() {
422422
assertEquals(HttpMethod.POST, headers.getAccessControlRequestMethod());
423423
}
424424

425+
@Test
426+
public void acceptLanguage() {
427+
assertTrue(headers.getAcceptLanguage().isEmpty());
428+
String headerValue = "fr-ch, fr;q=0.9, en;q=0.8, de;q=0.7, *;q=0.5";
429+
headers.setAcceptLanguage(Locale.LanguageRange.parse(headerValue));
430+
assertEquals(headerValue, headers.getFirst(HttpHeaders.ACCEPT_LANGUAGE));
431+
List<Locale.LanguageRange> languages = headers.getAcceptLanguage();
432+
Locale.LanguageRange[] languageArray = new Locale.LanguageRange[]{
433+
new Locale.LanguageRange("fr-ch"),
434+
new Locale.LanguageRange("fr", 0.9),
435+
new Locale.LanguageRange("en", 0.8),
436+
new Locale.LanguageRange("de", 0.7),
437+
new Locale.LanguageRange("*", 0.5)
438+
};
439+
assertArrayEquals(languageArray, languages.toArray());
440+
}
441+
425442
}

0 commit comments

Comments
 (0)