[ http://issues.apache.org/jira/browse/XMLRPC-79?page=all ]
Inaki updated XMLRPC-79: ------------------------ Attachment: MyXmlRpcClient.java This file is the implementation of a dummy XML-RPC Client that reproduces the problem in my environment > 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 > Attachments: MyXmlRpcClient.java > > 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