|
20 | 20 | import java.net.InetSocketAddress;
|
21 | 21 | import java.net.URI;
|
22 | 22 | import java.nio.charset.Charset;
|
| 23 | +import java.text.DecimalFormat; |
| 24 | +import java.text.DecimalFormatSymbols; |
23 | 25 | import java.text.ParseException;
|
24 | 26 | import java.text.SimpleDateFormat;
|
25 | 27 | import java.util.ArrayList;
|
|
37 | 39 | import java.util.TimeZone;
|
38 | 40 | import java.util.regex.Matcher;
|
39 | 41 | import java.util.regex.Pattern;
|
| 42 | +import java.util.stream.Collectors; |
40 | 43 |
|
41 | 44 | import org.springframework.util.Assert;
|
42 | 45 | import org.springframework.util.LinkedCaseInsensitiveMap;
|
@@ -384,6 +387,8 @@ public class HttpHeaders implements MultiValueMap<String, String>, Serializable
|
384 | 387 | */
|
385 | 388 | private static final Pattern ETAG_HEADER_VALUE_PATTERN = Pattern.compile("\\*|\\s*((W\\/)?(\"[^\"]*\"))\\s*,?");
|
386 | 389 |
|
| 390 | + private static final DecimalFormatSymbols DECIMAL_FORMAT_SYMBOLS = new DecimalFormatSymbols(Locale.ENGLISH); |
| 391 | + |
387 | 392 | private static TimeZone GMT = TimeZone.getTimeZone("GMT");
|
388 | 393 |
|
389 | 394 |
|
@@ -434,6 +439,34 @@ public List<MediaType> getAccept() {
|
434 | 439 | return MediaType.parseMediaTypes(get(ACCEPT));
|
435 | 440 | }
|
436 | 441 |
|
| 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 | + |
437 | 470 | /**
|
438 | 471 | * Set the (new) value of the {@code Access-Control-Allow-Credentials} response header.
|
439 | 472 | */
|
|
0 commit comments