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