Uploaded image for project: 'XML-RPC'
  1. XML-RPC
  2. XMLRPC-79

Problems when enabling gzip compression

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Closed
    • Major
    • Resolution: Fixed
    • 3.0a1
    • None
    • Releases
    • None
    • Linux Red Hat
      Java 1.4.2 and 1.5(1.5.0_06)
      Apache Tomcat 5.0.19, 5.5.9

    Description

      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

      Attachments

        1. MyXmlRpcClient.java
          3 kB
          Inaki Ortiz

        Activity

          People

            jochen@apache.org Jochen Wiedmann
            inaki Inaki Ortiz
            Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: