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.security.Principal; | ||||||
| import java.text.ParseException; | import java.text.ParseException; | ||||||
| import java.text.SimpleDateFormat; | import java.text.SimpleDateFormat; | ||||||
|  | import java.util.Arrays; | ||||||
| import java.util.Collection; | import java.util.Collection; | ||||||
| import java.util.Collections; | import java.util.Collections; | ||||||
| import java.util.Date; | import java.util.Date; | ||||||
|  | @ -55,11 +56,13 @@ import javax.servlet.http.HttpSession; | ||||||
| import javax.servlet.http.HttpUpgradeHandler; | import javax.servlet.http.HttpUpgradeHandler; | ||||||
| import javax.servlet.http.Part; | import javax.servlet.http.Part; | ||||||
| 
 | 
 | ||||||
|  | import org.springframework.http.HttpHeaders; | ||||||
| import org.springframework.http.MediaType; | import org.springframework.http.MediaType; | ||||||
| import org.springframework.util.Assert; | import org.springframework.util.Assert; | ||||||
| import org.springframework.util.LinkedCaseInsensitiveMap; | import org.springframework.util.LinkedCaseInsensitiveMap; | ||||||
| import org.springframework.util.LinkedMultiValueMap; | import org.springframework.util.LinkedMultiValueMap; | ||||||
| import org.springframework.util.MultiValueMap; | import org.springframework.util.MultiValueMap; | ||||||
|  | import org.springframework.util.ObjectUtils; | ||||||
| import org.springframework.util.StreamUtils; | import org.springframework.util.StreamUtils; | ||||||
| import org.springframework.util.StringUtils; | import org.springframework.util.StringUtils; | ||||||
| 
 | 
 | ||||||
|  | @ -87,10 +90,6 @@ public class MockHttpServletRequest implements HttpServletRequest { | ||||||
| 
 | 
 | ||||||
| 	private static final String HTTPS = "https"; | 	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 String CHARSET_PREFIX = "charset="; | ||||||
| 
 | 
 | ||||||
| 	private static final TimeZone GMT = TimeZone.getTimeZone("GMT"); | 	private static final TimeZone GMT = TimeZone.getTimeZone("GMT"); | ||||||
|  | @ -219,6 +218,8 @@ public class MockHttpServletRequest implements HttpServletRequest { | ||||||
| 
 | 
 | ||||||
| 	private Cookie[] cookies; | 	private Cookie[] cookies; | ||||||
| 
 | 
 | ||||||
|  | 	private boolean cookieHeaderSet; | ||||||
|  | 
 | ||||||
| 	private final Map<String, HeaderValueHolder> headers = new LinkedCaseInsensitiveMap<>(); | 	private final Map<String, HeaderValueHolder> headers = new LinkedCaseInsensitiveMap<>(); | ||||||
| 
 | 
 | ||||||
| 	private String method; | 	private String method; | ||||||
|  | @ -387,7 +388,7 @@ public class MockHttpServletRequest implements HttpServletRequest { | ||||||
| 					StringUtils.hasLength(this.characterEncoding)) { | 					StringUtils.hasLength(this.characterEncoding)) { | ||||||
| 				sb.append(";").append(CHARSET_PREFIX).append(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 | 	@Override | ||||||
| 	public String getServerName() { | 	public String getServerName() { | ||||||
| 		String host = getHeader(HOST_HEADER); | 		String host = getHeader(HttpHeaders.HOST); | ||||||
| 		if (host != null) { | 		if (host != null) { | ||||||
| 			host = host.trim(); | 			host = host.trim(); | ||||||
| 			if (host.startsWith("[")) { | 			if (host.startsWith("[")) { | ||||||
|  | @ -655,7 +656,7 @@ public class MockHttpServletRequest implements HttpServletRequest { | ||||||
| 
 | 
 | ||||||
| 	@Override | 	@Override | ||||||
| 	public int getServerPort() { | 	public int getServerPort() { | ||||||
| 		String host = getHeader(HOST_HEADER); | 		String host = getHeader(HttpHeaders.HOST); | ||||||
| 		if (host != null) { | 		if (host != null) { | ||||||
| 			host = host.trim(); | 			host = host.trim(); | ||||||
| 			int idx; | 			int idx; | ||||||
|  | @ -922,6 +923,11 @@ public class MockHttpServletRequest implements HttpServletRequest { | ||||||
| 
 | 
 | ||||||
| 	public void setCookies(Cookie... cookies) { | 	public void setCookies(Cookie... cookies) { | ||||||
| 		this.cookies = 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 | 	@Override | ||||||
|  | @ -945,10 +951,11 @@ public class MockHttpServletRequest implements HttpServletRequest { | ||||||
| 	 * @see #getDateHeader | 	 * @see #getDateHeader | ||||||
| 	 */ | 	 */ | ||||||
| 	public void addHeader(String name, Object value) { | 	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()); | 			setContentType(value.toString()); | ||||||
| 		} | 		} | ||||||
| 		else { | 		else { | ||||||
|  | 			this.cookieHeaderSet = HttpHeaders.COOKIE.equalsIgnoreCase(name); | ||||||
| 			doAddHeaderValue(name, value, false); | 			doAddHeaderValue(name, value, false); | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | @ -37,9 +37,11 @@ import javax.servlet.ServletOutputStream; | ||||||
| import javax.servlet.http.Cookie; | import javax.servlet.http.Cookie; | ||||||
| import javax.servlet.http.HttpServletResponse; | import javax.servlet.http.HttpServletResponse; | ||||||
| 
 | 
 | ||||||
|  | import org.springframework.http.HttpHeaders; | ||||||
| import org.springframework.http.MediaType; | import org.springframework.http.MediaType; | ||||||
| import org.springframework.util.Assert; | import org.springframework.util.Assert; | ||||||
| import org.springframework.util.LinkedCaseInsensitiveMap; | import org.springframework.util.LinkedCaseInsensitiveMap; | ||||||
|  | import org.springframework.util.StringUtils; | ||||||
| import org.springframework.web.util.WebUtils; | 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 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 String DATE_FORMAT = "EEE, dd MMM yyyy HH:mm:ss zzz"; | ||||||
| 
 | 
 | ||||||
| 	private static final TimeZone GMT = TimeZone.getTimeZone("GMT"); | 	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 final List<Cookie> cookies = new ArrayList<>(); | ||||||
| 
 | 
 | ||||||
|  | 	private boolean cookieHeaderSet; | ||||||
|  | 
 | ||||||
| 	private final Map<String, HeaderValueHolder> headers = new LinkedCaseInsensitiveMap<>(); | 	private final Map<String, HeaderValueHolder> headers = new LinkedCaseInsensitiveMap<>(); | ||||||
| 
 | 
 | ||||||
| 	private int status = HttpServletResponse.SC_OK; | 	private int status = HttpServletResponse.SC_OK; | ||||||
|  | @ -168,7 +166,7 @@ public class MockHttpServletResponse implements HttpServletResponse { | ||||||
| 			if (!this.contentType.toLowerCase().contains(CHARSET_PREFIX) && this.charset) { | 			if (!this.contentType.toLowerCase().contains(CHARSET_PREFIX) && this.charset) { | ||||||
| 				sb.append(";").append(CHARSET_PREFIX).append(this.characterEncoding); | 				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 | 	@Override | ||||||
| 	public void setContentLength(int contentLength) { | 	public void setContentLength(int contentLength) { | ||||||
| 		this.contentLength = contentLength; | 		this.contentLength = contentLength; | ||||||
| 		doAddHeaderValue(CONTENT_LENGTH_HEADER, contentLength, true); | 		doAddHeaderValue(HttpHeaders.CONTENT_LENGTH, contentLength, true); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	public int getContentLength() { | 	public int getContentLength() { | ||||||
|  | @ -218,7 +216,7 @@ public class MockHttpServletResponse implements HttpServletResponse { | ||||||
| 	@Override | 	@Override | ||||||
| 	public void setContentLengthLong(long contentLength) { | 	public void setContentLengthLong(long contentLength) { | ||||||
| 		this.contentLength = contentLength; | 		this.contentLength = contentLength; | ||||||
| 		doAddHeaderValue(CONTENT_LENGTH_HEADER, contentLength, true); | 		doAddHeaderValue(HttpHeaders.CONTENT_LENGTH, contentLength, true); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	public long getContentLengthLong() { | 	public long getContentLengthLong() { | ||||||
|  | @ -322,6 +320,36 @@ public class MockHttpServletResponse implements HttpServletResponse { | ||||||
| 	public void addCookie(Cookie cookie) { | 	public void addCookie(Cookie cookie) { | ||||||
| 		Assert.notNull(cookie, "Cookie must not be null"); | 		Assert.notNull(cookie, "Cookie must not be null"); | ||||||
| 		this.cookies.add(cookie); | 		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() { | 	public Cookie[] getCookies() { | ||||||
|  | @ -466,13 +494,13 @@ public class MockHttpServletResponse implements HttpServletResponse { | ||||||
| 	public void sendRedirect(String url) throws IOException { | 	public void sendRedirect(String url) throws IOException { | ||||||
| 		Assert.state(!isCommitted(), "Cannot send redirect - response is already committed"); | 		Assert.state(!isCommitted(), "Cannot send redirect - response is already committed"); | ||||||
| 		Assert.notNull(url, "Redirect URL must not be null"); | 		Assert.notNull(url, "Redirect URL must not be null"); | ||||||
| 		setHeader(LOCATION_HEADER, url); | 		setHeader(HttpHeaders.LOCATION, url); | ||||||
| 		setStatus(HttpServletResponse.SC_MOVED_TEMPORARILY); | 		setStatus(HttpServletResponse.SC_MOVED_TEMPORARILY); | ||||||
| 		setCommitted(true); | 		setCommitted(true); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	public String getRedirectedUrl() { | 	public String getRedirectedUrl() { | ||||||
| 		return getHeader(LOCATION_HEADER); | 		return getHeader(HttpHeaders.LOCATION); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	@Override | 	@Override | ||||||
|  | @ -505,11 +533,13 @@ public class MockHttpServletResponse implements HttpServletResponse { | ||||||
| 
 | 
 | ||||||
| 	@Override | 	@Override | ||||||
| 	public void setHeader(String name, String value) { | 	public void setHeader(String name, String value) { | ||||||
|  | 		this.cookieHeaderSet = HttpHeaders.SET_COOKIE.equalsIgnoreCase(name); | ||||||
| 		setHeaderValue(name, value); | 		setHeaderValue(name, value); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	@Override | 	@Override | ||||||
| 	public void addHeader(String name, String value) { | 	public void addHeader(String name, String value) { | ||||||
|  | 		this.cookieHeaderSet = HttpHeaders.SET_COOKIE.equalsIgnoreCase(name); | ||||||
| 		addHeaderValue(name, value); | 		addHeaderValue(name, value); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | @ -538,11 +568,11 @@ public class MockHttpServletResponse implements HttpServletResponse { | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	private boolean setSpecialHeader(String name, Object value) { | 	private boolean setSpecialHeader(String name, Object value) { | ||||||
| 		if (CONTENT_TYPE_HEADER.equalsIgnoreCase(name)) { | 		if (HttpHeaders.CONTENT_TYPE.equalsIgnoreCase(name)) { | ||||||
| 			setContentType(value.toString()); | 			setContentType(value.toString()); | ||||||
| 			return true; | 			return true; | ||||||
| 		} | 		} | ||||||
| 		else if (CONTENT_LENGTH_HEADER.equalsIgnoreCase(name)) { | 		else if (HttpHeaders.CONTENT_LENGTH.equalsIgnoreCase(name)) { | ||||||
| 			setContentLength(value instanceof Number ? ((Number) value).intValue() : | 			setContentLength(value instanceof Number ? ((Number) value).intValue() : | ||||||
| 					Integer.parseInt(value.toString())); | 					Integer.parseInt(value.toString())); | ||||||
| 			return true; | 			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"); |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  * you may not use this file except in compliance with 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.WebRequest; | ||||||
| import com.gargoylesoftware.htmlunit.WebResponse; | import com.gargoylesoftware.htmlunit.WebResponse; | ||||||
| import com.gargoylesoftware.htmlunit.util.Cookie; | import com.gargoylesoftware.htmlunit.util.Cookie; | ||||||
|  | import org.apache.http.impl.cookie.BasicClientCookie; | ||||||
| 
 | 
 | ||||||
| import org.springframework.mock.web.MockHttpServletResponse; | import org.springframework.mock.web.MockHttpServletResponse; | ||||||
| import org.springframework.mock.web.MockHttpSession; | import org.springframework.mock.web.MockHttpSession; | ||||||
|  | @ -161,7 +162,7 @@ public final class MockMvcWebConnection implements WebConnection { | ||||||
| 			if (cookie.getDomain() == null) { | 			if (cookie.getDomain() == null) { | ||||||
| 				cookie.setDomain(webRequest.getUrl().getHost()); | 				cookie.setDomain(webRequest.getUrl().getHost()); | ||||||
| 			} | 			} | ||||||
| 			Cookie toManage = MockWebResponseBuilder.createCookie(cookie); | 			Cookie toManage = createCookie(cookie); | ||||||
| 			Date expires = toManage.getExpires(); | 			Date expires = toManage.getExpires(); | ||||||
| 			if (expires == null || expires.after(now)) { | 			if (expires == null || expires.after(now)) { | ||||||
| 				cookieManager.addCookie(toManage); | 				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 | 	@Override | ||||||
| 	public void close() { | 	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"); |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  * you may not use this file except in compliance with 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.io.IOException; | ||||||
| import java.util.ArrayList; | import java.util.ArrayList; | ||||||
| import java.util.Collection; | import java.util.Collection; | ||||||
| import java.util.Date; |  | ||||||
| import java.util.List; | import java.util.List; | ||||||
| 
 | 
 | ||||||
| import javax.servlet.http.Cookie; |  | ||||||
| 
 |  | ||||||
| import com.gargoylesoftware.htmlunit.WebRequest; | import com.gargoylesoftware.htmlunit.WebRequest; | ||||||
| import com.gargoylesoftware.htmlunit.WebResponse; | import com.gargoylesoftware.htmlunit.WebResponse; | ||||||
| import com.gargoylesoftware.htmlunit.WebResponseData; | import com.gargoylesoftware.htmlunit.WebResponseData; | ||||||
| import com.gargoylesoftware.htmlunit.util.NameValuePair; | import com.gargoylesoftware.htmlunit.util.NameValuePair; | ||||||
| 
 | 
 | ||||||
| import org.apache.http.impl.cookie.BasicClientCookie; |  | ||||||
| import org.springframework.http.HttpStatus; | import org.springframework.http.HttpStatus; | ||||||
| import org.springframework.mock.web.MockHttpServletResponse; | import org.springframework.mock.web.MockHttpServletResponse; | ||||||
| import org.springframework.util.Assert; | import org.springframework.util.Assert; | ||||||
|  | @ -105,30 +101,7 @@ final class MockWebResponseBuilder { | ||||||
| 		if (location != null) { | 		if (location != null) { | ||||||
| 			responseHeaders.add(new NameValuePair("Location", location)); | 			responseHeaders.add(new NameValuePair("Location", location)); | ||||||
| 		} | 		} | ||||||
| 		for (Cookie cookie : this.response.getCookies()) { |  | ||||||
| 			responseHeaders.add(new NameValuePair("Set-Cookie", valueOfCookie(cookie))); |  | ||||||
| 		} |  | ||||||
| 		return responseHeaders; | 		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); | 		request.setCookies(cookie1, cookie2); | ||||||
| 
 | 
 | ||||||
| 		Cookie[] cookies = request.getCookies(); | 		Cookie[] cookies = request.getCookies(); | ||||||
|  | 		List<String> cookieHeaders = Collections.list(request.getHeaders("Cookie")); | ||||||
| 
 | 
 | ||||||
| 		assertEquals(2, cookies.length); | 		assertEquals(2, cookies.length); | ||||||
| 		assertEquals("foo", cookies[0].getName()); | 		assertEquals("foo", cookies[0].getName()); | ||||||
| 		assertEquals("bar", cookies[0].getValue()); | 		assertEquals("bar", cookies[0].getValue()); | ||||||
| 		assertEquals("baz", cookies[1].getName()); | 		assertEquals("baz", cookies[1].getName()); | ||||||
| 		assertEquals("qux", cookies[1].getValue()); | 		assertEquals("qux", cookies[1].getValue()); | ||||||
|  | 		assertEquals(Arrays.asList("foo=bar", "baz=qux"), cookieHeaders); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	@Test | 	@Test | ||||||
|  |  | ||||||
|  | @ -19,10 +19,14 @@ package org.springframework.mock.web; | ||||||
| import java.io.IOException; | import java.io.IOException; | ||||||
| import java.util.Arrays; | import java.util.Arrays; | ||||||
| import java.util.Collection; | import java.util.Collection; | ||||||
|  | import java.util.Collections; | ||||||
|  | import java.util.List; | ||||||
|  | import javax.servlet.http.Cookie; | ||||||
| import javax.servlet.http.HttpServletResponse; | import javax.servlet.http.HttpServletResponse; | ||||||
| 
 | 
 | ||||||
| import org.junit.Test; | import org.junit.Test; | ||||||
| 
 | 
 | ||||||
|  | import org.springframework.http.HttpHeaders; | ||||||
| import org.springframework.web.util.WebUtils; | import org.springframework.web.util.WebUtils; | ||||||
| 
 | 
 | ||||||
| import static org.junit.Assert.*; | import static org.junit.Assert.*; | ||||||
|  | @ -155,6 +159,22 @@ public class MockHttpServletResponseTests { | ||||||
| 		assertEquals("HTTP header casing not being preserved", headerName, responseHeaders.iterator().next()); | 		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 | 	@Test | ||||||
| 	public void servletOutputStreamCommittedWhenBufferSizeExceeded() throws IOException { | 	public void servletOutputStreamCommittedWhenBufferSizeExceeded() throws IOException { | ||||||
| 		assertFalse(response.isCommitted()); | 		assertFalse(response.isCommitted()); | ||||||
|  |  | ||||||
|  | @ -116,8 +116,8 @@ public class MockWebResponseBuilderTests { | ||||||
| 		assertThat(header.getValue(), equalTo("value")); | 		assertThat(header.getValue(), equalTo("value")); | ||||||
| 		header = responseHeaders.get(2); | 		header = responseHeaders.get(2); | ||||||
| 		assertThat(header.getName(), equalTo("Set-Cookie")); | 		assertThat(header.getName(), equalTo("Set-Cookie")); | ||||||
| 		assertThat(header.getValue(), startsWith("cookieA=valueA;domain=domain;path=/path;expires=")); | 		assertThat(header.getValue(), startsWith("cookieA=valueA;Path=/path;Domain=domain;Max-Age=1800;Expires=")); | ||||||
| 		assertThat(header.getValue(), endsWith(";secure;httpOnly")); | 		assertThat(header.getValue(), endsWith(";Secure;HttpOnly")); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	// SPR-14169 | 	// SPR-14169 | ||||||
|  |  | ||||||
|  | @ -19,8 +19,8 @@ package org.springframework.test.web.servlet.result; | ||||||
| import java.net.URI; | import java.net.URI; | ||||||
| import java.util.Collections; | import java.util.Collections; | ||||||
| import java.util.HashMap; | import java.util.HashMap; | ||||||
|  | import java.util.List; | ||||||
| import java.util.Map; | import java.util.Map; | ||||||
| 
 |  | ||||||
| import javax.servlet.http.Cookie; | import javax.servlet.http.Cookie; | ||||||
| 
 | 
 | ||||||
| import org.junit.Test; | 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.FlashMap; | ||||||
| import org.springframework.web.servlet.ModelAndView; | 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}. |  * Unit tests for {@link PrintingResultHandler}. | ||||||
|  | @ -114,10 +115,18 @@ public class PrintingResultHandlerTests { | ||||||
| 
 | 
 | ||||||
| 		this.handler.handle(this.mvcResult); | 		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(); | 		HttpHeaders headers = new HttpHeaders(); | ||||||
| 		headers.set("header", "headerValue"); | 		headers.set("header", "headerValue"); | ||||||
| 		headers.setContentType(MediaType.TEXT_PLAIN); | 		headers.setContentType(MediaType.TEXT_PLAIN); | ||||||
| 		headers.setLocation(new URI("/redirectFoo")); | 		headers.setLocation(new URI("/redirectFoo")); | ||||||
|  | 		headers.put("Set-Cookie", cookieValues); | ||||||
| 
 | 
 | ||||||
| 		String heading = "MockHttpServletResponse"; | 		String heading = "MockHttpServletResponse"; | ||||||
| 		assertValue(heading, "Status", this.response.getStatus()); | 		assertValue(heading, "Status", this.response.getStatus()); | ||||||
|  |  | ||||||
|  | @ -27,6 +27,7 @@ import java.io.UnsupportedEncodingException; | ||||||
| import java.security.Principal; | import java.security.Principal; | ||||||
| import java.text.ParseException; | import java.text.ParseException; | ||||||
| import java.text.SimpleDateFormat; | import java.text.SimpleDateFormat; | ||||||
|  | import java.util.Arrays; | ||||||
| import java.util.Collection; | import java.util.Collection; | ||||||
| import java.util.Collections; | import java.util.Collections; | ||||||
| import java.util.Date; | import java.util.Date; | ||||||
|  | @ -55,11 +56,13 @@ import javax.servlet.http.HttpSession; | ||||||
| import javax.servlet.http.HttpUpgradeHandler; | import javax.servlet.http.HttpUpgradeHandler; | ||||||
| import javax.servlet.http.Part; | import javax.servlet.http.Part; | ||||||
| 
 | 
 | ||||||
|  | import org.springframework.http.HttpHeaders; | ||||||
| import org.springframework.http.MediaType; | import org.springframework.http.MediaType; | ||||||
| import org.springframework.util.Assert; | import org.springframework.util.Assert; | ||||||
| import org.springframework.util.LinkedCaseInsensitiveMap; | import org.springframework.util.LinkedCaseInsensitiveMap; | ||||||
| import org.springframework.util.LinkedMultiValueMap; | import org.springframework.util.LinkedMultiValueMap; | ||||||
| import org.springframework.util.MultiValueMap; | import org.springframework.util.MultiValueMap; | ||||||
|  | import org.springframework.util.ObjectUtils; | ||||||
| import org.springframework.util.StreamUtils; | import org.springframework.util.StreamUtils; | ||||||
| import org.springframework.util.StringUtils; | import org.springframework.util.StringUtils; | ||||||
| 
 | 
 | ||||||
|  | @ -87,10 +90,6 @@ public class MockHttpServletRequest implements HttpServletRequest { | ||||||
| 
 | 
 | ||||||
| 	private static final String HTTPS = "https"; | 	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 String CHARSET_PREFIX = "charset="; | ||||||
| 
 | 
 | ||||||
| 	private static final TimeZone GMT = TimeZone.getTimeZone("GMT"); | 	private static final TimeZone GMT = TimeZone.getTimeZone("GMT"); | ||||||
|  | @ -219,6 +218,8 @@ public class MockHttpServletRequest implements HttpServletRequest { | ||||||
| 
 | 
 | ||||||
| 	private Cookie[] cookies; | 	private Cookie[] cookies; | ||||||
| 
 | 
 | ||||||
|  | 	private boolean cookieHeaderSet; | ||||||
|  | 
 | ||||||
| 	private final Map<String, HeaderValueHolder> headers = new LinkedCaseInsensitiveMap<>(); | 	private final Map<String, HeaderValueHolder> headers = new LinkedCaseInsensitiveMap<>(); | ||||||
| 
 | 
 | ||||||
| 	private String method; | 	private String method; | ||||||
|  | @ -387,7 +388,7 @@ public class MockHttpServletRequest implements HttpServletRequest { | ||||||
| 					StringUtils.hasLength(this.characterEncoding)) { | 					StringUtils.hasLength(this.characterEncoding)) { | ||||||
| 				sb.append(";").append(CHARSET_PREFIX).append(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 | 	@Override | ||||||
| 	public String getServerName() { | 	public String getServerName() { | ||||||
| 		String host = getHeader(HOST_HEADER); | 		String host = getHeader(HttpHeaders.HOST); | ||||||
| 		if (host != null) { | 		if (host != null) { | ||||||
| 			host = host.trim(); | 			host = host.trim(); | ||||||
| 			if (host.startsWith("[")) { | 			if (host.startsWith("[")) { | ||||||
|  | @ -655,7 +656,7 @@ public class MockHttpServletRequest implements HttpServletRequest { | ||||||
| 
 | 
 | ||||||
| 	@Override | 	@Override | ||||||
| 	public int getServerPort() { | 	public int getServerPort() { | ||||||
| 		String host = getHeader(HOST_HEADER); | 		String host = getHeader(HttpHeaders.HOST); | ||||||
| 		if (host != null) { | 		if (host != null) { | ||||||
| 			host = host.trim(); | 			host = host.trim(); | ||||||
| 			int idx; | 			int idx; | ||||||
|  | @ -922,6 +923,11 @@ public class MockHttpServletRequest implements HttpServletRequest { | ||||||
| 
 | 
 | ||||||
| 	public void setCookies(Cookie... cookies) { | 	public void setCookies(Cookie... cookies) { | ||||||
| 		this.cookies = 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 | 	@Override | ||||||
|  | @ -945,10 +951,11 @@ public class MockHttpServletRequest implements HttpServletRequest { | ||||||
| 	 * @see #getDateHeader | 	 * @see #getDateHeader | ||||||
| 	 */ | 	 */ | ||||||
| 	public void addHeader(String name, Object value) { | 	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()); | 			setContentType(value.toString()); | ||||||
| 		} | 		} | ||||||
| 		else { | 		else { | ||||||
|  | 			this.cookieHeaderSet = HttpHeaders.COOKIE.equalsIgnoreCase(name); | ||||||
| 			doAddHeaderValue(name, value, false); | 			doAddHeaderValue(name, value, false); | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | @ -37,9 +37,11 @@ import javax.servlet.ServletOutputStream; | ||||||
| import javax.servlet.http.Cookie; | import javax.servlet.http.Cookie; | ||||||
| import javax.servlet.http.HttpServletResponse; | import javax.servlet.http.HttpServletResponse; | ||||||
| 
 | 
 | ||||||
|  | import org.springframework.http.HttpHeaders; | ||||||
| import org.springframework.http.MediaType; | import org.springframework.http.MediaType; | ||||||
| import org.springframework.util.Assert; | import org.springframework.util.Assert; | ||||||
| import org.springframework.util.LinkedCaseInsensitiveMap; | import org.springframework.util.LinkedCaseInsensitiveMap; | ||||||
|  | import org.springframework.util.StringUtils; | ||||||
| import org.springframework.web.util.WebUtils; | 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 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 String DATE_FORMAT = "EEE, dd MMM yyyy HH:mm:ss zzz"; | ||||||
| 
 | 
 | ||||||
| 	private static final TimeZone GMT = TimeZone.getTimeZone("GMT"); | 	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 final List<Cookie> cookies = new ArrayList<>(); | ||||||
| 
 | 
 | ||||||
|  | 	private boolean cookieHeaderSet; | ||||||
|  | 
 | ||||||
| 	private final Map<String, HeaderValueHolder> headers = new LinkedCaseInsensitiveMap<>(); | 	private final Map<String, HeaderValueHolder> headers = new LinkedCaseInsensitiveMap<>(); | ||||||
| 
 | 
 | ||||||
| 	private int status = HttpServletResponse.SC_OK; | 	private int status = HttpServletResponse.SC_OK; | ||||||
|  | @ -168,7 +166,7 @@ public class MockHttpServletResponse implements HttpServletResponse { | ||||||
| 			if (!this.contentType.toLowerCase().contains(CHARSET_PREFIX) && this.charset) { | 			if (!this.contentType.toLowerCase().contains(CHARSET_PREFIX) && this.charset) { | ||||||
| 				sb.append(";").append(CHARSET_PREFIX).append(this.characterEncoding); | 				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 | 	@Override | ||||||
| 	public void setContentLength(int contentLength) { | 	public void setContentLength(int contentLength) { | ||||||
| 		this.contentLength = contentLength; | 		this.contentLength = contentLength; | ||||||
| 		doAddHeaderValue(CONTENT_LENGTH_HEADER, contentLength, true); | 		doAddHeaderValue(HttpHeaders.CONTENT_LENGTH, contentLength, true); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	public int getContentLength() { | 	public int getContentLength() { | ||||||
|  | @ -218,7 +216,7 @@ public class MockHttpServletResponse implements HttpServletResponse { | ||||||
| 	@Override | 	@Override | ||||||
| 	public void setContentLengthLong(long contentLength) { | 	public void setContentLengthLong(long contentLength) { | ||||||
| 		this.contentLength = contentLength; | 		this.contentLength = contentLength; | ||||||
| 		doAddHeaderValue(CONTENT_LENGTH_HEADER, contentLength, true); | 		doAddHeaderValue(HttpHeaders.CONTENT_LENGTH, contentLength, true); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	public long getContentLengthLong() { | 	public long getContentLengthLong() { | ||||||
|  | @ -322,6 +320,36 @@ public class MockHttpServletResponse implements HttpServletResponse { | ||||||
| 	public void addCookie(Cookie cookie) { | 	public void addCookie(Cookie cookie) { | ||||||
| 		Assert.notNull(cookie, "Cookie must not be null"); | 		Assert.notNull(cookie, "Cookie must not be null"); | ||||||
| 		this.cookies.add(cookie); | 		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() { | 	public Cookie[] getCookies() { | ||||||
|  | @ -466,13 +494,13 @@ public class MockHttpServletResponse implements HttpServletResponse { | ||||||
| 	public void sendRedirect(String url) throws IOException { | 	public void sendRedirect(String url) throws IOException { | ||||||
| 		Assert.state(!isCommitted(), "Cannot send redirect - response is already committed"); | 		Assert.state(!isCommitted(), "Cannot send redirect - response is already committed"); | ||||||
| 		Assert.notNull(url, "Redirect URL must not be null"); | 		Assert.notNull(url, "Redirect URL must not be null"); | ||||||
| 		setHeader(LOCATION_HEADER, url); | 		setHeader(HttpHeaders.LOCATION, url); | ||||||
| 		setStatus(HttpServletResponse.SC_MOVED_TEMPORARILY); | 		setStatus(HttpServletResponse.SC_MOVED_TEMPORARILY); | ||||||
| 		setCommitted(true); | 		setCommitted(true); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	public String getRedirectedUrl() { | 	public String getRedirectedUrl() { | ||||||
| 		return getHeader(LOCATION_HEADER); | 		return getHeader(HttpHeaders.LOCATION); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	@Override | 	@Override | ||||||
|  | @ -505,11 +533,13 @@ public class MockHttpServletResponse implements HttpServletResponse { | ||||||
| 
 | 
 | ||||||
| 	@Override | 	@Override | ||||||
| 	public void setHeader(String name, String value) { | 	public void setHeader(String name, String value) { | ||||||
|  | 		this.cookieHeaderSet = HttpHeaders.SET_COOKIE.equalsIgnoreCase(name); | ||||||
| 		setHeaderValue(name, value); | 		setHeaderValue(name, value); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	@Override | 	@Override | ||||||
| 	public void addHeader(String name, String value) { | 	public void addHeader(String name, String value) { | ||||||
|  | 		this.cookieHeaderSet = HttpHeaders.SET_COOKIE.equalsIgnoreCase(name); | ||||||
| 		addHeaderValue(name, value); | 		addHeaderValue(name, value); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | @ -538,11 +568,11 @@ public class MockHttpServletResponse implements HttpServletResponse { | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	private boolean setSpecialHeader(String name, Object value) { | 	private boolean setSpecialHeader(String name, Object value) { | ||||||
| 		if (CONTENT_TYPE_HEADER.equalsIgnoreCase(name)) { | 		if (HttpHeaders.CONTENT_TYPE.equalsIgnoreCase(name)) { | ||||||
| 			setContentType(value.toString()); | 			setContentType(value.toString()); | ||||||
| 			return true; | 			return true; | ||||||
| 		} | 		} | ||||||
| 		else if (CONTENT_LENGTH_HEADER.equalsIgnoreCase(name)) { | 		else if (HttpHeaders.CONTENT_LENGTH.equalsIgnoreCase(name)) { | ||||||
| 			setContentLength(value instanceof Number ? ((Number) value).intValue() : | 			setContentLength(value instanceof Number ? ((Number) value).intValue() : | ||||||
| 					Integer.parseInt(value.toString())); | 					Integer.parseInt(value.toString())); | ||||||
| 			return true; | 			return true; | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue