Compression Handler
singular_droid Apr 1, 2005 8:30 AMHi! I'm trying to compress the response of my WS. This is the code of handler
import java.io.ByteArrayOutputStream;
import java.net.URL;
import java.util.zip.GZIPOutputStream;
import javax.xml.namespace.QName;
import javax.xml.rpc.handler.GenericHandler;
import org.apache.axis.Message;
import org.apache.log4j.Logger;
import org.apache.log4j.xml.DOMConfigurator;
public class CompressionHandler extends GenericHandler {
static private Logger logger = Logger.getLogger(CompressionHandler.class);
public QName[] getHeaders() {
return new QName[0];
}
public boolean handleResponse(org.apache.axis.MessageContext msgContext) {
try {
URL log4jConfig = CompressionHandler.class.getResource("log4j.xml");
DOMConfigurator.configure(log4jConfig);
logger.info("Logger initialized");
ByteArrayOutputStream bos = new ByteArrayOutputStream();
GZIPOutputStream gz = new GZIPOutputStream(bos);
Message msg = msgContext.getResponseMessage();
logger.info("length:"+msg.getContentLength());
gz.write(msg.getSOAPPartAsBytes());
gz.close();
bos.close();
Message msg2 = new Message(bos.toByteArray());
msgContext.setResponseMessage(msg2);
} catch (Exception e) {
e.printStackTrace();
}
return true;
}
public boolean handleRequest(org.apache.axis.MessageContext msgContext) {
try {
URL log4jConfig = CompressionHandler.class.getResource("log4j.xml");
DOMConfigurator.configure(log4jConfig);
logger.info("Logger initialized");
ByteArrayOutputStream bos = new ByteArrayOutputStream();
GZIPOutputStream gz = new GZIPOutputStream(bos);
Message msg = msgContext.getRequestMessage();
logger.info("length:"+msg.getContentLength());
gz.write(msg.getSOAPPartAsBytes());
gz.close();
bos.close();
Message msg2 = new Message(bos.toByteArray());
msgContext.setRequestMessage(msg2);
} catch (Exception e) {
e.printStackTrace();
}
return true;
}
public CompressionHandler() {
}
}This is the part of my webservices.xml:
<webservice-description> <webservice-description-name>HelloBeanService</webservice-description-name> <wsdl-file>META-INF/wsdl/hello.wsdl</wsdl-file> <jaxrpc-mapping-file>META-INF/mapping.xml</jaxrpc-mapping-file> <port-component> <port-component-name>HelloBean</port-component-name> <wsdl-port>HelloBeanEndpoint</wsdl-port> <service-endpoint-interface> ru.zenith.interfaces.HelloBeanEndpoint </service-endpoint-interface> <service-impl-bean> <ejb-link>HelloBean</ejb-link> </service-impl-bean> <handler> <handler-name>CompressionHandler</handler-name> <handler-class>ru.zenith.handlers.CompressionHandler</handler-class> </handler> </port-component> </webservice-description>
After deployment I've found this in server.log:
2005-04-01 17:01:33,984 DEBUG [org.jboss.webservice.server.InvokerProvider] Adding server side handler to service 'HelloBeanService': [class=ru.zenith.handlers.CompressionHandler,headers=[],config={}]
...
2005-04-01 17:01:34,015 DEBUG [org.jboss.webservice.handler.HandlerChainBaseImpl] Handle request: [state=METHOD_READY,handler=ru.zenith.handlers.CompressionHandler@b94bd7]
2005-04-01 17:01:34,015 DEBUG [org.jboss.webservice.handler.HandlerChainBaseImpl] Exit: doHandleRequest with status: true
But the outgoing SOAP message is still uncompressed.