package com.grendelscan.commons.http; import org.apache.http.Header; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.ProtocolVersion; import org.apache.http.StatusLine; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.ByteArrayEntity; import org.apache.http.message.BasicHeader; import org.apache.http.message.BasicHttpResponse; import org.apache.http.message.BasicStatusLine; public class HttpCloner { /** * This will always return a BasicHeader. If you need a BufferedHeader, do it yourself * * @param header * @return */ public static Header clone(final Header header) { return new BasicHeader(header.getName(), header.getValue()); } /** * This isn't perfect. Some fields can't be obtained, such as releaseTrigger. HttpParams is reused not cloned * * @param get * @return */ public static HttpGet clone(final HttpGet get) { HttpGet newGet = new HttpGet(get.getURI()); for (Header header : get.getAllHeaders()) { newGet.addHeader(HttpCloner.clone(header)); } newGet.setParams(get.getParams()); return newGet; } // /** // * This isn't perfect. Some fields can't be obtained, such as releaseTrigger. // * HttpParams is reused, not cloned. // * @param request // * @return // */ // public static HttpRequest clone(HttpUriRequest request, byte[] requestBody) // { // HttpRequest clone = HttpRequestFactory.makeRequest(request.getMethod(), URI.create(request.getURI().toASCIIString()), request.getParams(), null, null); // for (Header header: request.getAllHeaders()) // { // clone.addHeader(HttpCloner.clone(header)); // } // if (request instanceof HttpEntityEnclosingRequest) // { // // } // return null; // HttpUriRequest clone = HttpRequestFactory. // HttpGet newGet = new HttpGet(get.getURI()); // for (Header header: get.getAllHeaders()) // { // newGet.addHeader(HttpCloner.clone(header)); // } // // newGet.setParams(get.getParams()); // // // return newGet; // } /** * This cannot properly clone the entity body. If the entity is repeatable, it will be reused (not copied). Otherwise, you get a blank entity. I hope to improve/fix this some day. * * @param post * @return */ public static HttpPost clone(final HttpPost post, final HttpEntity entity) { HttpPost clone = new HttpPost(post.getURI()); for (Header header : post.getAllHeaders()) { clone.addHeader(HttpCloner.clone(header)); } clone.setParams(post.getParams()); clone.setEntity(entity); return clone; } public static HttpResponse clone(final HttpResponse response, final byte responseBody[]) { HttpResponse clone = new BasicHttpResponse(clone(response.getStatusLine())); clone.setParams(response.getParams()); if (responseBody != null) { ByteArrayEntity entity = new ByteArrayEntity(responseBody); clone.setEntity(entity); } for (Header header : response.getAllHeaders()) { clone.addHeader(clone(header)); } return clone; } public static ProtocolVersion clone(final ProtocolVersion version) { ProtocolVersion newVersion = new ProtocolVersion(version.getProtocol(), version.getMajor(), version.getMinor()); return newVersion; } public static StatusLine clone(final StatusLine statusLine) { StatusLine newStatusLine = new BasicStatusLine(clone(statusLine.getProtocolVersion()), statusLine.getStatusCode(), statusLine.getReasonPhrase()); return newStatusLine; } }