Mock Servlet request/response support Accept-Language

Issue: SPR-15209
This commit is contained in:
Rossen Stoyanchev
2017-04-11 07:01:20 -04:00
parent 3393c10d79
commit 5d92a85fcb
8 changed files with 84 additions and 37 deletions

View File

@@ -740,6 +740,7 @@ public class MockHttpServletRequest implements HttpServletRequest {
public void addPreferredLocale(Locale locale) {
Assert.notNull(locale, "Locale must not be null");
this.locales.add(0, locale);
updateAcceptLanguageHeader();
}
/**
@@ -752,6 +753,13 @@ public class MockHttpServletRequest implements HttpServletRequest {
Assert.notEmpty(locales, "Locale list must not be empty");
this.locales.clear();
this.locales.addAll(locales);
updateAcceptLanguageHeader();
}
private void updateAcceptLanguageHeader() {
HttpHeaders headers = new HttpHeaders();
headers.setAcceptLanguageAsLocales(this.locales);
doAddHeaderValue(HttpHeaders.ACCEPT_LANGUAGE, headers.getFirst(HttpHeaders.ACCEPT_LANGUAGE), true);
}
/**
@@ -951,9 +959,18 @@ public class MockHttpServletRequest implements HttpServletRequest {
* @see #getDateHeader
*/
public void addHeader(String name, Object value) {
if (HttpHeaders.CONTENT_TYPE.equalsIgnoreCase(name) && !this.headers.containsKey(HttpHeaders.CONTENT_TYPE)) {
if (HttpHeaders.CONTENT_TYPE.equalsIgnoreCase(name) &&
!this.headers.containsKey(HttpHeaders.CONTENT_TYPE)) {
setContentType(value.toString());
}
else if (HttpHeaders.ACCEPT_LANGUAGE.equalsIgnoreCase(name) &&
!this.headers.containsKey(HttpHeaders.ACCEPT_LANGUAGE)) {
HttpHeaders headers = new HttpHeaders();
headers.add(HttpHeaders.ACCEPT_LANGUAGE, value.toString());
setPreferredLocales(headers.getAcceptLanguageAsLocales());
}
else {
this.cookieHeaderSet = HttpHeaders.COOKIE.equalsIgnoreCase(name);
doAddHeaderValue(name, value, false);

View File

@@ -304,6 +304,9 @@ public class MockHttpServletResponse implements HttpServletResponse {
@Override
public void setLocale(Locale locale) {
this.locale = locale;
if (locale != null) {
doAddHeaderValue(HttpHeaders.ACCEPT_LANGUAGE, locale.toLanguageTag(), true);
}
}
@Override
@@ -577,6 +580,13 @@ public class MockHttpServletResponse implements HttpServletResponse {
Integer.parseInt(value.toString()));
return true;
}
else if (HttpHeaders.ACCEPT_LANGUAGE.equalsIgnoreCase(name)) {
HttpHeaders headers = new HttpHeaders();
headers.add(HttpHeaders.ACCEPT_LANGUAGE, value.toString());
List<Locale> locales = headers.getAcceptLanguageAsLocales();
setLocale(locales.isEmpty() ? null : locales.get(0));
return true;
}
else {
return false;
}

View File

@@ -29,7 +29,6 @@ import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.StringTokenizer;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.servlet.ServletContext;
import javax.servlet.http.Cookie;
@@ -353,12 +352,6 @@ final class HtmlUnitRequestBuilder implements RequestBuilder, Mergeable {
if (locale == null) {
request.addPreferredLocale(Locale.getDefault());
}
else {
String[] tokens = StringUtils.tokenizeToStringArray(locale, ",");
for (int i = tokens.length - 1; i >= 0; i--) {
request.addPreferredLocale(parseLocale(tokens[i]));
}
}
}
private void params(MockHttpServletRequest request, UriComponents uriComponents) {
@@ -384,21 +377,6 @@ final class HtmlUnitRequestBuilder implements RequestBuilder, Mergeable {
}
}
private Locale parseLocale(String locale) {
Matcher matcher = LOCALE_PATTERN.matcher(locale);
Assert.isTrue(matcher.matches(), () -> "Invalid locale value [" + locale + "]");
String language = matcher.group(1);
String country = matcher.group(2);
if (country == null) {
country = "";
}
String qualifier = matcher.group(3);
if (qualifier == null) {
qualifier = "";
}
return new Locale(language, country, qualifier);
}
private void servletPath(MockHttpServletRequest request, String requestPath) {
String servletPath = requestPath.substring(request.getContextPath().length());
if ("".equals(servletPath)) {