MockHttpServletRequest leniently handles invalid Accept-Language header

Issue: SPR-16454
This commit is contained in:
Juergen Hoeller 2018-02-02 11:34:22 +01:00
parent 7f96827ade
commit b3e21ec737
3 changed files with 52 additions and 41 deletions

View File

@ -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.
@ -473,7 +473,7 @@ public class MockHttpServletRequest implements HttpServletRequest {
this.characterEncoding = mediaType.getCharset().name();
}
}
catch (Exception ex) {
catch (IllegalArgumentException ex) {
// Try to get charset value anyway
int charsetIndex = contentType.toLowerCase().indexOf(CHARSET_PREFIX);
if (charsetIndex != -1) {
@ -985,15 +985,19 @@ public class MockHttpServletRequest implements HttpServletRequest {
public void addHeader(String name, Object value) {
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());
try {
HttpHeaders headers = new HttpHeaders();
headers.add(HttpHeaders.ACCEPT_LANGUAGE, value.toString());
setPreferredLocales(headers.getAcceptLanguageAsLocales());
}
catch (IllegalArgumentException ex) {
// Invalid Accept-Language format -> store plain header instead
doAddHeaderValue(name, value, true);
}
}
else {
doAddHeaderValue(name, value, false);

View File

@ -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.
@ -52,10 +52,6 @@ public class MockHttpServletRequestTests {
private static final String HOST = "Host";
private static final String CONTENT_TYPE = "Content-Type";
private static final String IF_MODIFIED_SINCE = "If-Modified-Since";
private final MockHttpServletRequest request = new MockHttpServletRequest();
@Rule
@ -121,7 +117,7 @@ public class MockHttpServletRequestTests {
String contentType = "test/plain";
request.setContentType(contentType);
assertEquals(contentType, request.getContentType());
assertEquals(contentType, request.getHeader(CONTENT_TYPE));
assertEquals(contentType, request.getHeader(HttpHeaders.CONTENT_TYPE));
assertNull(request.getCharacterEncoding());
}
@ -130,34 +126,34 @@ public class MockHttpServletRequestTests {
String contentType = "test/plain;charset=UTF-8";
request.setContentType(contentType);
assertEquals(contentType, request.getContentType());
assertEquals(contentType, request.getHeader(CONTENT_TYPE));
assertEquals(contentType, request.getHeader(HttpHeaders.CONTENT_TYPE));
assertEquals("UTF-8", request.getCharacterEncoding());
}
@Test
public void contentTypeHeader() {
String contentType = "test/plain";
request.addHeader("Content-Type", contentType);
request.addHeader(HttpHeaders.CONTENT_TYPE, contentType);
assertEquals(contentType, request.getContentType());
assertEquals(contentType, request.getHeader(CONTENT_TYPE));
assertEquals(contentType, request.getHeader(HttpHeaders.CONTENT_TYPE));
assertNull(request.getCharacterEncoding());
}
@Test
public void contentTypeHeaderUTF8() {
String contentType = "test/plain;charset=UTF-8";
request.addHeader("Content-Type", contentType);
request.addHeader(HttpHeaders.CONTENT_TYPE, contentType);
assertEquals(contentType, request.getContentType());
assertEquals(contentType, request.getHeader(CONTENT_TYPE));
assertEquals(contentType, request.getHeader(HttpHeaders.CONTENT_TYPE));
assertEquals("UTF-8", request.getCharacterEncoding());
}
@Test // SPR-12677
public void setContentTypeHeaderWithMoreComplexCharsetSyntax() {
String contentType = "test/plain;charset=\"utf-8\";foo=\"charset=bar\";foocharset=bar;foo=bar";
request.addHeader("Content-Type", contentType);
request.addHeader(HttpHeaders.CONTENT_TYPE, contentType);
assertEquals(contentType, request.getContentType());
assertEquals(contentType, request.getHeader(CONTENT_TYPE));
assertEquals(contentType, request.getHeader(HttpHeaders.CONTENT_TYPE));
assertEquals("UTF-8", request.getCharacterEncoding());
}
@ -166,7 +162,7 @@ public class MockHttpServletRequestTests {
request.setContentType("test/plain");
request.setCharacterEncoding("UTF-8");
assertEquals("test/plain", request.getContentType());
assertEquals("test/plain;charset=UTF-8", request.getHeader(CONTENT_TYPE));
assertEquals("test/plain;charset=UTF-8", request.getHeader(HttpHeaders.CONTENT_TYPE));
assertEquals("UTF-8", request.getCharacterEncoding());
}
@ -175,7 +171,7 @@ public class MockHttpServletRequestTests {
request.setCharacterEncoding("UTF-8");
request.setContentType("test/plain");
assertEquals("test/plain", request.getContentType());
assertEquals("test/plain;charset=UTF-8", request.getHeader(CONTENT_TYPE));
assertEquals("test/plain;charset=UTF-8", request.getHeader(HttpHeaders.CONTENT_TYPE));
assertEquals("UTF-8", request.getCharacterEncoding());
}
@ -302,6 +298,13 @@ public class MockHttpServletRequestTests {
Locale.forLanguageTag("en"), Locale.forLanguageTag("de")), actual);
}
@Test
public void invalidAcceptLanguageHeader() {
request.addHeader("Accept-Language", "en_US");
assertEquals(Locale.ENGLISH, request.getLocale());
assertEquals("en_US", request.getHeader("Accept-Language"));
}
@Test
public void getServerNameWithDefaultName() {
assertEquals("localhost", request.getServerName());
@ -473,39 +476,39 @@ public class MockHttpServletRequestTests {
@Test
public void httpHeaderDate() {
Date date = new Date();
request.addHeader(IF_MODIFIED_SINCE, date);
assertEquals(date.getTime(), request.getDateHeader(IF_MODIFIED_SINCE));
request.addHeader(HttpHeaders.IF_MODIFIED_SINCE, date);
assertEquals(date.getTime(), request.getDateHeader(HttpHeaders.IF_MODIFIED_SINCE));
}
@Test
public void httpHeaderTimestamp() {
long timestamp = new Date().getTime();
request.addHeader(IF_MODIFIED_SINCE, timestamp);
assertEquals(timestamp, request.getDateHeader(IF_MODIFIED_SINCE));
request.addHeader(HttpHeaders.IF_MODIFIED_SINCE, timestamp);
assertEquals(timestamp, request.getDateHeader(HttpHeaders.IF_MODIFIED_SINCE));
}
@Test
public void httpHeaderRfcFormatedDate() {
request.addHeader(IF_MODIFIED_SINCE, "Tue, 21 Jul 2015 10:00:00 GMT");
assertEquals(1437472800000L, request.getDateHeader(IF_MODIFIED_SINCE));
request.addHeader(HttpHeaders.IF_MODIFIED_SINCE, "Tue, 21 Jul 2015 10:00:00 GMT");
assertEquals(1437472800000L, request.getDateHeader(HttpHeaders.IF_MODIFIED_SINCE));
}
@Test
public void httpHeaderFirstVariantFormatedDate() {
request.addHeader(IF_MODIFIED_SINCE, "Tue, 21-Jul-15 10:00:00 GMT");
assertEquals(1437472800000L, request.getDateHeader(IF_MODIFIED_SINCE));
request.addHeader(HttpHeaders.IF_MODIFIED_SINCE, "Tue, 21-Jul-15 10:00:00 GMT");
assertEquals(1437472800000L, request.getDateHeader(HttpHeaders.IF_MODIFIED_SINCE));
}
@Test
public void httpHeaderSecondVariantFormatedDate() {
request.addHeader(IF_MODIFIED_SINCE, "Tue Jul 21 10:00:00 2015");
assertEquals(1437472800000L, request.getDateHeader(IF_MODIFIED_SINCE));
request.addHeader(HttpHeaders.IF_MODIFIED_SINCE, "Tue Jul 21 10:00:00 2015");
assertEquals(1437472800000L, request.getDateHeader(HttpHeaders.IF_MODIFIED_SINCE));
}
@Test(expected = IllegalArgumentException.class)
public void httpHeaderFormatedDateError() {
request.addHeader(IF_MODIFIED_SINCE, "This is not a date");
request.getDateHeader(IF_MODIFIED_SINCE);
request.addHeader(HttpHeaders.IF_MODIFIED_SINCE, "This is not a date");
request.getDateHeader(HttpHeaders.IF_MODIFIED_SINCE);
}

View File

@ -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.
@ -455,7 +455,7 @@ public class MockHttpServletRequest implements HttpServletRequest {
this.characterEncoding = mediaType.getCharset().name();
}
}
catch (Exception ex) {
catch (IllegalArgumentException ex) {
// Try to get charset value anyway
int charsetIndex = contentType.toLowerCase().indexOf(CHARSET_PREFIX);
if (charsetIndex != -1) {
@ -962,15 +962,19 @@ public class MockHttpServletRequest implements HttpServletRequest {
public void addHeader(String name, Object value) {
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());
try {
HttpHeaders headers = new HttpHeaders();
headers.add(HttpHeaders.ACCEPT_LANGUAGE, value.toString());
setPreferredLocales(headers.getAcceptLanguageAsLocales());
}
catch (IllegalArgumentException ex) {
// Invalid Accept-Language format -> store plain header instead
doAddHeaderValue(name, value, true);
}
}
else {
doAddHeaderValue(name, value, false);