diff --git a/inproctester-htmlunit/src/main/java/com/thoughtworks/inproctester/htmlunit/HtmlUnitInprocRequest.java b/inproctester-htmlunit/src/main/java/com/thoughtworks/inproctester/htmlunit/HtmlUnitInprocRequest.java new file mode 100644 index 0000000..57a1e98 --- /dev/null +++ b/inproctester-htmlunit/src/main/java/com/thoughtworks/inproctester/htmlunit/HtmlUnitInprocRequest.java @@ -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 headers = new HashMap(); + + 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 getHeaderNames() { + return headers.keySet(); + } + + @Override + public void addHeader(String headerName, String header) { + headers.put(headerName, header); + } +} diff --git a/inproctester-htmlunit/src/main/java/com/thoughtworks/inproctester/htmlunit/HttpTesterAdaptor.java b/inproctester-htmlunit/src/main/java/com/thoughtworks/inproctester/htmlunit/HttpTesterAdaptor.java index b4a9523..c301e23 100644 --- a/inproctester-htmlunit/src/main/java/com/thoughtworks/inproctester/htmlunit/HttpTesterAdaptor.java +++ b/inproctester-htmlunit/src/main/java/com/thoughtworks/inproctester/htmlunit/HttpTesterAdaptor.java @@ -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 { @@ -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); } + } diff --git a/inproctester-htmlunit/src/main/java/com/thoughtworks/inproctester/htmlunit/InProcessWebConnection.java b/inproctester-htmlunit/src/main/java/com/thoughtworks/inproctester/htmlunit/InProcessWebConnection.java index ec60b41..c165108 100644 --- a/inproctester-htmlunit/src/main/java/com/thoughtworks/inproctester/htmlunit/InProcessWebConnection.java +++ b/inproctester-htmlunit/src/main/java/com/thoughtworks/inproctester/htmlunit/InProcessWebConnection.java @@ -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; @@ -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()) { @@ -80,7 +81,7 @@ private void removeCookie(CookieManager cookieManager, String cookieName) { } } - private void addCookiesToRequest(HttpTester httpTester) { + private void addCookiesToRequest(InProcRequest httpTester) { Set cookies = cookieManager.getCookies(); if (!cookies.isEmpty()) { List cookieStrings = new ArrayList(); diff --git a/inproctester-jersey/src/main/java/com/thoughtworks/inproctester/jersey/InPocessClientHandler.java b/inproctester-jersey/src/main/java/com/thoughtworks/inproctester/jersey/InPocessClientHandler.java index 694c412..d617bdc 100644 --- a/inproctester-jersey/src/main/java/com/thoughtworks/inproctester/jersey/InPocessClientHandler.java +++ b/inproctester-jersey/src/main/java/com/thoughtworks/inproctester/jersey/InPocessClientHandler.java @@ -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; @@ -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 { @@ -80,14 +65,6 @@ private byte[] getContent(HttpTester cResponse) throws UnsupportedEncodingExcept return contentString.getBytes(cResponse.getCharacterEncoding()); } - private void writeOutBoundHeaders(MultivaluedMap headers, HttpTester uc) { - for (Map.Entry> 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(); @@ -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 headers = new HashMap(); + 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 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 asMap(MultivaluedMap headers) { + HashMap map = new HashMap(); + for (Map.Entry> 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); + } + } + + } } diff --git a/inproctester-jetty/src/main/java/com/thoughtworks/inproctester/jetty/HttpAppTester.java b/inproctester-jetty/src/main/java/com/thoughtworks/inproctester/jetty/HttpAppTester.java index baeae97..caf42c2 100644 --- a/inproctester-jetty/src/main/java/com/thoughtworks/inproctester/jetty/HttpAppTester.java +++ b/inproctester-jetty/src/main/java/com/thoughtworks/inproctester/jetty/HttpAppTester.java @@ -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; @@ -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); } } diff --git a/inproctester-jetty/src/main/java/com/thoughtworks/inproctester/jetty/HttpAppTesterExtensions.java b/inproctester-jetty/src/main/java/com/thoughtworks/inproctester/jetty/HttpAppTesterExtensions.java index c8c4385..1242bda 100644 --- a/inproctester-jetty/src/main/java/com/thoughtworks/inproctester/jetty/HttpAppTesterExtensions.java +++ b/inproctester-jetty/src/main/java/com/thoughtworks/inproctester/jetty/HttpAppTesterExtensions.java @@ -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; diff --git a/inproctester-jetty/src/main/java/com/thoughtworks/inproctester/jetty/InProcConnection.java b/inproctester-jetty/src/main/java/com/thoughtworks/inproctester/jetty/InProcConnection.java index e513dba..18b2c97 100644 --- a/inproctester-jetty/src/main/java/com/thoughtworks/inproctester/jetty/InProcConnection.java +++ b/inproctester-jetty/src/main/java/com/thoughtworks/inproctester/jetty/InProcConnection.java @@ -15,5 +15,5 @@ package com.thoughtworks.inproctester.jetty; public interface InProcConnection { - String getResponses(String rawRequests); + String getResponses(InProcRequest rawRequests); } diff --git a/inproctester-jetty/src/main/java/com/thoughtworks/inproctester/jetty/InProcRequest.java b/inproctester-jetty/src/main/java/com/thoughtworks/inproctester/jetty/InProcRequest.java new file mode 100644 index 0000000..14d3c9b --- /dev/null +++ b/inproctester-jetty/src/main/java/com/thoughtworks/inproctester/jetty/InProcRequest.java @@ -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 getHeaderNames(); + + void addHeader(String headerName, String header); +} diff --git a/inproctester-jetty/src/main/java/com/thoughtworks/inproctester/jetty/LocalConnection.java b/inproctester-jetty/src/main/java/com/thoughtworks/inproctester/jetty/LocalConnection.java index 49b3cd9..8441be5 100644 --- a/inproctester-jetty/src/main/java/com/thoughtworks/inproctester/jetty/LocalConnection.java +++ b/inproctester-jetty/src/main/java/com/thoughtworks/inproctester/jetty/LocalConnection.java @@ -16,18 +16,21 @@ import org.eclipse.jetty.io.ByteArrayBuffer; import org.eclipse.jetty.server.LocalConnector; +import org.eclipse.jetty.testing.HttpTester; import org.eclipse.jetty.util.StringUtil; +import java.io.IOException; + public class LocalConnection implements InProcConnection { - private LocalConnector connector; + private LocalConnector connector; + + public LocalConnection(LocalConnector connector) { + this.connector = connector; + } - public LocalConnection(LocalConnector connector) { - this.connector = connector; - } - @Override - public String getResponses(String rawRequests) { + private String getResponses(String rawRequests) { try { ByteArrayBuffer result = connector.getResponses(new ByteArrayBuffer(rawRequests, StringUtil.__UTF8), false); return result == null ? null : result.toString(StringUtil.__UTF8); @@ -38,4 +41,23 @@ public String getResponses(String rawRequests) { } } + @Override + public String getResponses(InProcRequest request) { + HttpTester httpTester = new HttpTester(); + httpTester.setMethod(request.getHttpMethod()); + httpTester.setURI(UrlHelper.getRequestPath(request.getUri())); + for (String headerName : request.getHeaderNames()) { + httpTester.addHeader(headerName, request.getHeader(headerName)); + } + + if ("POST".equals(request.getHttpMethod())) { + httpTester.setContent(request.getFormData()); + } + + try { + return getResponses(httpTester.generate()); + } catch (IOException e) { + throw new RuntimeException(e); + } + } } diff --git a/inproctester-resteasy/src/main/java/com/thoughtworks/inproctester/resteasy/InProcessClientExecutor.java b/inproctester-resteasy/src/main/java/com/thoughtworks/inproctester/resteasy/InProcessClientExecutor.java index bdabbb5..73a3ff2 100644 --- a/inproctester-resteasy/src/main/java/com/thoughtworks/inproctester/resteasy/InProcessClientExecutor.java +++ b/inproctester-resteasy/src/main/java/com/thoughtworks/inproctester/resteasy/InProcessClientExecutor.java @@ -2,7 +2,7 @@ import com.thoughtworks.inproctester.jetty.HttpAppTester; import com.thoughtworks.inproctester.jetty.HttpAppTesterExtensions; -import com.thoughtworks.inproctester.jetty.UrlHelper; +import com.thoughtworks.inproctester.jetty.InProcRequest; import org.eclipse.jetty.http.HttpException; import org.eclipse.jetty.testing.HttpTester; import org.jboss.resteasy.client.ClientExecutor; @@ -14,12 +14,14 @@ import javax.ws.rs.core.MultivaluedMap; import javax.ws.rs.core.UriBuilder; -import java.io.*; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.UnsupportedEncodingException; import java.net.URI; import java.util.ArrayList; import java.util.Enumeration; import java.util.List; -import java.util.Map; public class InProcessClientExecutor implements ClientExecutor { @@ -47,15 +49,9 @@ public ClientRequest createRequest(UriBuilder uriBuilder) { public ClientResponse execute(ClientRequest clientRequest) throws Exception { - final HttpTester testerRequest = new HttpTester(); - testerRequest.setMethod(clientRequest.getHttpMethod()); - URI requestUri = new URI(clientRequest.getUri()); - testerRequest.setURI(UrlHelper.getRequestPath(requestUri)); - testerRequest.addHeader("Host", UrlHelper.getRequestHost(requestUri)); - loadContent(clientRequest, testerRequest); - writeOutBoundHeaders(clientRequest.getHeaders(), testerRequest); + final InProcRequest testerRequest = new RestEasyClientInProcRequest(clientRequest); - final HttpTester testerResponse = HttpAppTesterExtensions.processRequest(routeToTesterApplication(requestUri), testerRequest); + final HttpTester testerResponse = HttpAppTesterExtensions.processRequest(routeToTesterApplication(testerRequest.getUri()), testerRequest); BaseClientResponse clientResponse = new BaseClientResponse(new BaseClientResponse.BaseClientResponseStreamFactory() { InputStream stream; @@ -90,23 +86,6 @@ private HttpAppTester routeToTesterApplication(URI requestUri) throws HttpExcept throw new HttpException(404, "Unknown Route: " + requestUri); } - private void loadContent(ClientRequest clientRequest, HttpTester testerRequest) throws IOException { - - if (clientRequest.getBody() != null && !clientRequest.getFormParameters().isEmpty()) - throw new RuntimeException("You cannot send both form parameters and an entity body"); - - if (!clientRequest.getFormParameters().isEmpty()) { - throw new UnsupportedOperationException("InProcessClientExecutpr doesn't support form parameters yet"); - } else if (clientRequest.getBody() != null) { - if ("GET".equals(clientRequest.getHttpMethod())) - throw new RuntimeException("A GET request cannot have a body."); - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - clientRequest.writeRequestBody(clientRequest.getHeadersAsObjects(), baos); - byte[] requestEntity = writeRequestEntity(clientRequest); - testerRequest.setHeader("Content-type", clientRequest.getBodyContentType().toString()); - testerRequest.setContent(new String(requestEntity, "UTF-8")); - } - } private byte[] getContent(HttpTester cResponse) throws UnsupportedEncodingException { String contentString = cResponse.getContent(); @@ -129,19 +108,5 @@ private MultivaluedMap extractHeaders(HttpTester httpTester) { return headers; } - private void writeOutBoundHeaders(MultivaluedMap headers, HttpTester uc) { - for (Map.Entry> header : headers.entrySet()) { - for (String v : header.getValue()) { - uc.addHeader(header.getKey(), v); - } - } - } - - - private byte[] writeRequestEntity(ClientRequest ro) throws IOException { - final ByteArrayOutputStream baos = new ByteArrayOutputStream(); - ro.writeRequestBody(ro.getHeadersAsObjects(), baos); - return baos.toByteArray(); - } } diff --git a/inproctester-resteasy/src/main/java/com/thoughtworks/inproctester/resteasy/RestEasyClientInProcRequest.java b/inproctester-resteasy/src/main/java/com/thoughtworks/inproctester/resteasy/RestEasyClientInProcRequest.java new file mode 100644 index 0000000..2589e82 --- /dev/null +++ b/inproctester-resteasy/src/main/java/com/thoughtworks/inproctester/resteasy/RestEasyClientInProcRequest.java @@ -0,0 +1,105 @@ +package com.thoughtworks.inproctester.resteasy; + +import com.thoughtworks.inproctester.jetty.InProcRequest; +import com.thoughtworks.inproctester.jetty.UrlHelper; +import org.jboss.resteasy.client.ClientRequest; + +import javax.ws.rs.core.MultivaluedMap; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.URI; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + +public class RestEasyClientInProcRequest implements InProcRequest { + private ClientRequest clientRequest; + private Map headers = new HashMap(); + + public RestEasyClientInProcRequest(ClientRequest clientRequest) { + this.clientRequest = clientRequest; + try { + headers.put("Host", UrlHelper.getRequestHost(new URI(clientRequest.getUri()))); + } catch (Exception e) { + throw new RuntimeException(e); + } + headers.put("Content-type", clientRequest.getBodyContentType().toString()); + headers.putAll(asMap(clientRequest.getHeaders())); + } + + @Override + public String getHttpMethod() { + return clientRequest.getHttpMethod(); + } + + @Override + public URI getUri() { + try { + return new URI(clientRequest.getUri()); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + @Override + public String getFormData() { + try { + return new String(writeRequestEntity(clientRequest), "UTF-8"); + } catch (UnsupportedEncodingException e) { + throw new RuntimeException(e); + } + } + + @Override + public String getHeader(String headerName) { + return headers.get(headerName); + } + + @Override + public Set getHeaderNames() { + return headers.keySet(); + } + + @Override + public void addHeader(String headerName, String header) { + headers.put(headerName, header); + } + + private Map asMap(MultivaluedMap headers) { + HashMap map = new HashMap(); + for (Map.Entry> header : headers.entrySet()) { + for (String v : header.getValue()) { + map.put(header.getKey(), v); + } + } + return map; + } + + + private byte[] writeRequestEntity(ClientRequest clientRequest) { + + if (clientRequest.getBody() != null && !clientRequest.getFormParameters().isEmpty()) + throw new RuntimeException("You cannot send both form parameters and an entity body"); + + if (!clientRequest.getFormParameters().isEmpty()) { + throw new UnsupportedOperationException("InProcessClientExecutpr doesn't support form parameters yet"); + } + + final ByteArrayOutputStream baos = new ByteArrayOutputStream(); + if (clientRequest.getBody() != null) { + if ("GET".equals(clientRequest.getHttpMethod())) + throw new RuntimeException("A GET request cannot have a body."); + + try { + clientRequest.writeRequestBody(clientRequest.getHeadersAsObjects(), baos); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + return baos.toByteArray(); + } + +}