You are viewing a plain text version of this content. The canonical link for it is here.
Posted to soap-user@ws.apache.org by Michał Małecki <mi...@poczta.onet.pl> on 2004/09/13 15:32:26 UTC

Compressing response

Hello,
I'm trying to compress SOAP messages (second day). The SOAP from client to
server was archived with no problems. However, soap from server to client is
still plain-text. I have added option "gzip", I have disabled Norton
firewall (killed accepted-encoding header). I searched the source code
(ws-soap_20040912104811) and I can't find out how ever the compression could
be archived - the outputStream is gzipped if SOAPSontext.getGzip return
true, but TransportMessage is created like this:
new TransportMessage(null, resCtx, null );
and resCtx is created few lines before:
resCtx = new SOAPContext(); // get rid of old one
so where the gzip of soapcontext could be set?

I beg you - please tell me how to archive this??
Michał Małecki



Re: Compressing response

Posted by Scott Nichol <sn...@scottnichol.com>.
The line of code

    resCtx = new SOAPContext(); // get rid of old one

from RPCRouterServlet, only runs when an exception is thrown.

The code that runs is something like this

RPCRouterServlet:

        provider.locate( dd, callEnv, call, call.getMethodName(), fullTargetID, 
                         reqCtx );
        ServerUtils.setResponseGzip(dd, reqCtx, resCtx);

ServerUtils:

        if (Boolean.TRUE.equals(reqCtx.getAcceptGzip())) {
          // Request specified gzip OK
          Hashtable props = dd.getProps();
          String gzip = props != null ? (String) props.get("gzip") : null;
          resCtx.setGzip(gzip != null && SoapEncUtils.decodeBooleanValue(gzip));
        } else if (Boolean.FALSE.equals(reqCtx.getAcceptGzip())) {
          // Request specified gzip not OK
          resCtx.setGzip(false);
        } else {
          // Request specified nothing, for now do not gzip
          // TODO: should accept be required?
          resCtx.setGzip(false);
        }

RPCRouterServlet:

        provider.invoke( reqCtx, resCtx );

RPCJavaProvider:

        Response resp = RPCRouter.invoke( dd, call, targetObject, 
                                          reqContext, resContext );

RPCRouter:

    return new Response (call.getTargetObjectURI (), call.getMethodName (),
                         ret, null, null, respEncStyle, resCtx);

RPCJavaProvider:

        Envelope env = resp.buildEnvelope();
        StringWriter  sw = new StringWriter(1024);
        env.marshall( sw, call.getSOAPMappingRegistry(), resContext );
        resContext.setRootPart( sw.toString(), Constants.HEADERVAL_CONTENT_TYPE_UTF8);

RPCRouterServlet:

      // Generate response.
      TransportMessage sres = new TransportMessage(null, resCtx, null );
      sres.editOutgoing(editor);

      // Generate response byte array.
      sres.save();

TransportMessage:

        if (Boolean.TRUE.equals(ctx.getGzip())) {
            // Deflate
            ByteArrayOutputStream baos =
                               new ByteArrayOutputStream(bytes.length);
            GZIPOutputStream gzos = new GZIPOutputStream(baos);
            gzos.write(bytes, offset, bytes.length - offset);
            gzos.close();
            baos.close();
            bytes = baos.toByteArray();
            offset = 0;

            headers.put(Constants.HEADER_CONTENT_ENCODING, Constants.HEADERVAL_CONTENT_ENCODING);
        }

RPCRouterServlet:

      // Write.
      res.setStatus(status);
      res.setContentType(sres.getContentType());
      for (Enumeration headers = sres.getHeaderNames();
           headers.hasMoreElements(); ) {
          String name = (String)headers.nextElement();
          res.setHeader(name, sres.getHeader(name));
      }

      res.setContentLength(sres.getContentLength());
      OutputStream outStream = res.getOutputStream();
      sres.writeTo(outStream);

In order to have your service gzip the result, the client must specify that it accepts gzip, and the deployment descriptor must have the option set to allow gzip.  Remember that when you change the deployment descriptor, you must re-deploy the service.

Scott Nichol

Do not send e-mail directly to this e-mail address,
because it is filtered to accept only mail from
specific mail lists.
----- Original Message ----- 
From: "Michał Małecki" <mi...@poczta.onet.pl>
To: <so...@ws.apache.org>
Sent: Monday, September 13, 2004 9:32 AM
Subject: Compressing response


> Hello,
> I'm trying to compress SOAP messages (second day). The SOAP from client to
> server was archived with no problems. However, soap from server to client is
> still plain-text. I have added option "gzip", I have disabled Norton
> firewall (killed accepted-encoding header). I searched the source code
> (ws-soap_20040912104811) and I can't find out how ever the compression could
> be archived - the outputStream is gzipped if SOAPSontext.getGzip return
> true, but TransportMessage is created like this:
> new TransportMessage(null, resCtx, null );
> and resCtx is created few lines before:
> resCtx = new SOAPContext(); // get rid of old one
> so where the gzip of soapcontext could be set?
> 
> I beg you - please tell me how to archive this??
> Michał Małecki
> 
> 
>