ok here are the two classes which allow to compress the datas in a stream, I
shall
post it also to the developper mailing list
import java.io.IOException;
import org.apache.commons.httpclient.HttpConnection;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.HttpMethodBase;
import org.apache.commons.httpclient.HttpRecoverableException;
import org.apache.commons.httpclient.HttpState;
import org.apache.commons.httpclient.methods.PostMethod;
/**
* GZIPPostMethod
*
* <p>
* Titre : GZIPPostMethod
* </p>
*/
public class GZIPPostMethod
extends PostMethod {
/** Creates a new instance of GZIPAwarePostMethod */
public GZIPPostMethod() {
super();
}
/**
* Constructor specifying a URI.
*
* @param uri
* either an absolute or relative URI
*
* @since 1.0
*/
public GZIPPostMethod(String uri) {
super(uri);
}
/**
* Overrides method in [EMAIL PROTECTED] HttpMethodBase}.
*
* Notifies the server that we can process a GZIP-compressed response
before sending the request.
*
* @param state
* @param conn
*
* @return
* @throws HttpException
* @throws HttpRecoverableException
* @throws IOException
*
*/
public int execute(HttpState state,
HttpConnection conn) throws HttpException,
HttpRecoverableException, IOException {
// Tell the server that we can handle GZIP-compressed data in the
response body
addRequestHeader("Content-Encoding", "gzip");
return super.execute(state,
conn);
}
}
/**
* GZIPRequestEntity
*
* <p>
* Titre : GZIPRequestEntity
* </p>
*/
public class GZIPRequestEntity
implements RequestEntity {
/**
* Total de bytes transfere
*/
long mTotal = 0;
/**
* The content length will be calculated automatically. This implies
buffering of the content.
*/
public static final int CONTENT_LENGTH_AUTO = -2;
private long contentLength;
private InputStream content;
/** The buffered request body, if any. */
private byte[] buffer = null;
/** The content type */
private String contentType;
/**
* Creates a new InputStreamRequestEntity with the given content and a
content type of [EMAIL PROTECTED] #CONTENT_LENGTH_AUTO}.
*
* @param content
* The content to set.
*/
public GZIPRequestEntity(InputStream content) {
this(content,
null);
}
/**
* Creates a new InputStreamRequestEntity with the given content,
content type, and a content length of
* [EMAIL PROTECTED] #CONTENT_LENGTH_AUTO}.
*
* @param content
* The content to set.
* @param contentType
* The type of the content, or <code>null</code>.
*/
public GZIPRequestEntity(InputStream content,
String contentType) {
this(content,
CONTENT_LENGTH_AUTO,
contentType);
}
/**
* Creates a new InputStreamRequestEntity with the given content and
content length.
*
* @param content
* The content to set.
* @param contentLength
* The content size in bytes
*/
public GZIPRequestEntity(InputStream content,
long contentLength) {
this(content,
contentLength,
null);
}
/**
* Creates a new InputStreamRequestEntity with the given content,
content length, and content type.
*
* @param content
* The content to set.
* @param contentLength
* The content size in bytes
*
* @param contentType
* The type of the content, or <code>null</code>.
*/
public GZIPRequestEntity(InputStream content,
long contentLength,
String contentType) {
if (content == null) {
throw new IllegalArgumentException("The content cannot be
null");
}
this.content = content;
this.contentLength = contentLength;
this.contentType = contentType;
}
/*
* (non-Javadoc)
*
* @see
org.apache.commons.httpclient.methods.RequestEntity#getContentType()
*/
public String getContentType() {
return contentType;
}
/**
* Buffers request body input stream.
*/
private void bufferContent() {
if (this.buffer != null) {
// Already been buffered
return;
}
if (this.content != null) {
try {
ByteArrayOutputStream tmp = new ByteArrayOutputStream();
byte[] data = new byte[4096];
int l = 0;
while ((l = this.content.read(data)) >= 0) {
System.out.println("buffer content l :" + l);
tmp.write(data,
0,
l);
}
this.buffer = tmp.toByteArray();
this.content = null;
this.contentLength = buffer.length;
} catch (IOException e) {
sLogger.debug(e.getMessage(),
e);
this.buffer = null;
this.content = null;
this.contentLength = 0;
}
}
}
/**
* Tests if this method is repeatable. Only <code>true</code> if the
content has been buffered.
*
* @see #getContentLength()
*/
public boolean isRepeatable() {
return buffer != null;
}
/*
* (non-Javadoc)
*
* @see
org.apache.commons.httpclient.RequestEntity#writeRequest(java.io.OutputStream)
*/
public void writeRequest(OutputStream out) throws IOException {
GZIPOutputStream gzipOutputStream = new GZIPOutputStream(out);
try {
if (content != null) {
byte[] tmp = new byte[4096];
int nbreBytes = 0;
nbreBytes = content.read(tmp);
while (nbreBytes >= 0) {
gzipOutputStream.write(tmp,
0,
nbreBytes);
mTotal += nbreBytes;
nbreBytes = content.read(tmp);
}
gzipOutputStream.flush();
} else if (buffer != null) {
System.out.println("write buffer");
gzipOutputStream.write(buffer);
} else {
throw new IllegalStateException("Content must be set before
entity is written");
}
} finally {
if (gzipOutputStream != null) {
gzipOutputStream.close();
}
gzipOutputStream = null;
}
}
/**
* Gets the content length. If the content length has not been set, the
content will be buffered to determine the
* actual content length.
*/
public long getContentLength() {
if (contentLength == CONTENT_LENGTH_AUTO && buffer == null) {
bufferContent();
}
return contentLength;
}
/**
* @return Returns the content.
*/
public InputStream getContent() {
return content;
}
/**
* Retourne le nombre de bytes transfere
*
* @return Nombre de bytes transfere
*/
public long getNbreBytesTransfere() {
return mTotal;
}
}
Piece of code to use these classes :
mFluxFichierSource = new BufferedInputStream(new
FileInputStream(mFichierSource));
// ignorer les parties avant l'offset et lire celles qui sont apres
// l'offset
mFluxFichierSource.skip(mOffsetDebut);
GZIPPostMethod httppost = new GZIPPostMethod(mURL.toString());
mGZIPRequestEntity = new GZIPRequestEntity(mFluxFichierSource);
httppost.setRequestEntity(mGZIPRequestEntity);
//httppost.setRequestBody(mFluxFichierSource);
httppost.setContentChunked(true);
HttpClient client = new HttpClient();
client.executeMethod(httppost);
if (httppost.getStatusCode() == HttpStatus.SC_OK) {
sLogger.debug(httppost.getResponseBodyAsString());
} else {
sLogger.debug("Unexpected failure: " + httppost.getStatusLine()
.toString());
}
httppost.releaseConnection();
From: "Rick Herrick" <[EMAIL PROTECTED]>
Reply-To: "Jakarta Commons Users List" <[email protected]>
To: "'Jakarta Commons Users List'" <[email protected]>
Subject: RE: [HttpClient] : How I send a compressed stream using HttpClient
Date: Tue, 2 Aug 2005 07:07:17 -0700
Can you post the answer?
Rick Herrick
[EMAIL PROTECTED]
> -----Original Message-----
> From: Nicolas Maujean [mailto:[EMAIL PROTECTED]
> Sent: Tuesday, August 02, 2005 2:24 AM
> To: [email protected]
> Subject: RE: [HttpClient] : How I send a compressed stream using
> HttpClient
>
> ok you don't have to look for this I found the answer
>
> >From: "Nicolas Maujean" <[EMAIL PROTECTED]>
> >Reply-To: "Jakarta Commons Users List"
<[email protected]>
> >To: [email protected]
> >Subject: [HttpClient] : How I send a compressed stream using HttpClient
> >Date: Mon, 01 Aug 2005 11:15:57 +0000
> >
> >Hi,
> >
> >How I send a compressed stream using HttpClient ?
> >
> >thank you for your answer,
> >
> >Nicolas Maujean
> >
> >
> >
> >---------------------------------------------------------------------
> >To unsubscribe, e-mail: [EMAIL PROTECTED]
> >For additional commands, e-mail: [EMAIL PROTECTED]
> >
>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]