Re: Compressing response

"Scott Nichol" <[email protected]>
Newsgroups gmane.text.xml.soap.user
Message-ID <1c7f01c49b25$ef3464a0$6401a8c0@northgate>
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" <[email protected]>
To: <[email protected]>
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
> 
> 
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.