diff --git a/spring-test/src/main/java/org/springframework/mock/web/MockHttpServletRequest.java b/spring-test/src/main/java/org/springframework/mock/web/MockHttpServletRequest.java index cb03c3f179..f9eaf0208b 100644 --- a/spring-test/src/main/java/org/springframework/mock/web/MockHttpServletRequest.java +++ b/spring-test/src/main/java/org/springframework/mock/web/MockHttpServletRequest.java @@ -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); diff --git a/spring-test/src/test/java/org/springframework/mock/web/MockHttpServletRequestTests.java b/spring-test/src/test/java/org/springframework/mock/web/MockHttpServletRequestTests.java index 568b1156ec..f3cc3a7a55 100644 --- a/spring-test/src/test/java/org/springframework/mock/web/MockHttpServletRequestTests.java +++ b/spring-test/src/test/java/org/springframework/mock/web/MockHttpServletRequestTests.java @@ -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); } diff --git a/spring-web/src/test/java/org/springframework/mock/web/test/MockHttpServletRequest.java b/spring-web/src/test/java/org/springframework/mock/web/test/MockHttpServletRequest.java index 8e1eff4cd5..5ca558586a 100644 --- a/spring-web/src/test/java/org/springframework/mock/web/test/MockHttpServletRequest.java +++ b/spring-web/src/test/java/org/springframework/mock/web/test/MockHttpServletRequest.java @@ -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);