/******************************************************************************* * Copyright (c) 2011 Subgraph. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Subgraph - initial API and implementation ******************************************************************************/ package com.subgraph.vega.internal.model.requests; import java.io.IOException; import org.apache.http.Header; import org.apache.http.HttpEntity; import org.apache.http.HttpEntityEnclosingRequest; import org.apache.http.HttpMessage; import org.apache.http.HttpRequest; import org.apache.http.HttpResponse; import org.apache.http.message.BasicHeader; import org.apache.http.message.BasicHttpRequest; import org.apache.http.util.EntityUtils; import com.db4o.ObjectContainer; public class HttpMessageCloner { private final ObjectContainer database; HttpMessageCloner(ObjectContainer database) { this.database = database; } HttpRequest copyRequest(HttpRequest request) { if(request instanceof HttpEntityEnclosingRequest) { return copyEntityEnclosingRequest((HttpEntityEnclosingRequest) request); } else { return copyBasicRequest(request); } } HttpResponse copyResponse(HttpResponse response) { final HttpEntity e = copyEntity(response.getEntity()); final RequestLogResponse r = new RequestLogResponse(database, response.getStatusLine(), entityToDatabaseId(e)); copyHeaders(response, r); return r; } private HttpRequest copyEntityEnclosingRequest(HttpEntityEnclosingRequest request) { final HttpEntity e = copyEntity(request.getEntity()); final RequestLogEntityEnclosingRequest r = new RequestLogEntityEnclosingRequest(database, request.getRequestLine(), entityToDatabaseId(e)); copyHeaders(request, r); return r; } private HttpRequest copyBasicRequest(HttpRequest request) { if(request == null) { return null; } final HttpRequest r = new BasicHttpRequest(request.getRequestLine()); copyHeaders(request, r); return r; } private static void copyHeaders(HttpMessage from, HttpMessage to) { for(Header h: from.getAllHeaders()) { to.addHeader(new BasicHeader(h.getName(), h.getValue())); } } private long entityToDatabaseId(HttpEntity entity) { if(entity == null) { return 0; } database.ext().store(entity); return database.ext().getID(entity); } private HttpEntity copyEntity(HttpEntity entity) { try { if(entity == null) { return null; } final byte[] content = EntityUtils.toByteArray(entity); return new RequestLogEntity(content, entity.getContentType(), entity.getContentEncoding()); } catch (IOException e) { return null; } } }