MockHttpServletRequest leniently handles invalid Accept-Language header
Issue: SPR-16454
This commit is contained in:
parent
7f96827ade
commit
b3e21ec737
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue