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.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<String> 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<String, String[]> 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<String> 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<String> 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<Cookie> cookies = new ArrayList<Cookie>();
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<com.gargoylesoftware.htmlunit.util.Cookie> 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<Cookie> cookies, Cookie cookie) {
private void processCookie(MockHttpServletRequest request, List<Cookie> 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<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);
}
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<String, List<String>> 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() {