AcceptHeaderLocaleContextResolver leniently handles invalid header value
Also falls back to language-only match among its supported locales now. Issue: SPR-16500 Issue: SPR-16457
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2002-2017 the original author or authors.
|
||||
* Copyright 2002-2018 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -22,37 +22,39 @@ import java.util.Locale;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import org.springframework.http.HttpHeaders;
|
||||
import org.springframework.mock.http.server.reactive.test.MockServerHttpRequest;
|
||||
import org.springframework.mock.web.test.server.MockServerWebExchange;
|
||||
import org.springframework.web.server.ServerWebExchange;
|
||||
|
||||
import static java.util.Locale.*;
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
/**
|
||||
* Unit tests for {@link AcceptHeaderLocaleContextResolver}.
|
||||
*
|
||||
* @author Sebastien Deleuze
|
||||
* @author Juergen Hoeller
|
||||
*/
|
||||
public class AcceptHeaderLocaleContextResolverTests {
|
||||
|
||||
private AcceptHeaderLocaleContextResolver resolver = new AcceptHeaderLocaleContextResolver();
|
||||
private final AcceptHeaderLocaleContextResolver resolver = new AcceptHeaderLocaleContextResolver();
|
||||
|
||||
|
||||
@Test
|
||||
public void resolve() throws Exception {
|
||||
public void resolve() {
|
||||
assertEquals(CANADA, this.resolver.resolveLocaleContext(exchange(CANADA)).getLocale());
|
||||
assertEquals(US, this.resolver.resolveLocaleContext(exchange(US, CANADA)).getLocale());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void resolvePreferredSupported() throws Exception {
|
||||
public void resolvePreferredSupported() {
|
||||
this.resolver.setSupportedLocales(Collections.singletonList(CANADA));
|
||||
assertEquals(CANADA, this.resolver.resolveLocaleContext(exchange(US, CANADA)).getLocale());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void resolvePreferredNotSupported() throws Exception {
|
||||
public void resolvePreferredNotSupported() {
|
||||
this.resolver.setSupportedLocales(Collections.singletonList(CANADA));
|
||||
assertEquals(US, this.resolver.resolveLocaleContext(exchange(US, UK)).getLocale());
|
||||
}
|
||||
@@ -61,14 +63,65 @@ public class AcceptHeaderLocaleContextResolverTests {
|
||||
public void resolvePreferredNotSupportedWithDefault() {
|
||||
this.resolver.setSupportedLocales(Arrays.asList(US, JAPAN));
|
||||
this.resolver.setDefaultLocale(JAPAN);
|
||||
|
||||
MockServerHttpRequest request = MockServerHttpRequest.get("/").acceptLanguageAsLocales(KOREA).build();
|
||||
MockServerWebExchange exchange = MockServerWebExchange.from(request);
|
||||
assertEquals(JAPAN, this.resolver.resolveLocaleContext(exchange).getLocale());
|
||||
assertEquals(JAPAN, this.resolver.resolveLocaleContext(exchange(KOREA)).getLocale());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void defaultLocale() throws Exception {
|
||||
public void resolvePreferredAgainstLanguageOnly() {
|
||||
this.resolver.setSupportedLocales(Collections.singletonList(ENGLISH));
|
||||
assertEquals(ENGLISH, this.resolver.resolveLocaleContext(exchange(GERMANY, US, UK)).getLocale());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void resolveMissingAcceptLanguageHeader() {
|
||||
MockServerHttpRequest request = MockServerHttpRequest.get("/").build();
|
||||
MockServerWebExchange exchange = MockServerWebExchange.from(request);
|
||||
assertNull(this.resolver.resolveLocaleContext(exchange).getLocale());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void resolveMissingAcceptLanguageHeaderWithDefault() {
|
||||
this.resolver.setDefaultLocale(US);
|
||||
|
||||
MockServerHttpRequest request = MockServerHttpRequest.get("/").build();
|
||||
MockServerWebExchange exchange = MockServerWebExchange.from(request);
|
||||
assertEquals(US, this.resolver.resolveLocaleContext(exchange).getLocale());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void resolveEmptyAcceptLanguageHeader() {
|
||||
MockServerHttpRequest request = MockServerHttpRequest.get("/").header(HttpHeaders.ACCEPT_LANGUAGE, "").build();
|
||||
MockServerWebExchange exchange = MockServerWebExchange.from(request);
|
||||
assertNull(this.resolver.resolveLocaleContext(exchange).getLocale());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void resolveEmptyAcceptLanguageHeaderWithDefault() {
|
||||
this.resolver.setDefaultLocale(US);
|
||||
|
||||
MockServerHttpRequest request = MockServerHttpRequest.get("/").header(HttpHeaders.ACCEPT_LANGUAGE, "").build();
|
||||
MockServerWebExchange exchange = MockServerWebExchange.from(request);
|
||||
assertEquals(US, this.resolver.resolveLocaleContext(exchange).getLocale());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void resolveInvalidAcceptLanguageHeader() {
|
||||
MockServerHttpRequest request = MockServerHttpRequest.get("/").header(HttpHeaders.ACCEPT_LANGUAGE, "en_US").build();
|
||||
MockServerWebExchange exchange = MockServerWebExchange.from(request);
|
||||
assertNull(this.resolver.resolveLocaleContext(exchange).getLocale());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void resolveInvalidAcceptLanguageHeaderWithDefault() {
|
||||
this.resolver.setDefaultLocale(US);
|
||||
|
||||
MockServerHttpRequest request = MockServerHttpRequest.get("/").header(HttpHeaders.ACCEPT_LANGUAGE, "en_US").build();
|
||||
MockServerWebExchange exchange = MockServerWebExchange.from(request);
|
||||
assertEquals(US, this.resolver.resolveLocaleContext(exchange).getLocale());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void defaultLocale() {
|
||||
this.resolver.setDefaultLocale(JAPANESE);
|
||||
MockServerHttpRequest request = MockServerHttpRequest.get("/").build();
|
||||
MockServerWebExchange exchange = MockServerWebExchange.from(request);
|
||||
|
||||
@@ -1,3 +1,19 @@
|
||||
/*
|
||||
* Copyright 2002-2018 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.web.server.i18n;
|
||||
|
||||
import java.time.ZoneId;
|
||||
@@ -12,10 +28,8 @@ import org.springframework.mock.http.server.reactive.test.MockServerHttpRequest;
|
||||
import org.springframework.mock.web.test.server.MockServerWebExchange;
|
||||
import org.springframework.web.server.ServerWebExchange;
|
||||
|
||||
import static java.util.Locale.CANADA;
|
||||
import static java.util.Locale.FRANCE;
|
||||
import static java.util.Locale.US;
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static java.util.Locale.*;
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
/**
|
||||
* Unit tests for {@link FixedLocaleContextResolver}.
|
||||
@@ -24,8 +38,6 @@ import static org.junit.Assert.assertEquals;
|
||||
*/
|
||||
public class FixedLocaleContextResolverTests {
|
||||
|
||||
private FixedLocaleContextResolver resolver;
|
||||
|
||||
@Before
|
||||
public void setup() {
|
||||
Locale.setDefault(US);
|
||||
@@ -33,23 +45,23 @@ public class FixedLocaleContextResolverTests {
|
||||
|
||||
@Test
|
||||
public void resolveDefaultLocale() {
|
||||
this.resolver = new FixedLocaleContextResolver();
|
||||
assertEquals(US, this.resolver.resolveLocaleContext(exchange()).getLocale());
|
||||
assertEquals(US, this.resolver.resolveLocaleContext(exchange(CANADA)).getLocale());
|
||||
FixedLocaleContextResolver resolver = new FixedLocaleContextResolver();
|
||||
assertEquals(US, resolver.resolveLocaleContext(exchange()).getLocale());
|
||||
assertEquals(US, resolver.resolveLocaleContext(exchange(CANADA)).getLocale());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void resolveCustomizedLocale() {
|
||||
this.resolver = new FixedLocaleContextResolver(FRANCE);
|
||||
assertEquals(FRANCE, this.resolver.resolveLocaleContext(exchange()).getLocale());
|
||||
assertEquals(FRANCE, this.resolver.resolveLocaleContext(exchange(CANADA)).getLocale());
|
||||
FixedLocaleContextResolver resolver = new FixedLocaleContextResolver(FRANCE);
|
||||
assertEquals(FRANCE, resolver.resolveLocaleContext(exchange()).getLocale());
|
||||
assertEquals(FRANCE, resolver.resolveLocaleContext(exchange(CANADA)).getLocale());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void resolveCustomizedAndTimeZoneLocale() {
|
||||
TimeZone timeZone = TimeZone.getTimeZone(ZoneId.of("UTC"));
|
||||
this.resolver = new FixedLocaleContextResolver(FRANCE, timeZone);
|
||||
TimeZoneAwareLocaleContext context = (TimeZoneAwareLocaleContext)this.resolver.resolveLocaleContext(exchange());
|
||||
FixedLocaleContextResolver resolver = new FixedLocaleContextResolver(FRANCE, timeZone);
|
||||
TimeZoneAwareLocaleContext context = (TimeZoneAwareLocaleContext) resolver.resolveLocaleContext(exchange());
|
||||
assertEquals(FRANCE, context.getLocale());
|
||||
assertEquals(timeZone, context.getTimeZone());
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user