Debbie wrote:
I have a multipart request that I would like to gzip compress via a custom HttpClient (so it can be decompressed by apache via MOD deflate on the server side). I tried to just compress the files themselves but the apache server seems to want the entire body of the request compressed in order to decompress.

I’ve read a post by Oleg in 2008 that states this is easy to do and yet I’m not sure how to make this work using the RequestInterceptor going from client to server. Any pointers would be very appreciated. Thanks!
Deb


Try this:

---
public static void main(String[] args) throws Exception {

    HttpHost targetHost = new HttpHost("www.sometarget.com", 80, "http");
    DefaultHttpClient httpclient = new DefaultHttpClient();
    BasicHttpContext localcontext = new BasicHttpContext();

    HttpPost httppost = new HttpPost("/");
MultipartEntity reqentity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);
    reqentity.addPart("stuff", new StringBody("some stuff"));
    httppost.setEntity(new GzipCompressingEntity(reqentity));
HttpResponse response = httpclient.execute(targetHost, httppost, localcontext);

    System.out.println(response.getStatusLine());

    HttpEntity entity = response.getEntity();
    if (entity != null) {
        entity.consumeContent();
    }
}

static class GzipCompressingEntity extends HttpEntityWrapper {

    private static final String GZIP_CODEC = "gzip";

    public GzipCompressingEntity(final HttpEntity entity) {
        super(entity);
    }

    public Header getContentEncoding() {
        return new BasicHeader(HTTP.CONTENT_ENCODING, GZIP_CODEC);
    }

    public long getContentLength() {
        return -1;
    }

    public boolean isChunked() {
        // force content chunking
        return true;
    }

    public void writeTo(final OutputStream outstream) throws IOException {
        if (outstream == null) {
throw new IllegalArgumentException("Output stream may not be null");
        }
        GZIPOutputStream gzip = new GZIPOutputStream(outstream);
        InputStream in = wrappedEntity.getContent();
        byte[] tmp = new byte[2048];
        int l;
        while ((l = in.read(tmp)) != -1) {
            gzip.write(tmp, 0, l);
        }
        gzip.close();
    }

}

---

Hope this helps

Oleg

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to