org.apache.xmlrpc.CommonsXmlRpcTransport.java Source code

Java tutorial

Introduction

Here is the source code for org.apache.xmlrpc.CommonsXmlRpcTransport.java

Source

/*
 * Copyright 1999,2005 The Apache Software Foundation.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *      http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.apache.xmlrpc;

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;

/**
 * Implementor of the XmlRpcTransport interface using the Apache
 * Commons HttpClient library v2.0 available at
 * http://jakarta.apache.org/commons/httpclient/
 *
 * Note: <b>Currently this transport is not thread safe</b>
 *
 * @author <a href="mailto:rhoegg@isisnetworks.net">Ryan Hoegg</a>
 * @version $Id: CommonsXmlRpcTransport.java,v 1.7 2005/04/28 09:05:06 dlr Exp $
 * @since 2.0
 */
public class CommonsXmlRpcTransport implements XmlRpcTransport {

    protected PostMethod method;

    /** Creates a new instance of CommonsXmlRpcTransport */
    public CommonsXmlRpcTransport(URL url, HttpClient client) {
        this.url = url;
        if (client == null) {
            HttpClient newClient = new HttpClient();
            this.client = newClient;
        } else {
            this.client = client;
        }
    }

    public CommonsXmlRpcTransport(URL url) {
        this(url, null);
    }

    private URL url;
    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);

        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);

        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);
    }

    /**
     * Releases connection resources.
     *
     * @exception XmlRpcClientException
     */
    public void endClientRequest() throws XmlRpcClientException {
        method.releaseConnection();
    }
}