MockHttpSevlet[Request|Response] set cookie headers
Issue: SPR-15225
This commit is contained in:
parent
4da4f2be31
commit
e5fc40a9de
|
@ -27,6 +27,7 @@ import java.io.UnsupportedEncodingException;
|
|||
import java.security.Principal;
|
||||
import java.text.ParseException;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.Date;
|
||||
|
@ -55,11 +56,13 @@ import javax.servlet.http.HttpSession;
|
|||
import javax.servlet.http.HttpUpgradeHandler;
|
||||
import javax.servlet.http.Part;
|
||||
|
||||
import org.springframework.http.HttpHeaders;
|
||||
import org.springframework.http.MediaType;
|
||||
import org.springframework.util.Assert;
|
||||
import org.springframework.util.LinkedCaseInsensitiveMap;
|
||||
import org.springframework.util.LinkedMultiValueMap;
|
||||
import org.springframework.util.MultiValueMap;
|
||||
import org.springframework.util.ObjectUtils;
|
||||
import org.springframework.util.StreamUtils;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
|
@ -87,10 +90,6 @@ public class MockHttpServletRequest implements HttpServletRequest {
|
|||
|
||||
private static final String HTTPS = "https";
|
||||
|
||||
private static final String CONTENT_TYPE_HEADER = "Content-Type";
|
||||
|
||||
private static final String HOST_HEADER = "Host";
|
||||
|
||||
private static final String CHARSET_PREFIX = "charset=";
|
||||
|
||||
private static final TimeZone GMT = TimeZone.getTimeZone("GMT");
|
||||
|
@ -219,6 +218,8 @@ public class MockHttpServletRequest implements HttpServletRequest {
|
|||
|
||||
private Cookie[] cookies;
|
||||
|
||||
private boolean cookieHeaderSet;
|
||||
|
||||
private final Map<String, HeaderValueHolder> headers = new LinkedCaseInsensitiveMap<>();
|
||||
|
||||
private String method;
|
||||
|
@ -387,7 +388,7 @@ public class MockHttpServletRequest implements HttpServletRequest {
|
|||
StringUtils.hasLength(this.characterEncoding)) {
|
||||
sb.append(";").append(CHARSET_PREFIX).append(this.characterEncoding);
|
||||
}
|
||||
doAddHeaderValue(CONTENT_TYPE_HEADER, sb.toString(), true);
|
||||
doAddHeaderValue(HttpHeaders.CONTENT_TYPE, sb.toString(), true);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -633,7 +634,7 @@ public class MockHttpServletRequest implements HttpServletRequest {
|
|||
|
||||
@Override
|
||||
public String getServerName() {
|
||||
String host = getHeader(HOST_HEADER);
|
||||
String host = getHeader(HttpHeaders.HOST);
|
||||
if (host != null) {
|
||||
host = host.trim();
|
||||
if (host.startsWith("[")) {
|
||||
|
@ -655,7 +656,7 @@ public class MockHttpServletRequest implements HttpServletRequest {
|
|||
|
||||
@Override
|
||||
public int getServerPort() {
|
||||
String host = getHeader(HOST_HEADER);
|
||||
String host = getHeader(HttpHeaders.HOST);
|
||||
if (host != null) {
|
||||
host = host.trim();
|
||||
int idx;
|
||||
|
@ -922,6 +923,11 @@ public class MockHttpServletRequest implements HttpServletRequest {
|
|||
|
||||
public void setCookies(Cookie... cookies) {
|
||||
this.cookies = cookies;
|
||||
if (!this.cookieHeaderSet && !ObjectUtils.isEmpty(cookies)) {
|
||||
Arrays.stream(cookies)
|
||||
.map(c -> c.getName() + '=' + (c.getValue() == null ? "" : c.getValue()))
|
||||
.forEach(value -> doAddHeaderValue(HttpHeaders.COOKIE, value, false));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -945,10 +951,11 @@ public class MockHttpServletRequest implements HttpServletRequest {
|
|||
* @see #getDateHeader
|
||||
*/
|
||||
public void addHeader(String name, Object value) {
|
||||
if (CONTENT_TYPE_HEADER.equalsIgnoreCase(name) && !this.headers.containsKey(CONTENT_TYPE_HEADER)) {
|
||||
if (HttpHeaders.CONTENT_TYPE.equalsIgnoreCase(name) && !this.headers.containsKey(HttpHeaders.CONTENT_TYPE)) {
|
||||
setContentType(value.toString());
|
||||
}
|
||||
else {
|
||||
this.cookieHeaderSet = HttpHeaders.COOKIE.equalsIgnoreCase(name);
|
||||
doAddHeaderValue(name, value, false);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -37,9 +37,11 @@ import javax.servlet.ServletOutputStream;
|
|||
import javax.servlet.http.Cookie;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
|
||||
import org.springframework.http.HttpHeaders;
|
||||
import org.springframework.http.MediaType;
|
||||
import org.springframework.util.Assert;
|
||||
import org.springframework.util.LinkedCaseInsensitiveMap;
|
||||
import org.springframework.util.StringUtils;
|
||||
import org.springframework.web.util.WebUtils;
|
||||
|
||||
/**
|
||||
|
@ -56,12 +58,6 @@ public class MockHttpServletResponse implements HttpServletResponse {
|
|||
|
||||
private static final String CHARSET_PREFIX = "charset=";
|
||||
|
||||
private static final String CONTENT_TYPE_HEADER = "Content-Type";
|
||||
|
||||
private static final String CONTENT_LENGTH_HEADER = "Content-Length";
|
||||
|
||||
private static final String LOCATION_HEADER = "Location";
|
||||
|
||||
private static final String DATE_FORMAT = "EEE, dd MMM yyyy HH:mm:ss zzz";
|
||||
|
||||
private static final TimeZone GMT = TimeZone.getTimeZone("GMT");
|
||||
|
@ -102,6 +98,8 @@ public class MockHttpServletResponse implements HttpServletResponse {
|
|||
|
||||
private final List<Cookie> cookies = new ArrayList<>();
|
||||
|
||||
private boolean cookieHeaderSet;
|
||||
|
||||
private final Map<String, HeaderValueHolder> headers = new LinkedCaseInsensitiveMap<>();
|
||||
|
||||
private int status = HttpServletResponse.SC_OK;
|
||||
|
@ -168,7 +166,7 @@ public class MockHttpServletResponse implements HttpServletResponse {
|
|||
if (!this.contentType.toLowerCase().contains(CHARSET_PREFIX) && this.charset) {
|
||||
sb.append(";").append(CHARSET_PREFIX).append(this.characterEncoding);
|
||||
}
|
||||
doAddHeaderValue(CONTENT_TYPE_HEADER, sb.toString(), true);
|
||||
doAddHeaderValue(HttpHeaders.CONTENT_TYPE, sb.toString(), true);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -208,7 +206,7 @@ public class MockHttpServletResponse implements HttpServletResponse {
|
|||
@Override
|
||||
public void setContentLength(int contentLength) {
|
||||
this.contentLength = contentLength;
|
||||
doAddHeaderValue(CONTENT_LENGTH_HEADER, contentLength, true);
|
||||
doAddHeaderValue(HttpHeaders.CONTENT_LENGTH, contentLength, true);
|
||||
}
|
||||
|
||||
public int getContentLength() {
|
||||
|
@ -218,7 +216,7 @@ public class MockHttpServletResponse implements HttpServletResponse {
|
|||
@Override
|
||||
public void setContentLengthLong(long contentLength) {
|
||||
this.contentLength = contentLength;
|
||||
doAddHeaderValue(CONTENT_LENGTH_HEADER, contentLength, true);
|
||||
doAddHeaderValue(HttpHeaders.CONTENT_LENGTH, contentLength, true);
|
||||
}
|
||||
|
||||
public long getContentLengthLong() {
|
||||
|
@ -322,6 +320,36 @@ public class MockHttpServletResponse implements HttpServletResponse {
|
|||
public void addCookie(Cookie cookie) {
|
||||
Assert.notNull(cookie, "Cookie must not be null");
|
||||
this.cookies.add(cookie);
|
||||
if (!this.cookieHeaderSet) {
|
||||
doAddHeaderValue(HttpHeaders.SET_COOKIE, getCookieHeader(cookie), false);
|
||||
}
|
||||
}
|
||||
|
||||
private String getCookieHeader(Cookie cookie) {
|
||||
StringBuilder buf = new StringBuilder();
|
||||
buf.append(cookie.getName()).append('=').append(cookie.getValue() == null ? "" : cookie.getValue());
|
||||
if (StringUtils.hasText(cookie.getPath())) {
|
||||
buf.append(";Path=").append(cookie.getPath());
|
||||
}
|
||||
if (StringUtils.hasText(cookie.getDomain())) {
|
||||
buf.append(";Domain=").append(cookie.getDomain());
|
||||
}
|
||||
int maxAge = cookie.getMaxAge();
|
||||
if (maxAge >= 0) {
|
||||
buf.append(";Max-Age=").append(maxAge);
|
||||
buf.append(";Expires=");
|
||||
HttpHeaders headers = new HttpHeaders();
|
||||
headers.setExpires(maxAge > 0 ? System.currentTimeMillis() + 1000L * maxAge : 0);
|
||||
buf.append(headers.getFirst(HttpHeaders.EXPIRES));
|
||||
}
|
||||
|
||||
if (cookie.getSecure()) {
|
||||
buf.append(";Secure");
|
||||
}
|
||||
if (cookie.isHttpOnly()) {
|
||||
buf.append(";HttpOnly");
|
||||
}
|
||||
return buf.toString();
|
||||
}
|
||||
|
||||
public Cookie[] getCookies() {
|
||||
|
@ -466,13 +494,13 @@ public class MockHttpServletResponse implements HttpServletResponse {
|
|||
public void sendRedirect(String url) throws IOException {
|
||||
Assert.state(!isCommitted(), "Cannot send redirect - response is already committed");
|
||||
Assert.notNull(url, "Redirect URL must not be null");
|
||||
setHeader(LOCATION_HEADER, url);
|
||||
setHeader(HttpHeaders.LOCATION, url);
|
||||
setStatus(HttpServletResponse.SC_MOVED_TEMPORARILY);
|
||||
setCommitted(true);
|
||||
}
|
||||
|
||||
public String getRedirectedUrl() {
|
||||
return getHeader(LOCATION_HEADER);
|
||||
return getHeader(HttpHeaders.LOCATION);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -505,11 +533,13 @@ public class MockHttpServletResponse implements HttpServletResponse {
|
|||
|
||||
@Override
|
||||
public void setHeader(String name, String value) {
|
||||
this.cookieHeaderSet = HttpHeaders.SET_COOKIE.equalsIgnoreCase(name);
|
||||
setHeaderValue(name, value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addHeader(String name, String value) {
|
||||
this.cookieHeaderSet = HttpHeaders.SET_COOKIE.equalsIgnoreCase(name);
|
||||
addHeaderValue(name, value);
|
||||
}
|
||||
|
||||
|
@ -538,11 +568,11 @@ public class MockHttpServletResponse implements HttpServletResponse {
|
|||
}
|
||||
|
||||
private boolean setSpecialHeader(String name, Object value) {
|
||||
if (CONTENT_TYPE_HEADER.equalsIgnoreCase(name)) {
|
||||
if (HttpHeaders.CONTENT_TYPE.equalsIgnoreCase(name)) {
|
||||
setContentType(value.toString());
|
||||
return true;
|
||||
}
|
||||
else if (CONTENT_LENGTH_HEADER.equalsIgnoreCase(name)) {
|
||||
else if (HttpHeaders.CONTENT_LENGTH.equalsIgnoreCase(name)) {
|
||||
setContentLength(value instanceof Number ? ((Number) value).intValue() :
|
||||
Integer.parseInt(value.toString()));
|
||||
return true;
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright 2002-2016 the original author or authors.
|
||||
* Copyright 2002-2017 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.
|
||||
|
@ -27,6 +27,7 @@ import com.gargoylesoftware.htmlunit.WebConnection;
|
|||
import com.gargoylesoftware.htmlunit.WebRequest;
|
||||
import com.gargoylesoftware.htmlunit.WebResponse;
|
||||
import com.gargoylesoftware.htmlunit.util.Cookie;
|
||||
import org.apache.http.impl.cookie.BasicClientCookie;
|
||||
|
||||
import org.springframework.mock.web.MockHttpServletResponse;
|
||||
import org.springframework.mock.web.MockHttpSession;
|
||||
|
@ -161,7 +162,7 @@ public final class MockMvcWebConnection implements WebConnection {
|
|||
if (cookie.getDomain() == null) {
|
||||
cookie.setDomain(webRequest.getUrl().getHost());
|
||||
}
|
||||
Cookie toManage = MockWebResponseBuilder.createCookie(cookie);
|
||||
Cookie toManage = createCookie(cookie);
|
||||
Date expires = toManage.getExpires();
|
||||
if (expires == null || expires.after(now)) {
|
||||
cookieManager.addCookie(toManage);
|
||||
|
@ -172,6 +173,23 @@ public final class MockMvcWebConnection implements WebConnection {
|
|||
}
|
||||
}
|
||||
|
||||
private static com.gargoylesoftware.htmlunit.util.Cookie createCookie(javax.servlet.http.Cookie cookie) {
|
||||
Date expires = null;
|
||||
if (cookie.getMaxAge() > -1) {
|
||||
expires = new Date(System.currentTimeMillis() + cookie.getMaxAge() * 1000);
|
||||
}
|
||||
BasicClientCookie result = new BasicClientCookie(cookie.getName(), cookie.getValue());
|
||||
result.setDomain(cookie.getDomain());
|
||||
result.setComment(cookie.getComment());
|
||||
result.setExpiryDate(expires);
|
||||
result.setPath(cookie.getPath());
|
||||
result.setSecure(cookie.getSecure());
|
||||
if (cookie.isHttpOnly()) {
|
||||
result.setAttribute("httponly", "true");
|
||||
}
|
||||
return new com.gargoylesoftware.htmlunit.util.Cookie(result);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void close() {
|
||||
}
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright 2002-2016 the original author or authors.
|
||||
* Copyright 2002-2017 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.
|
||||
|
@ -19,17 +19,13 @@ package org.springframework.test.web.servlet.htmlunit;
|
|||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
import javax.servlet.http.Cookie;
|
||||
|
||||
import com.gargoylesoftware.htmlunit.WebRequest;
|
||||
import com.gargoylesoftware.htmlunit.WebResponse;
|
||||
import com.gargoylesoftware.htmlunit.WebResponseData;
|
||||
import com.gargoylesoftware.htmlunit.util.NameValuePair;
|
||||
|
||||
import org.apache.http.impl.cookie.BasicClientCookie;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.mock.web.MockHttpServletResponse;
|
||||
import org.springframework.util.Assert;
|
||||
|
@ -105,30 +101,7 @@ final class MockWebResponseBuilder {
|
|||
if (location != null) {
|
||||
responseHeaders.add(new NameValuePair("Location", location));
|
||||
}
|
||||
for (Cookie cookie : this.response.getCookies()) {
|
||||
responseHeaders.add(new NameValuePair("Set-Cookie", valueOfCookie(cookie)));
|
||||
}
|
||||
return responseHeaders;
|
||||
}
|
||||
|
||||
private String valueOfCookie(Cookie cookie) {
|
||||
return createCookie(cookie).toString();
|
||||
}
|
||||
|
||||
static com.gargoylesoftware.htmlunit.util.Cookie createCookie(Cookie cookie) {
|
||||
Date expires = null;
|
||||
if (cookie.getMaxAge() > -1) {
|
||||
expires = new Date(System.currentTimeMillis() + cookie.getMaxAge() * 1000);
|
||||
}
|
||||
BasicClientCookie result = new BasicClientCookie(cookie.getName(), cookie.getValue());
|
||||
result.setDomain(cookie.getDomain());
|
||||
result.setComment(cookie.getComment());
|
||||
result.setExpiryDate(expires);
|
||||
result.setPath(cookie.getPath());
|
||||
result.setSecure(cookie.getSecure());
|
||||
if (cookie.isHttpOnly()) {
|
||||
result.setAttribute("httponly", "true");
|
||||
}
|
||||
return new com.gargoylesoftware.htmlunit.util.Cookie(result);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -251,12 +251,14 @@ public class MockHttpServletRequestTests {
|
|||
request.setCookies(cookie1, cookie2);
|
||||
|
||||
Cookie[] cookies = request.getCookies();
|
||||
List<String> cookieHeaders = Collections.list(request.getHeaders("Cookie"));
|
||||
|
||||
assertEquals(2, cookies.length);
|
||||
assertEquals("foo", cookies[0].getName());
|
||||
assertEquals("bar", cookies[0].getValue());
|
||||
assertEquals("baz", cookies[1].getName());
|
||||
assertEquals("qux", cookies[1].getValue());
|
||||
assertEquals(Arrays.asList("foo=bar", "baz=qux"), cookieHeaders);
|
||||
}
|
||||
|
||||
@Test
|
||||
|
|
|
@ -19,10 +19,14 @@ package org.springframework.mock.web;
|
|||
import java.io.IOException;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import javax.servlet.http.Cookie;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import org.springframework.http.HttpHeaders;
|
||||
import org.springframework.web.util.WebUtils;
|
||||
|
||||
import static org.junit.Assert.*;
|
||||
|
@ -155,6 +159,22 @@ public class MockHttpServletResponseTests {
|
|||
assertEquals("HTTP header casing not being preserved", headerName, responseHeaders.iterator().next());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void cookies() {
|
||||
Cookie cookie = new Cookie("foo", "bar");
|
||||
cookie.setPath("/path");
|
||||
cookie.setDomain("example.com");
|
||||
cookie.setMaxAge(0);
|
||||
cookie.setSecure(true);
|
||||
cookie.setHttpOnly(true);
|
||||
|
||||
response.addCookie(cookie);
|
||||
|
||||
assertEquals("foo=bar;Path=/path;Domain=example.com;" +
|
||||
"Max-Age=0;Expires=Thu, 01 Jan 1970 00:00:00 GMT;" +
|
||||
"Secure;HttpOnly", response.getHeader(HttpHeaders.SET_COOKIE));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void servletOutputStreamCommittedWhenBufferSizeExceeded() throws IOException {
|
||||
assertFalse(response.isCommitted());
|
||||
|
|
|
@ -116,8 +116,8 @@ public class MockWebResponseBuilderTests {
|
|||
assertThat(header.getValue(), equalTo("value"));
|
||||
header = responseHeaders.get(2);
|
||||
assertThat(header.getName(), equalTo("Set-Cookie"));
|
||||
assertThat(header.getValue(), startsWith("cookieA=valueA;domain=domain;path=/path;expires="));
|
||||
assertThat(header.getValue(), endsWith(";secure;httpOnly"));
|
||||
assertThat(header.getValue(), startsWith("cookieA=valueA;Path=/path;Domain=domain;Max-Age=1800;Expires="));
|
||||
assertThat(header.getValue(), endsWith(";Secure;HttpOnly"));
|
||||
}
|
||||
|
||||
// SPR-14169
|
||||
|
|
|
@ -19,8 +19,8 @@ package org.springframework.test.web.servlet.result;
|
|||
import java.net.URI;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import javax.servlet.http.Cookie;
|
||||
|
||||
import org.junit.Test;
|
||||
|
@ -40,7 +40,8 @@ import org.springframework.web.servlet.DispatcherServlet;
|
|||
import org.springframework.web.servlet.FlashMap;
|
||||
import org.springframework.web.servlet.ModelAndView;
|
||||
|
||||
import static org.junit.Assert.*;
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
/**
|
||||
* Unit tests for {@link PrintingResultHandler}.
|
||||
|
@ -114,10 +115,18 @@ public class PrintingResultHandlerTests {
|
|||
|
||||
this.handler.handle(this.mvcResult);
|
||||
|
||||
// Manually validate cookie values since maxAge changes...
|
||||
List<String> cookieValues = this.response.getHeaders("Set-Cookie");
|
||||
assertEquals(2, cookieValues.size());
|
||||
assertEquals("cookie=cookieValue", cookieValues.get(0));
|
||||
assertTrue("Actual: " + cookieValues.get(1), cookieValues.get(1).startsWith(
|
||||
"enigma=42;Path=/crumbs;Domain=.example.com;Max-Age=1234;Expires="));
|
||||
|
||||
HttpHeaders headers = new HttpHeaders();
|
||||
headers.set("header", "headerValue");
|
||||
headers.setContentType(MediaType.TEXT_PLAIN);
|
||||
headers.setLocation(new URI("/redirectFoo"));
|
||||
headers.put("Set-Cookie", cookieValues);
|
||||
|
||||
String heading = "MockHttpServletResponse";
|
||||
assertValue(heading, "Status", this.response.getStatus());
|
||||
|
|
|
@ -27,6 +27,7 @@ import java.io.UnsupportedEncodingException;
|
|||
import java.security.Principal;
|
||||
import java.text.ParseException;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.Date;
|
||||
|
@ -55,11 +56,13 @@ import javax.servlet.http.HttpSession;
|
|||
import javax.servlet.http.HttpUpgradeHandler;
|
||||
import javax.servlet.http.Part;
|
||||
|
||||
import org.springframework.http.HttpHeaders;
|
||||
import org.springframework.http.MediaType;
|
||||
import org.springframework.util.Assert;
|
||||
import org.springframework.util.LinkedCaseInsensitiveMap;
|
||||
import org.springframework.util.LinkedMultiValueMap;
|
||||
import org.springframework.util.MultiValueMap;
|
||||
import org.springframework.util.ObjectUtils;
|
||||
import org.springframework.util.StreamUtils;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
|
@ -87,10 +90,6 @@ public class MockHttpServletRequest implements HttpServletRequest {
|
|||
|
||||
private static final String HTTPS = "https";
|
||||
|
||||
private static final String CONTENT_TYPE_HEADER = "Content-Type";
|
||||
|
||||
private static final String HOST_HEADER = "Host";
|
||||
|
||||
private static final String CHARSET_PREFIX = "charset=";
|
||||
|
||||
private static final TimeZone GMT = TimeZone.getTimeZone("GMT");
|
||||
|
@ -219,6 +218,8 @@ public class MockHttpServletRequest implements HttpServletRequest {
|
|||
|
||||
private Cookie[] cookies;
|
||||
|
||||
private boolean cookieHeaderSet;
|
||||
|
||||
private final Map<String, HeaderValueHolder> headers = new LinkedCaseInsensitiveMap<>();
|
||||
|
||||
private String method;
|
||||
|
@ -387,7 +388,7 @@ public class MockHttpServletRequest implements HttpServletRequest {
|
|||
StringUtils.hasLength(this.characterEncoding)) {
|
||||
sb.append(";").append(CHARSET_PREFIX).append(this.characterEncoding);
|
||||
}
|
||||
doAddHeaderValue(CONTENT_TYPE_HEADER, sb.toString(), true);
|
||||
doAddHeaderValue(HttpHeaders.CONTENT_TYPE, sb.toString(), true);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -633,7 +634,7 @@ public class MockHttpServletRequest implements HttpServletRequest {
|
|||
|
||||
@Override
|
||||
public String getServerName() {
|
||||
String host = getHeader(HOST_HEADER);
|
||||
String host = getHeader(HttpHeaders.HOST);
|
||||
if (host != null) {
|
||||
host = host.trim();
|
||||
if (host.startsWith("[")) {
|
||||
|
@ -655,7 +656,7 @@ public class MockHttpServletRequest implements HttpServletRequest {
|
|||
|
||||
@Override
|
||||
public int getServerPort() {
|
||||
String host = getHeader(HOST_HEADER);
|
||||
String host = getHeader(HttpHeaders.HOST);
|
||||
if (host != null) {
|
||||
host = host.trim();
|
||||
int idx;
|
||||
|
@ -922,6 +923,11 @@ public class MockHttpServletRequest implements HttpServletRequest {
|
|||
|
||||
public void setCookies(Cookie... cookies) {
|
||||
this.cookies = cookies;
|
||||
if (!this.cookieHeaderSet && !ObjectUtils.isEmpty(cookies)) {
|
||||
Arrays.stream(cookies)
|
||||
.map(c -> c.getName() + '=' + (c.getValue() == null ? "" : c.getValue()))
|
||||
.forEach(value -> doAddHeaderValue(HttpHeaders.COOKIE, value, false));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -945,10 +951,11 @@ public class MockHttpServletRequest implements HttpServletRequest {
|
|||
* @see #getDateHeader
|
||||
*/
|
||||
public void addHeader(String name, Object value) {
|
||||
if (CONTENT_TYPE_HEADER.equalsIgnoreCase(name) && !this.headers.containsKey(CONTENT_TYPE_HEADER)) {
|
||||
if (HttpHeaders.CONTENT_TYPE.equalsIgnoreCase(name) && !this.headers.containsKey(HttpHeaders.CONTENT_TYPE)) {
|
||||
setContentType(value.toString());
|
||||
}
|
||||
else {
|
||||
this.cookieHeaderSet = HttpHeaders.COOKIE.equalsIgnoreCase(name);
|
||||
doAddHeaderValue(name, value, false);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -37,9 +37,11 @@ import javax.servlet.ServletOutputStream;
|
|||
import javax.servlet.http.Cookie;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
|
||||
import org.springframework.http.HttpHeaders;
|
||||
import org.springframework.http.MediaType;
|
||||
import org.springframework.util.Assert;
|
||||
import org.springframework.util.LinkedCaseInsensitiveMap;
|
||||
import org.springframework.util.StringUtils;
|
||||
import org.springframework.web.util.WebUtils;
|
||||
|
||||
/**
|
||||
|
@ -56,12 +58,6 @@ public class MockHttpServletResponse implements HttpServletResponse {
|
|||
|
||||
private static final String CHARSET_PREFIX = "charset=";
|
||||
|
||||
private static final String CONTENT_TYPE_HEADER = "Content-Type";
|
||||
|
||||
private static final String CONTENT_LENGTH_HEADER = "Content-Length";
|
||||
|
||||
private static final String LOCATION_HEADER = "Location";
|
||||
|
||||
private static final String DATE_FORMAT = "EEE, dd MMM yyyy HH:mm:ss zzz";
|
||||
|
||||
private static final TimeZone GMT = TimeZone.getTimeZone("GMT");
|
||||
|
@ -102,6 +98,8 @@ public class MockHttpServletResponse implements HttpServletResponse {
|
|||
|
||||
private final List<Cookie> cookies = new ArrayList<>();
|
||||
|
||||
private boolean cookieHeaderSet;
|
||||
|
||||
private final Map<String, HeaderValueHolder> headers = new LinkedCaseInsensitiveMap<>();
|
||||
|
||||
private int status = HttpServletResponse.SC_OK;
|
||||
|
@ -168,7 +166,7 @@ public class MockHttpServletResponse implements HttpServletResponse {
|
|||
if (!this.contentType.toLowerCase().contains(CHARSET_PREFIX) && this.charset) {
|
||||
sb.append(";").append(CHARSET_PREFIX).append(this.characterEncoding);
|
||||
}
|
||||
doAddHeaderValue(CONTENT_TYPE_HEADER, sb.toString(), true);
|
||||
doAddHeaderValue(HttpHeaders.CONTENT_TYPE, sb.toString(), true);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -208,7 +206,7 @@ public class MockHttpServletResponse implements HttpServletResponse {
|
|||
@Override
|
||||
public void setContentLength(int contentLength) {
|
||||
this.contentLength = contentLength;
|
||||
doAddHeaderValue(CONTENT_LENGTH_HEADER, contentLength, true);
|
||||
doAddHeaderValue(HttpHeaders.CONTENT_LENGTH, contentLength, true);
|
||||
}
|
||||
|
||||
public int getContentLength() {
|
||||
|
@ -218,7 +216,7 @@ public class MockHttpServletResponse implements HttpServletResponse {
|
|||
@Override
|
||||
public void setContentLengthLong(long contentLength) {
|
||||
this.contentLength = contentLength;
|
||||
doAddHeaderValue(CONTENT_LENGTH_HEADER, contentLength, true);
|
||||
doAddHeaderValue(HttpHeaders.CONTENT_LENGTH, contentLength, true);
|
||||
}
|
||||
|
||||
public long getContentLengthLong() {
|
||||
|
@ -322,6 +320,36 @@ public class MockHttpServletResponse implements HttpServletResponse {
|
|||
public void addCookie(Cookie cookie) {
|
||||
Assert.notNull(cookie, "Cookie must not be null");
|
||||
this.cookies.add(cookie);
|
||||
if (!this.cookieHeaderSet) {
|
||||
doAddHeaderValue(HttpHeaders.SET_COOKIE, getCookieHeader(cookie), false);
|
||||
}
|
||||
}
|
||||
|
||||
private String getCookieHeader(Cookie cookie) {
|
||||
StringBuilder buf = new StringBuilder();
|
||||
buf.append(cookie.getName()).append('=').append(cookie.getValue() == null ? "" : cookie.getValue());
|
||||
if (StringUtils.hasText(cookie.getPath())) {
|
||||
buf.append(";Path=").append(cookie.getPath());
|
||||
}
|
||||
if (StringUtils.hasText(cookie.getDomain())) {
|
||||
buf.append(";Domain=").append(cookie.getDomain());
|
||||
}
|
||||
int maxAge = cookie.getMaxAge();
|
||||
if (maxAge >= 0) {
|
||||
buf.append(";Max-Age=").append(maxAge);
|
||||
buf.append(";Expires=");
|
||||
HttpHeaders headers = new HttpHeaders();
|
||||
headers.setExpires(maxAge > 0 ? System.currentTimeMillis() + 1000L * maxAge : 0);
|
||||
buf.append(headers.getFirst(HttpHeaders.EXPIRES));
|
||||
}
|
||||
|
||||
if (cookie.getSecure()) {
|
||||
buf.append(";Secure");
|
||||
}
|
||||
if (cookie.isHttpOnly()) {
|
||||
buf.append(";HttpOnly");
|
||||
}
|
||||
return buf.toString();
|
||||
}
|
||||
|
||||
public Cookie[] getCookies() {
|
||||
|
@ -466,13 +494,13 @@ public class MockHttpServletResponse implements HttpServletResponse {
|
|||
public void sendRedirect(String url) throws IOException {
|
||||
Assert.state(!isCommitted(), "Cannot send redirect - response is already committed");
|
||||
Assert.notNull(url, "Redirect URL must not be null");
|
||||
setHeader(LOCATION_HEADER, url);
|
||||
setHeader(HttpHeaders.LOCATION, url);
|
||||
setStatus(HttpServletResponse.SC_MOVED_TEMPORARILY);
|
||||
setCommitted(true);
|
||||
}
|
||||
|
||||
public String getRedirectedUrl() {
|
||||
return getHeader(LOCATION_HEADER);
|
||||
return getHeader(HttpHeaders.LOCATION);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -505,11 +533,13 @@ public class MockHttpServletResponse implements HttpServletResponse {
|
|||
|
||||
@Override
|
||||
public void setHeader(String name, String value) {
|
||||
this.cookieHeaderSet = HttpHeaders.SET_COOKIE.equalsIgnoreCase(name);
|
||||
setHeaderValue(name, value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addHeader(String name, String value) {
|
||||
this.cookieHeaderSet = HttpHeaders.SET_COOKIE.equalsIgnoreCase(name);
|
||||
addHeaderValue(name, value);
|
||||
}
|
||||
|
||||
|
@ -538,11 +568,11 @@ public class MockHttpServletResponse implements HttpServletResponse {
|
|||
}
|
||||
|
||||
private boolean setSpecialHeader(String name, Object value) {
|
||||
if (CONTENT_TYPE_HEADER.equalsIgnoreCase(name)) {
|
||||
if (HttpHeaders.CONTENT_TYPE.equalsIgnoreCase(name)) {
|
||||
setContentType(value.toString());
|
||||
return true;
|
||||
}
|
||||
else if (CONTENT_LENGTH_HEADER.equalsIgnoreCase(name)) {
|
||||
else if (HttpHeaders.CONTENT_LENGTH.equalsIgnoreCase(name)) {
|
||||
setContentLength(value instanceof Number ? ((Number) value).intValue() :
|
||||
Integer.parseInt(value.toString()));
|
||||
return true;
|
||||
|
|
Loading…
Reference in New Issue