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