You are viewing a plain text version of this content. The canonical link for it is here.
Posted to xmlrpc-dev@ws.apache.org by hg...@apache.org on 2005/04/15 11:00:01 UTC
cvs commit: ws-xmlrpc/src/java/org/apache/xmlrpc CommonsXmlRpcTransport.java
hgomez 2005/04/15 02:00:01
Modified: src/java/org/apache/xmlrpc CommonsXmlRpcTransport.java
Log:
Add support for Gzip compression (reply AND/OR request)
Add basic authentification support
Revision Changes Path
1.4 +89 -4 ws-xmlrpc/src/java/org/apache/xmlrpc/CommonsXmlRpcTransport.java
Index: CommonsXmlRpcTransport.java
===================================================================
RCS file: /home/cvs/ws-xmlrpc/src/java/org/apache/xmlrpc/CommonsXmlRpcTransport.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- CommonsXmlRpcTransport.java 30 Mar 2005 11:19:18 -0000 1.3
+++ CommonsXmlRpcTransport.java 15 Apr 2005 09:00:01 -0000 1.4
@@ -56,13 +56,19 @@
*/
import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.io.IOException;
import java.net.URL;
+import java.util.zip.GZIPInputStream;
+import java.util.zip.GZIPOutputStream;
+
+import org.apache.commons.httpclient.Credentials;
import org.apache.commons.httpclient.Header;
import org.apache.commons.httpclient.HostConfiguration;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.URI;
+import org.apache.commons.httpclient.UsernamePasswordCredentials;
import org.apache.commons.httpclient.methods.PostMethod;
/**
@@ -105,32 +111,111 @@
private HttpClient client;
private final Header userAgentHeader = new Header("User-Agent", XmlRpc.version);
private boolean http11 = false; // defaults to HTTP 1.0
+ private boolean gzip = false;
+ private boolean rgzip = false;
+ private Credentials creds;
public InputStream sendXmlRpc(byte[] request) throws IOException, XmlRpcClientException
{
method = new PostMethod(url.toString());
method.setHttp11(http11);
method.setRequestHeader(new Header("Content-Type", "text/xml"));
+
+ if (rgzip)
+ method.setRequestHeader(new Header("Content-Encoding", "gzip"));
+
+ if (gzip)
+ method.setRequestHeader(new Header("Accept-Encoding", "gzip"));
+
method.setRequestHeader(userAgentHeader);
- // TODO: authentication not implemented yet
- method.setRequestBody(new ByteArrayInputStream(request));
+
+ if (rgzip)
+ {
+ ByteArrayOutputStream lBo = new ByteArrayOutputStream();
+ GZIPOutputStream lGzo = new GZIPOutputStream(lBo);
+ lGzo.write(request);
+ lGzo.finish();
+ lGzo.close();
+ byte[] lArray = lBo.toByteArray();
+ method.setRequestBody(new ByteArrayInputStream(lArray));
+ method.setRequestContentLength(-1);
+ }
+ else
+ method.setRequestBody(new ByteArrayInputStream(request));
+
URI hostURI = new URI(url.toString());
HostConfiguration hostConfig = new HostConfiguration();
hostConfig.setHost(hostURI);
client.executeMethod(hostConfig, method);
- return method.getResponseBodyAsStream();
+
+ boolean lgzipo = false;
+
+ Header lHeader = method.getResponseHeader( "Content-Encoding" );
+ if ( lHeader != null ) {
+ String lValue = lHeader.getValue();
+ if ( lValue != null )
+ lgzipo = (lValue.indexOf( "gzip" ) >= 0);
+ }
+
+ if (lgzipo)
+ return( new GZIPInputStream( method.getResponseBodyAsStream() ) );
+ else
+ return method.getResponseBodyAsStream();
}
+ /**
+ * Make use of HTTP 1.1
+ *
+ * @param http11 HTTP 1.1 will be used if http11 is true
+ */
public void setHttp11(boolean http11)
{
this.http11 = http11;
}
+ /**
+ * Transport make use of the 'Accept-Encoding: gzip', so compliant HTTP servers
+ * could return HTTP reply compressed with gzip
+ *
+ * @param gzip Gzip compression will be used if gzip is true
+ */
+ public void setGzip(boolean gzip) {
+ this.gzip = gzip;
+ }
+
+ /**
+ * Transport make use of the 'Content-Encoding: gzip' and send HTTP request
+ * compressed with gzip : works only with some compliant HTTP servers like Apache 2.x
+ * using SetInputFilter DEFLATE.
+ *
+ * @param gzip Compress request with gzip if gzip is true
+ */
+ public void setRGzip(boolean gzip) {
+ this.rgzip = gzip;
+ }
+
+ /**
+ * Set the UserAgent for this client
+ *
+ * @param userAgent
+ */
public void setUserAgent(String userAgent)
{
userAgentHeader.setValue(userAgent);
}
+ /**
+ * Sets Authentication for this client, very basic for now user/password
+ *
+ * @param user
+ * @param password
+ */
+ public void setBasicAuthentication(String user, String password)
+ {
+ creds = new UsernamePasswordCredentials(user, password);
+ client.getState().setCredentials(null, null, creds);
+ }
+
public void endClientRequest()
throws XmlRpcClientException
{