Skip to content

Commit

Permalink
De-coupling from jetty HttpTester, introducing InProcRequest
Browse files Browse the repository at this point in the history
  • Loading branch information
aharin committed May 4, 2012
1 parent 5864f95 commit 3766a87
Show file tree
Hide file tree
Showing 11 changed files with 308 additions and 121 deletions.
@@ -0,0 +1,57 @@
package com.thoughtworks.inproctester.htmlunit;

import com.gargoylesoftware.htmlunit.WebRequest;
import com.thoughtworks.inproctester.jetty.InProcRequest;
import com.thoughtworks.inproctester.jetty.UrlHelper;

import java.net.URI;
import java.net.URISyntaxException;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

class HtmlUnitInProcRequest implements InProcRequest {
private WebRequest request;
private Map<String, String> headers = new HashMap<String, String>();

public HtmlUnitInProcRequest(WebRequest request) {
this.request = request;
headers.put("Host", UrlHelper.getRequestHost(request.getUrl()));
headers.put("Content-Type", request.getEncodingType().getName() + ";" + request.getCharset());
headers.putAll(request.getAdditionalHeaders());
}

@Override
public String getHttpMethod() {
return request.getHttpMethod().name();
}

@Override
public URI getUri() {
try {
return request.getUrl().toURI();
} catch (URISyntaxException e) {
throw new RuntimeException(e);
}
}

@Override
public String getFormData() {
return new UrlEncodedContent(request.getRequestParameters()).generateFormDataAsString();
}

@Override
public String getHeader(String headerName) {
return headers.get(headerName);
}

@Override
public Set<String> getHeaderNames() {
return headers.keySet();
}

@Override
public void addHeader(String headerName, String header) {
headers.put(headerName, header);
}
}
Expand Up @@ -14,18 +14,14 @@
*/
package com.thoughtworks.inproctester.htmlunit;

import com.gargoylesoftware.htmlunit.FormEncodingType;
import com.gargoylesoftware.htmlunit.HttpMethod;
import com.gargoylesoftware.htmlunit.WebRequest;
import com.gargoylesoftware.htmlunit.WebResponseData;
import com.gargoylesoftware.htmlunit.util.NameValuePair;
import com.thoughtworks.inproctester.jetty.UrlHelper;
import com.thoughtworks.inproctester.jetty.InProcRequest;
import org.eclipse.jetty.testing.HttpTester;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.*;

public class HttpTesterAdaptor {
static WebResponseData adaptResponse(HttpTester httpTester) throws IOException {
Expand All @@ -44,18 +40,8 @@ static WebResponseData adaptResponse(HttpTester httpTester) throws IOException {
return new WebResponseData(content.getBytes(httpTester.getCharacterEncoding()), httpTester.getStatus(), httpTester.getReason(), headers);
}

static HttpTester adaptRequest(WebRequest request) {
HttpTester httpTester = new HttpTester();
httpTester.setMethod(request.getHttpMethod().name());
httpTester.setURI(UrlHelper.getRequestPath(request.getUrl()));
httpTester.addHeader("Host", UrlHelper.getRequestHost(request.getUrl()));

if (request.getHttpMethod() == HttpMethod.POST) {
httpTester.setHeader("Content-Type", request.getEncodingType().getName());
if (request.getEncodingType() == FormEncodingType.URL_ENCODED) {
httpTester.setContent(new UrlEncodedContent(request.getRequestParameters()).generateFormDataAsString());
}
}
return httpTester;
static InProcRequest adaptRequest(WebRequest request) {
return new HtmlUnitInProcRequest(request);
}

}
Expand Up @@ -17,6 +17,7 @@
import com.gargoylesoftware.htmlunit.*;
import com.gargoylesoftware.htmlunit.util.Cookie;
import com.thoughtworks.inproctester.jetty.InProcConnection;
import com.thoughtworks.inproctester.jetty.InProcRequest;
import org.apache.commons.lang.StringUtils;
import org.eclipse.jetty.testing.HttpTester;

Expand All @@ -42,14 +43,14 @@ public WebResponse getResponse(WebRequest webRequest) throws IOException {
return new WebResponse(adaptResponse(processTesterRequest(adaptRequest(webRequest))), webRequest, 0);
}

private HttpTester processTesterRequest(HttpTester testerRequest) throws IOException {
addCookiesToRequest(testerRequest);
HttpTester testerResponse = processRequest(inProcConnection, testerRequest);
storeCookiesFromResponse(testerRequest, testerResponse);
private HttpTester processTesterRequest(InProcRequest inProcRequest) throws IOException {
addCookiesToRequest(inProcRequest);
HttpTester testerResponse = processRequest(inProcConnection, inProcRequest);
storeCookiesFromResponse(inProcRequest, testerResponse);
return testerResponse;
}

private void storeCookiesFromResponse(HttpTester testerRequest, HttpTester testerResponse) {
private void storeCookiesFromResponse(InProcRequest testerRequest, HttpTester testerResponse) {
String requestHostName = testerRequest.getHeader("Host").split(":", 1)[0];
Enumeration headerNames = testerResponse.getHeaderNames();
while (headerNames.hasMoreElements()) {
Expand Down Expand Up @@ -80,7 +81,7 @@ private void removeCookie(CookieManager cookieManager, String cookieName) {
}
}

private void addCookiesToRequest(HttpTester httpTester) {
private void addCookiesToRequest(InProcRequest httpTester) {
Set<Cookie> cookies = cookieManager.getCookies();
if (!cookies.isEmpty()) {
List<String> cookieStrings = new ArrayList<String>();
Expand Down
Expand Up @@ -14,22 +14,19 @@
*/
package com.thoughtworks.inproctester.jersey;

import com.sun.jersey.api.client.ClientHandlerException;
import com.sun.jersey.api.client.ClientRequest;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.TerminatingClientHandler;
import com.sun.jersey.api.client.*;
import com.sun.jersey.api.container.ContainerException;
import com.sun.jersey.core.header.InBoundHeaders;
import com.thoughtworks.inproctester.jetty.HttpAppTester;
import com.thoughtworks.inproctester.jetty.HttpAppTesterExtensions;
import com.thoughtworks.inproctester.jetty.InProcRequest;
import com.thoughtworks.inproctester.jetty.UrlHelper;
import org.eclipse.jetty.testing.HttpTester;

import javax.ws.rs.core.MultivaluedMap;
import java.io.*;
import java.util.Enumeration;
import java.util.List;
import java.util.Map;
import java.net.URI;
import java.util.*;

public class InPocessClientHandler extends TerminatingClientHandler {
private final HttpAppTester w;
Expand All @@ -38,20 +35,8 @@ public InPocessClientHandler(HttpAppTester appTester) {
this.w = appTester;
}


public ClientResponse handle(ClientRequest clientRequest) {
byte[] requestEntity = writeRequestEntity(clientRequest);

final HttpTester cRequest = new HttpTester();
cRequest.setMethod(clientRequest.getMethod());
cRequest.setURI(UrlHelper.getRequestPath(clientRequest.getURI()));
cRequest.addHeader("Host", UrlHelper.getRequestHost(clientRequest.getURI()));
try {
cRequest.setContent(new String(requestEntity, "UTF-8"));
} catch (UnsupportedEncodingException e) {
throw new ContainerException(e);
}
writeOutBoundHeaders(clientRequest.getHeaders(), cRequest);
final InProcRequest cRequest = new JerseyClientInprocRequest(clientRequest);

HttpTester cResponse;
try {
Expand Down Expand Up @@ -80,14 +65,6 @@ private byte[] getContent(HttpTester cResponse) throws UnsupportedEncodingExcept
return contentString.getBytes(cResponse.getCharacterEncoding());
}

private void writeOutBoundHeaders(MultivaluedMap<String, Object> headers, HttpTester uc) {
for (Map.Entry<String, List<Object>> e : headers.entrySet()) {
for (Object v : e.getValue()) {
uc.addHeader(e.getKey(), ClientRequest.getHeaderValue(v));
}
}
}

private InBoundHeaders getInBoundHeaders(HttpTester httpTester) {
InBoundHeaders headers = new InBoundHeaders();
Enumeration headerNames = httpTester.getHeaderNames();
Expand All @@ -102,22 +79,80 @@ private InBoundHeaders getInBoundHeaders(HttpTester httpTester) {
return headers;
}

private byte[] writeRequestEntity(ClientRequest ro) {
try {
final ByteArrayOutputStream baos = new ByteArrayOutputStream();
writeRequestEntity(ro, new RequestEntityWriterListener() {
class JerseyClientInprocRequest implements InProcRequest {
private Map<String, String> headers = new HashMap<String, String>();
private ClientRequest clientRequest;

public void onRequestEntitySize(long size) throws IOException {
}
public JerseyClientInprocRequest(ClientRequest clientRequest) {
this.clientRequest = clientRequest;
headers.put("Host", UrlHelper.getRequestHost(clientRequest.getURI()));
headers.putAll(asMap(clientRequest.getHeaders()));
}


@Override
public String getHttpMethod() {
return clientRequest.getMethod();
}

@Override
public URI getUri() {
return clientRequest.getURI();
}

@Override
public String getFormData() {
byte[] requestEntity = writeRequestEntity(clientRequest);

try {
return new String(requestEntity, "UTF-8");
} catch (UnsupportedEncodingException e) {
throw new ContainerException(e);
}
}

@Override
public String getHeader(String headerName) {
return headers.get(headerName);
}

@Override
public Set<String> getHeaderNames() {
return headers.keySet();
}

public OutputStream onGetOutputStream() throws IOException {
return baos;
@Override
public void addHeader(String headerName, String header) {
headers.put(headerName, header);
}

private Map<String, String> asMap(MultivaluedMap<String, Object> headers) {
HashMap<String, String> map = new HashMap<String, String>();
for (Map.Entry<String, List<Object>> e : headers.entrySet()) {
for (Object v : e.getValue()) {
map.put(e.getKey(), ClientRequest.getHeaderValue(v));
}
});
return baos.toByteArray();
} catch (IOException ex) {
throw new ClientHandlerException(ex);
}
return map;
}
}

private byte[] writeRequestEntity(ClientRequest ro) {
try {
final ByteArrayOutputStream baos = new ByteArrayOutputStream();
InPocessClientHandler.this.writeRequestEntity(ro, new RequestWriter.RequestEntityWriterListener() {

public void onRequestEntitySize(long size) throws IOException {
}

public OutputStream onGetOutputStream() throws IOException {
return baos;
}
});
return baos.toByteArray();
} catch (IOException ex) {
throw new ClientHandlerException(ex);
}
}

}
}
Expand Up @@ -14,14 +14,12 @@
*/
package com.thoughtworks.inproctester.jetty;

import org.eclipse.jetty.io.ByteArrayBuffer;
import org.eclipse.jetty.server.LocalConnector;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.handler.ErrorHandler;
import org.eclipse.jetty.servlet.FilterHolder;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;
import org.eclipse.jetty.util.StringUtil;
import org.eclipse.jetty.webapp.WebAppContext;

import javax.servlet.Filter;
Expand Down Expand Up @@ -129,7 +127,7 @@ public void stop() {
}

@Override
public String getResponses(String rawRequests) {
return localConnection.getResponses(rawRequests);
public String getResponses(InProcRequest inProcRequest) {
return localConnection.getResponses(inProcRequest);
}
}
Expand Up @@ -19,8 +19,8 @@
import java.io.IOException;

public class HttpAppTesterExtensions {
public static HttpTester processRequest(InProcConnection inProcConnection, HttpTester testerRequest) throws IOException {
String rawResponse = inProcConnection.getResponses(testerRequest.generate());
public static HttpTester processRequest(InProcConnection inProcConnection, InProcRequest testerRequest) throws IOException {
String rawResponse = inProcConnection.getResponses(testerRequest);
HttpTester testerResponse = new HttpTester();
testerResponse.parse(rawResponse);
return testerResponse;
Expand Down
Expand Up @@ -15,5 +15,5 @@
package com.thoughtworks.inproctester.jetty;

public interface InProcConnection {
String getResponses(String rawRequests);
String getResponses(InProcRequest rawRequests);
}
@@ -0,0 +1,18 @@
package com.thoughtworks.inproctester.jetty;

import java.net.URI;
import java.util.Set;

public interface InProcRequest {
String getHttpMethod();

URI getUri();

String getFormData();

String getHeader(String headerName);

Set<String> getHeaderNames();

void addHeader(String headerName, String header);
}

0 comments on commit 3766a87

Please sign in to comment.