Problems when enabling gzip compression
---------------------------------------

         Key: XMLRPC-79
         URL: http://issues.apache.org/jira/browse/XMLRPC-79
     Project: XML-RPC
        Type: Bug

  Components: Releases  
    Versions: 3.0a1    
 Environment: Linux Red Hat
Java 1.4.2 and 1.5(1.5.0_06)
Apache Tomcat 5.0.19, 5.5.9

    Reporter: Inaki


I am having problems when enabling the request/response compression
mode. I am using xmlrpc-3.0a1.jar for both my client and my server. In
the client I run the following:

       config = new XmlRpcClientConfigImpl();
       config.setServerURL(serverURL);
       // enables faster and memory saving streaming mode
       config.setContentLengthOptional(true); 
        // enable vendor extensions to allow compression, data types support ...
        config.setEnabledForExtensions(true);
        config.setGzipCompressing(true); // requests gzip compression
        config.setGzipRequesting(true);    // requests server to gzip response
                
        client = new XmlRpcClient();
        client.setConfig(config);  
        client.execute(...)      
        [...]

In the server I make use of the XmlRpcServlet class
(org.apache.xmlrpc.webserver package) embedded into Tomcat 5 and I have
set enabledForExtensions to true within the init parameters of the
servlet (web.xml file)

When I run a dummy request as it is described in the code above I get
the following exception:

org.apache.xmlrpc.XmlRpcException: Failed to parse XML-RPC request:
Content is not allowed in prolog.
at org.apache.xmlrpc.client.XmlRpcStreamTransport.readResponse
(XmlRpcStreamTransport.java:274)
at org.apache.xmlrpc.client.XmlRpcStreamTransport.sendRequest
(XmlRpcStreamTransport.java:216)
at org.apache.xmlrpc.client.XmlRpcClientWorker.execute
(XmlRpcClientWorker.java:53)
at org.apache.xmlrpc.client.XmlRpcClient.execute(XmlRpcClient.java:166)
at org.apache.xmlrpc.client.XmlRpcClient.execute(XmlRpcClient.java:136)
at org.apache.xmlrpc.client.XmlRpcClient.execute(XmlRpcClient.java:125)
at esavo.voql.xmlrpc.MyXmlRpcClient.execute(MyXmlRpcClient.java:54)
at esavo.voql.xmlrpc.MyXmlRpcClient.main(MyXmlRpcClient.java:74)

If I comment the gzip compression out, both on the request and the
response, my test works fine:

      config = new XmlRpcClientConfigImpl();
       config.setServerURL(serverURL);
       // enables faster and memory saving streaming mode
       config.setContentLengthOptional(true); 
        // enable vendor extensions to allow compression, data types support ...
        config.setEnabledForExtensions(true);

        client = new XmlRpcClient();
        client.setConfig(config);  
        client.execute(...)      
        [...]

The complete source code is the following:

1. Client Side
-------------------------
package esavo.voql.xmlrpc;

import java.net.URL;
import org.apache.xmlrpc.*;
import org.apache.xmlrpc.client.*;

/**
 * MyXmlRpcClient
 * @author Inaki Ortiz de Landaluce Saiz - ESAC/ESA - Madrid, Spain
 */
public class MyXmlRpcClient {
    
    /** XMLRpcClientConfig instance to specify serverURL, credentials ...etc */
    private XmlRpcClientConfigImpl config; 

    /** The XmlRpcClient itself */
    private XmlRpcClient client; 
    
    /**
     * Creates a new instance of MyXmlRpcClient
     */
    public MyXmlRpcClient(URL serverURL) {
        // Step 1: Instances the client configuration and sets some properties
        // N.B: This should be configurable through a xml or properties file
        
        config = new XmlRpcClientConfigImpl();
        config.setServerURL(serverURL);
        // enables faster and memory saving streaming mode
        config.setContentLengthOptional(true); 
        // enable vendor extensions to allow compression, data types support ...
        config.setEnabledForExtensions(true);
        // it works fine when the following two lines are commented 
        config.setGzipCompressing(true); // requests gzip compression
        config.setGzipRequesting(true);  // requests server to gzip response
                
        // Step 2: Instances the client and atttaches the configuration to it
        
        client = new XmlRpcClient();
        client.setConfig(config);        
        // sets the fastest transport factory. 
        // There are several transport factories available:
        //  XmlRpcSunHttpTransportFactory  - Uses default HTTP connection
        //  XmlRpcCommonsTransportFactory  - Jakarta commons, lower memory 
profile
        //  XmlRpcLiteHttpTransportFactory - Faster, does not support 
HTTP/1.1</ul>
        client.setTransportFactory(new XmlRpcLiteHttpTransportFactory(client)); 
       
    }
    
    /**
     * Executes an XML-RPC call
     * @param methodName The method being performed.
     * @param method The parameters.
     * @return The result object
     */
    public Object execute(String methodName, Object[] params) throws 
XmlRpcException {
        return client.execute(methodName, params);
    }
    
    /** 
     * Returns XmlRpcClient instance
     */
    public XmlRpcClient getClient() {
        return client;
    }
    
    public static void main(String[] args) {
        String serverStr = "http://localhost:8084/VOQL-server/servlet/xmlrpc";;
        try {
            URL serverURL = new URL(serverStr);
            MyXmlRpcClient client = new MyXmlRpcClient(serverURL);
            
            // full check disabled
            Object[] params = new Object[]{new Boolean(false)}; 
            Boolean result = (Boolean) client.execute("Status.check", params);  
          
            System.out.println("Result is " + result.toString());
        } catch (XmlRpcClientException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

2. Server Side
--------------------------

2.1  WAR configuration file (web.xml)
-------------------------------------------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; 
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd";>
    <servlet>
        <servlet-name>XmlRpcServlet</servlet-name>
        <servlet-class>org.apache.xmlrpc.webserver.XmlRpcServlet</servlet-class>
        <init-param>
            <param-name>enabledForExtensions</param-name>
            <param-value>true</param-value>
        </init-param>
        </servlet>
    <servlet-mapping>
        <servlet-name>XmlRpcServlet</servlet-name>
        <url-pattern>/servlet/xmlrpc</url-pattern>
    </servlet-mapping>
    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>
    <welcome-file-list>
        <welcome-file>
            index.jsp
        </welcome-file>
    </welcome-file-list>
</web-app>

2.2 Handler
-----------------------
package esavo.voql.server;

/**
 *
 * @author Inaki Ortiz de Landaluce Saiz - ESAC/ESA - Madrid, Spain
 */
public class Status {
    
    /** Creates a new instance of Status */
    public Status() {
    }
    
    public boolean check(boolean fullCheck) {
        // perform a full check on service availability. TBD       
        if(!fullCheck) return true;
        else return false;
    }
    
}

2.3 XmlRpcServlet.properties
----------------------------------------------------
Remote=org.apache.xmlrpc.test.BaseTest$Remote
Status=esavo.voql.server.Status


-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
   http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
   http://www.atlassian.com/software/jira

Reply via email to