Polish HtmlUnitRequestBuilder

This commit is contained in:
Sam Brannen 2015-08-08 00:17:55 +02:00
parent 93c07e76bc
commit f3da7b810b
1 changed files with 75 additions and 71 deletions

View File

@ -42,6 +42,7 @@ import org.springframework.test.web.servlet.RequestBuilder;
import org.springframework.test.web.servlet.SmartRequestBuilder; import org.springframework.test.web.servlet.SmartRequestBuilder;
import org.springframework.test.web.servlet.request.RequestPostProcessor; import org.springframework.test.web.servlet.request.RequestPostProcessor;
import org.springframework.util.Assert; import org.springframework.util.Assert;
import org.springframework.util.ObjectUtils;
import org.springframework.web.util.UriComponents; import org.springframework.web.util.UriComponents;
import org.springframework.web.util.UriComponentsBuilder; import org.springframework.web.util.UriComponentsBuilder;
@ -104,27 +105,27 @@ final class HtmlUnitRequestBuilder implements RequestBuilder, Mergeable {
String httpMethod = this.webRequest.getHttpMethod().name(); String httpMethod = this.webRequest.getHttpMethod().name();
UriComponents uriComponents = uriComponents(); UriComponents uriComponents = uriComponents();
MockHttpServletRequest result = new HtmlUnitMockHttpServletRequest(servletContext, httpMethod, MockHttpServletRequest request = new HtmlUnitMockHttpServletRequest(servletContext, httpMethod,
uriComponents.getPath()); uriComponents.getPath());
parent(result, this.parentBuilder); parent(request, this.parentBuilder);
result.setServerName(uriComponents.getHost()); // needs to be first for additional headers request.setServerName(uriComponents.getHost()); // needs to be first for additional headers
authType(result); authType(request);
result.setCharacterEncoding(charset); request.setCharacterEncoding(charset);
content(result, charset); content(request, charset);
contextPath(result, uriComponents); contextPath(request, uriComponents);
contentType(result); contentType(request);
cookies(result); cookies(request);
headers(result); headers(request);
locales(result); locales(request);
servletPath(uriComponents, result); servletPath(uriComponents, request);
params(result, uriComponents); params(request, uriComponents);
ports(uriComponents, result); ports(uriComponents, request);
result.setProtocol("HTTP/1.1"); request.setProtocol("HTTP/1.1");
result.setQueryString(uriComponents.getQuery()); request.setQueryString(uriComponents.getQuery());
result.setScheme(uriComponents.getScheme()); request.setScheme(uriComponents.getScheme());
pathInfo(uriComponents,result); pathInfo(uriComponents,request);
return postProcess(result); return postProcess(request);
} }
private MockHttpServletRequest postProcess(MockHttpServletRequest request) { private MockHttpServletRequest postProcess(MockHttpServletRequest request) {
@ -137,12 +138,12 @@ final class HtmlUnitRequestBuilder implements RequestBuilder, Mergeable {
return request; return request;
} }
private void parent(MockHttpServletRequest result, RequestBuilder parent) { private void parent(MockHttpServletRequest request, RequestBuilder parent) {
if (parent == null) { if (parent == null) {
return; return;
} }
MockHttpServletRequest parentRequest = parent.buildRequest(result.getServletContext()); MockHttpServletRequest parentRequest = parent.buildRequest(request.getServletContext());
// session // session
HttpSession parentSession = parentRequest.getSession(false); HttpSession parentSession = parentRequest.getSession(false);
@ -151,7 +152,7 @@ final class HtmlUnitRequestBuilder implements RequestBuilder, Mergeable {
while (attrNames.hasMoreElements()) { while (attrNames.hasMoreElements()) {
String attrName = attrNames.nextElement(); String attrName = attrNames.nextElement();
Object attrValue = parentSession.getAttribute(attrName); Object attrValue = parentSession.getAttribute(attrName);
result.getSession().setAttribute(attrName, attrValue); request.getSession().setAttribute(attrName, attrValue);
} }
} }
@ -162,7 +163,7 @@ final class HtmlUnitRequestBuilder implements RequestBuilder, Mergeable {
Enumeration<String> attrValues = parentRequest.getHeaders(attrName); Enumeration<String> attrValues = parentRequest.getHeaders(attrName);
while (attrValues.hasMoreElements()) { while (attrValues.hasMoreElements()) {
String attrValue = attrValues.nextElement(); String attrValue = attrValues.nextElement();
result.addHeader(attrName, attrValue); request.addHeader(attrName, attrValue);
} }
} }
@ -171,20 +172,20 @@ final class HtmlUnitRequestBuilder implements RequestBuilder, Mergeable {
for (Map.Entry<String, String[]> parentParam : parentParams.entrySet()) { for (Map.Entry<String, String[]> parentParam : parentParams.entrySet()) {
String paramName = parentParam.getKey(); String paramName = parentParam.getKey();
String[] paramValues = parentParam.getValue(); String[] paramValues = parentParam.getValue();
result.addParameter(paramName, paramValues); request.addParameter(paramName, paramValues);
} }
// cookie // cookie
Cookie[] parentCookies = parentRequest.getCookies(); Cookie[] parentCookies = parentRequest.getCookies();
if (parentCookies != null) { if (!ObjectUtils.isEmpty(parentCookies)) {
result.setCookies(parentCookies); request.setCookies(parentCookies);
} }
// request attribute // request attribute
Enumeration<String> parentAttrNames = parentRequest.getAttributeNames(); Enumeration<String> parentAttrNames = parentRequest.getAttributeNames();
while (parentAttrNames.hasMoreElements()) { while (parentAttrNames.hasMoreElements()) {
String parentAttrName = parentAttrNames.nextElement(); String parentAttrName = parentAttrNames.nextElement();
result.setAttribute(parentAttrName, parentRequest.getAttribute(parentAttrName)); request.setAttribute(parentAttrName, parentRequest.getAttribute(parentAttrName));
} }
} }
@ -214,32 +215,32 @@ final class HtmlUnitRequestBuilder implements RequestBuilder, Mergeable {
} }
} }
private void content(MockHttpServletRequest result, String charset) { private void content(MockHttpServletRequest request, String charset) {
String requestBody = this.webRequest.getRequestBody(); String requestBody = this.webRequest.getRequestBody();
if (requestBody == null) { if (requestBody == null) {
return; return;
} }
try { try {
result.setContent(requestBody.getBytes(charset)); request.setContent(requestBody.getBytes(charset));
} }
catch (UnsupportedEncodingException e) { catch (UnsupportedEncodingException e) {
throw new RuntimeException(e); throw new RuntimeException(e);
} }
} }
private void contentType(MockHttpServletRequest result) { private void contentType(MockHttpServletRequest request) {
String contentType = header("Content-Type"); String contentType = header("Content-Type");
result.setContentType(contentType == null ? MediaType.ALL_VALUE.toString() : contentType); request.setContentType(contentType == null ? MediaType.ALL_VALUE.toString() : contentType);
} }
private void contextPath(MockHttpServletRequest result, UriComponents uriComponents) { private void contextPath(MockHttpServletRequest request, UriComponents uriComponents) {
if (this.contextPath == null) { if (this.contextPath == null) {
List<String> pathSegments = uriComponents.getPathSegments(); List<String> pathSegments = uriComponents.getPathSegments();
if (pathSegments.isEmpty()) { if (pathSegments.isEmpty()) {
result.setContextPath(""); request.setContextPath("");
} }
else { else {
result.setContextPath("/" + pathSegments.get(0)); request.setContextPath("/" + pathSegments.get(0));
} }
} }
else { else {
@ -247,14 +248,14 @@ final class HtmlUnitRequestBuilder implements RequestBuilder, Mergeable {
throw new IllegalArgumentException(uriComponents.getPath() + " should start with contextPath " throw new IllegalArgumentException(uriComponents.getPath() + " should start with contextPath "
+ this.contextPath); + this.contextPath);
} }
result.setContextPath(this.contextPath); request.setContextPath(this.contextPath);
} }
} }
private void cookies(MockHttpServletRequest result) { private void cookies(MockHttpServletRequest request) {
String cookieHeaderValue = header("Cookie");
Cookie[] parentCookies = result.getCookies();
List<Cookie> cookies = new ArrayList<Cookie>(); List<Cookie> cookies = new ArrayList<Cookie>();
String cookieHeaderValue = header("Cookie");
if (cookieHeaderValue != null) { if (cookieHeaderValue != null) {
StringTokenizer tokens = new StringTokenizer(cookieHeaderValue, "=;"); StringTokenizer tokens = new StringTokenizer(cookieHeaderValue, "=;");
while (tokens.hasMoreTokens()) { while (tokens.hasMoreTokens()) {
@ -264,29 +265,32 @@ final class HtmlUnitRequestBuilder implements RequestBuilder, Mergeable {
+ "'. Full cookie was " + cookieHeaderValue); + "'. Full cookie was " + cookieHeaderValue);
} }
String cookieValue = tokens.nextToken().trim(); String cookieValue = tokens.nextToken().trim();
processCookie(result, cookies, new Cookie(cookieName, cookieValue)); processCookie(request, cookies, new Cookie(cookieName, cookieValue));
} }
} }
Set<com.gargoylesoftware.htmlunit.util.Cookie> managedCookies = this.webClient.getCookies(this.webRequest.getUrl()); Set<com.gargoylesoftware.htmlunit.util.Cookie> managedCookies = this.webClient.getCookies(this.webRequest.getUrl());
for (com.gargoylesoftware.htmlunit.util.Cookie cookie : managedCookies) { for (com.gargoylesoftware.htmlunit.util.Cookie cookie : managedCookies) {
processCookie(result, cookies, new Cookie(cookie.getName(), cookie.getValue())); processCookie(request, cookies, new Cookie(cookie.getName(), cookie.getValue()));
} }
Cookie[] parentCookies = request.getCookies();
if (parentCookies != null) { if (parentCookies != null) {
for (Cookie cookie : parentCookies) { for (Cookie cookie : parentCookies) {
cookies.add(cookie); cookies.add(cookie);
} }
} }
if (!cookies.isEmpty()) {
result.setCookies(cookies.toArray(new Cookie[0])); if (!ObjectUtils.isEmpty(cookies)) {
request.setCookies(cookies.toArray(new Cookie[cookies.size()]));
} }
} }
private void processCookie(MockHttpServletRequest result, List<Cookie> cookies, Cookie cookie) { private void processCookie(MockHttpServletRequest request, List<Cookie> cookies, Cookie cookie) {
cookies.add(cookie); cookies.add(cookie);
if ("JSESSIONID".equals(cookie.getName())) { if ("JSESSIONID".equals(cookie.getName())) {
result.setRequestedSessionId(cookie.getValue()); request.setRequestedSessionId(cookie.getValue());
result.setSession(httpSession(result, cookie.getValue())); request.setSession(httpSession(request, cookie.getValue()));
} }
} }
@ -302,9 +306,9 @@ final class HtmlUnitRequestBuilder implements RequestBuilder, Mergeable {
return this.webRequest.getAdditionalHeaders().get(headerName); return this.webRequest.getAdditionalHeaders().get(headerName);
} }
private void headers(MockHttpServletRequest result) { private void headers(MockHttpServletRequest request) {
for (Entry<String, String> header : this.webRequest.getAdditionalHeaders().entrySet()) { for (Entry<String, String> header : this.webRequest.getAdditionalHeaders().entrySet()) {
result.addHeader(header.getKey(), header.getValue()); request.addHeader(header.getKey(), header.getValue());
} }
} }
@ -340,25 +344,25 @@ final class HtmlUnitRequestBuilder implements RequestBuilder, Mergeable {
request.getContextPath() + "/", null, request.isSecure(), true); request.getContextPath() + "/", null, request.isSecure(), true);
} }
private void locales(MockHttpServletRequest result) { private void locales(MockHttpServletRequest request) {
String locale = header("Accept-Language"); String locale = header("Accept-Language");
if (locale == null) { if (locale == null) {
result.addPreferredLocale(Locale.getDefault()); request.addPreferredLocale(Locale.getDefault());
} }
else { else {
String[] locales = locale.split(", "); String[] locales = locale.split(", ");
for (int i = locales.length - 1; i >= 0; i--) { for (int i = locales.length - 1; i >= 0; i--) {
result.addPreferredLocale(parseLocale(locales[i])); request.addPreferredLocale(parseLocale(locales[i]));
} }
} }
} }
private void params(MockHttpServletRequest result, UriComponents uriComponents) { private void params(MockHttpServletRequest request, UriComponents uriComponents) {
for (Entry<String, List<String>> values : uriComponents.getQueryParams().entrySet()) { for (Entry<String, List<String>> values : uriComponents.getQueryParams().entrySet()) {
String name = values.getKey(); String name = values.getKey();
for (String value : values.getValue()) { for (String value : values.getValue()) {
try { try {
result.addParameter(name, URLDecoder.decode(value, "UTF-8")); request.addParameter(name, URLDecoder.decode(value, "UTF-8"));
} }
catch (UnsupportedEncodingException e) { catch (UnsupportedEncodingException e) {
throw new RuntimeException(e); throw new RuntimeException(e);
@ -366,7 +370,7 @@ final class HtmlUnitRequestBuilder implements RequestBuilder, Mergeable {
} }
} }
for (NameValuePair param : this.webRequest.getRequestParameters()) { for (NameValuePair param : this.webRequest.getRequestParameters()) {
result.addParameter(param.getName(), param.getValue()); request.addParameter(param.getName(), param.getValue());
} }
} }
@ -387,35 +391,35 @@ final class HtmlUnitRequestBuilder implements RequestBuilder, Mergeable {
return new Locale(language, country, qualifier); return new Locale(language, country, qualifier);
} }
private void pathInfo(UriComponents uriComponents, MockHttpServletRequest result) { private void pathInfo(UriComponents uriComponents, MockHttpServletRequest request) {
result.setPathInfo(null); request.setPathInfo(null);
} }
private void servletPath(MockHttpServletRequest result, String requestPath) { private void servletPath(MockHttpServletRequest request, String requestPath) {
String servletPath = requestPath.substring(result.getContextPath().length()); String servletPath = requestPath.substring(request.getContextPath().length());
if ("".equals(servletPath)) { if ("".equals(servletPath)) {
servletPath = null; servletPath = null;
} }
result.setServletPath(servletPath); request.setServletPath(servletPath);
} }
private void servletPath(UriComponents uriComponents, MockHttpServletRequest result) { private void servletPath(UriComponents uriComponents, MockHttpServletRequest request) {
if ("".equals(result.getPathInfo())) { if ("".equals(request.getPathInfo())) {
result.setPathInfo(null); request.setPathInfo(null);
} }
servletPath(result, uriComponents.getPath()); servletPath(request, uriComponents.getPath());
} }
private void ports(UriComponents uriComponents, MockHttpServletRequest result) { private void ports(UriComponents uriComponents, MockHttpServletRequest request) {
int serverPort = uriComponents.getPort(); int serverPort = uriComponents.getPort();
result.setServerPort(serverPort); request.setServerPort(serverPort);
if (serverPort == -1) { if (serverPort == -1) {
int portConnection = this.webRequest.getUrl().getDefaultPort(); int portConnection = this.webRequest.getUrl().getDefaultPort();
result.setLocalPort(serverPort); request.setLocalPort(serverPort);
result.setRemotePort(portConnection); request.setRemotePort(portConnection);
} }
else { else {
result.setRemotePort(serverPort); request.setRemotePort(serverPort);
} }
} }
@ -457,8 +461,8 @@ final class HtmlUnitRequestBuilder implements RequestBuilder, Mergeable {
} }
public HttpSession getSession(boolean create) { public HttpSession getSession(boolean create) {
HttpSession result = super.getSession(false); HttpSession session = super.getSession(false);
if (result == null && create) { if (session == null && create) {
HtmlUnitMockHttpSession newSession = new HtmlUnitMockHttpSession(this); HtmlUnitMockHttpSession newSession = new HtmlUnitMockHttpSession(this);
setSession(newSession); setSession(newSession);
newSession.setNew(true); newSession.setNew(true);
@ -467,9 +471,9 @@ final class HtmlUnitRequestBuilder implements RequestBuilder, Mergeable {
HtmlUnitRequestBuilder.this.sessions.put(sessionid, newSession); HtmlUnitRequestBuilder.this.sessions.put(sessionid, newSession);
} }
addSessionCookie(this, sessionid); addSessionCookie(this, sessionid);
result = newSession; session = newSession;
} }
return result; return session;
} }
public HttpSession getSession() { public HttpSession getSession() {