You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicemix.apache.org by gn...@apache.org on 2008/11/19 21:31:08 UTC

svn commit: r719060 - in /servicemix/components/bindings/servicemix-http/trunk/src: main/java/org/apache/servicemix/http/endpoints/ main/java/org/apache/servicemix/http/jetty/ test/java/org/apache/servicemix/http/

Author: gnodet
Date: Wed Nov 19 12:31:07 2008
New Revision: 719060

URL: http://svn.apache.org/viewvc?rev=719060&view=rev
Log:
SM-1167: Support for gzip encoding on both consumer and provider side (new http endpoints)

Added:
    servicemix/components/bindings/servicemix-http/trunk/src/main/java/org/apache/servicemix/http/endpoints/AbstractHttpConsumerMarshaler.java
    servicemix/components/bindings/servicemix-http/trunk/src/main/java/org/apache/servicemix/http/endpoints/AbstractHttpProviderMarshaler.java
Modified:
    servicemix/components/bindings/servicemix-http/trunk/src/main/java/org/apache/servicemix/http/endpoints/DefaultHttpConsumerMarshaler.java
    servicemix/components/bindings/servicemix-http/trunk/src/main/java/org/apache/servicemix/http/endpoints/DefaultHttpProviderMarshaler.java
    servicemix/components/bindings/servicemix-http/trunk/src/main/java/org/apache/servicemix/http/endpoints/HttpProviderEndpoint.java
    servicemix/components/bindings/servicemix-http/trunk/src/main/java/org/apache/servicemix/http/endpoints/HttpSoapConsumerMarshaler.java
    servicemix/components/bindings/servicemix-http/trunk/src/main/java/org/apache/servicemix/http/endpoints/HttpSoapProviderMarshaler.java
    servicemix/components/bindings/servicemix-http/trunk/src/main/java/org/apache/servicemix/http/jetty/SmxHttpExchange.java
    servicemix/components/bindings/servicemix-http/trunk/src/test/java/org/apache/servicemix/http/ConsumerEndpointTest.java
    servicemix/components/bindings/servicemix-http/trunk/src/test/java/org/apache/servicemix/http/ProviderEndpointTest.java

Added: servicemix/components/bindings/servicemix-http/trunk/src/main/java/org/apache/servicemix/http/endpoints/AbstractHttpConsumerMarshaler.java
URL: http://svn.apache.org/viewvc/servicemix/components/bindings/servicemix-http/trunk/src/main/java/org/apache/servicemix/http/endpoints/AbstractHttpConsumerMarshaler.java?rev=719060&view=auto
==============================================================================
--- servicemix/components/bindings/servicemix-http/trunk/src/main/java/org/apache/servicemix/http/endpoints/AbstractHttpConsumerMarshaler.java (added)
+++ servicemix/components/bindings/servicemix-http/trunk/src/main/java/org/apache/servicemix/http/endpoints/AbstractHttpConsumerMarshaler.java Wed Nov 19 12:31:07 2008
@@ -0,0 +1,66 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.servicemix.http.endpoints;
+
+import java.io.InputStream;
+import java.io.IOException;
+import java.io.BufferedInputStream;
+import java.io.OutputStream;
+import java.io.BufferedOutputStream;
+import java.util.zip.GZIPInputStream;
+import java.util.zip.GZIPOutputStream;
+
+import javax.jbi.messaging.MessageExchange;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.mortbay.jetty.HttpHeaders;
+
+public abstract class AbstractHttpConsumerMarshaler implements HttpConsumerMarshaler {
+
+    private final Log log = LogFactory.getLog(getClass());
+
+    protected InputStream getRequestEncodingStream(String contentEncoding, InputStream dataStream) throws IOException {
+        if (contentEncoding != null && contentEncoding.toLowerCase().indexOf("gzip") >= 0) {
+            log.debug("Using GZIP request content encoding.");
+            return new GZIPInputStream(new BufferedInputStream(dataStream));
+        } else {
+            log.debug("Using default request content encoding.");
+            return new BufferedInputStream(dataStream);
+        }
+    }
+
+    protected OutputStream getResponseEncodingStream(String acceptEncoding, OutputStream dataStream) throws IOException {
+        if (acceptEncoding != null && acceptEncoding.toLowerCase().indexOf("gzip") >= 0) {
+            log.debug("Using GZIP response content encoding.");
+            return new GZIPOutputStream(new BufferedOutputStream(dataStream));
+        } else {
+            log.debug("Using default response content encoding.");
+            return new BufferedOutputStream(dataStream);
+        }
+    }
+
+    protected void addResponseHeaders(MessageExchange exchange, HttpServletRequest request, HttpServletResponse response) {
+        String acceptEncoding = request.getHeader(HttpHeaders.ACCEPT_ENCODING);
+        if (acceptEncoding != null && acceptEncoding.toLowerCase().indexOf("gzip") >= 0) {
+            response.setHeader(HttpHeaders.CONTENT_ENCODING, "gzip");
+        }
+    }
+
+}

Added: servicemix/components/bindings/servicemix-http/trunk/src/main/java/org/apache/servicemix/http/endpoints/AbstractHttpProviderMarshaler.java
URL: http://svn.apache.org/viewvc/servicemix/components/bindings/servicemix-http/trunk/src/main/java/org/apache/servicemix/http/endpoints/AbstractHttpProviderMarshaler.java?rev=719060&view=auto
==============================================================================
--- servicemix/components/bindings/servicemix-http/trunk/src/main/java/org/apache/servicemix/http/endpoints/AbstractHttpProviderMarshaler.java (added)
+++ servicemix/components/bindings/servicemix-http/trunk/src/main/java/org/apache/servicemix/http/endpoints/AbstractHttpProviderMarshaler.java Wed Nov 19 12:31:07 2008
@@ -0,0 +1,73 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.servicemix.http.endpoints;
+
+import java.io.OutputStream;
+import java.io.IOException;
+import java.io.BufferedOutputStream;
+import java.io.InputStream;
+import java.io.BufferedInputStream;
+import java.util.zip.GZIPOutputStream;
+import java.util.zip.GZIPInputStream;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+public abstract class AbstractHttpProviderMarshaler implements HttpProviderMarshaler {
+
+    private final Log log = LogFactory.getLog(getClass());
+
+    private String contentEncoding;
+    private String acceptEncoding;
+
+    public String getContentEncoding() {
+        return contentEncoding;
+    }
+
+    public void setContentEncoding(String contentEncoding) {
+        this.contentEncoding = contentEncoding;
+    }
+
+    public String getAcceptEncoding() {
+        return acceptEncoding;
+    }
+
+    public void setAcceptEncoding(String acceptEncoding) {
+        this.acceptEncoding = acceptEncoding;
+    }
+
+    protected OutputStream getRequestEncodingStream(String encoding, OutputStream dataStream) throws IOException {
+        if (encoding != null && encoding.toLowerCase().indexOf("gzip") >= 0) {
+            log.debug("Using gzip request encoding in provider marshaller.");
+            return new GZIPOutputStream(new BufferedOutputStream(dataStream));
+        } else {
+            log.debug("Using default request encoding in provider marshaller.");
+            return new BufferedOutputStream(dataStream);
+        }
+    }
+
+    protected InputStream getResponseEncodingStream(String encoding, InputStream dataStream) throws IOException {
+        if (encoding != null && encoding.toLowerCase().indexOf("gzip") >= 0) {
+            log.debug("Using gzip response encoding in provider marshaller.");
+            return new GZIPInputStream(new BufferedInputStream(dataStream));
+        } else {
+            log.debug("Using default response encoding in provider marshaller.");
+            return new BufferedInputStream(dataStream);
+        }
+    }
+
+}

Modified: servicemix/components/bindings/servicemix-http/trunk/src/main/java/org/apache/servicemix/http/endpoints/DefaultHttpConsumerMarshaler.java
URL: http://svn.apache.org/viewvc/servicemix/components/bindings/servicemix-http/trunk/src/main/java/org/apache/servicemix/http/endpoints/DefaultHttpConsumerMarshaler.java?rev=719060&r1=719059&r2=719060&view=diff
==============================================================================
--- servicemix/components/bindings/servicemix-http/trunk/src/main/java/org/apache/servicemix/http/endpoints/DefaultHttpConsumerMarshaler.java (original)
+++ servicemix/components/bindings/servicemix-http/trunk/src/main/java/org/apache/servicemix/http/endpoints/DefaultHttpConsumerMarshaler.java Wed Nov 19 12:31:07 2008
@@ -20,7 +20,12 @@
 import java.io.InputStream;
 import java.io.PrintWriter;
 import java.io.StringWriter;
+import java.io.OutputStream;
+import java.io.BufferedOutputStream;
+import java.io.IOException;
 import java.net.URI;
+import java.util.zip.GZIPOutputStream;
+import java.util.zip.GZIPInputStream;
 
 import javax.jbi.component.ComponentContext;
 import javax.jbi.messaging.Fault;
@@ -35,6 +40,9 @@
 import org.apache.servicemix.jbi.jaxp.StAXSourceTransformer;
 import org.apache.servicemix.jbi.jaxp.XMLStreamHelper;
 import org.apache.servicemix.common.JbiConstants;
+import org.apache.commons.logging.LogFactory;
+import org.apache.commons.logging.Log;
+import org.mortbay.jetty.HttpHeaders;
 
 /**
  * The default consumer marshaler used for non-soap consumer endpoints.
@@ -42,7 +50,7 @@
  * @author gnodet
  * @since 3.2
  */
-public class DefaultHttpConsumerMarshaler implements HttpConsumerMarshaler {
+public class DefaultHttpConsumerMarshaler extends AbstractHttpConsumerMarshaler {
 
     private StAXSourceTransformer transformer = new StAXSourceTransformer();
     private URI defaultMep;
@@ -66,36 +74,42 @@
     public MessageExchange createExchange(HttpServletRequest request, ComponentContext context) throws Exception {
         MessageExchange me = context.getDeliveryChannel().createExchangeFactory().createExchange(getDefaultMep());
         NormalizedMessage in = me.createMessage();
-        InputStream is = request.getInputStream();
-        is = new BufferedInputStream(is);
-        in.setContent(new StreamSource(is));
+        in.setContent(new StreamSource(getRequestEncodingStream(request.getHeader(HttpHeaders.CONTENT_ENCODING),
+            request.getInputStream())));
         me.setMessage(in, "in");
         return me;
     }
 
-    public void sendOut(MessageExchange exchange, NormalizedMessage outMsg, HttpServletRequest request,
-        HttpServletResponse response) throws Exception {
+    public void sendOut(MessageExchange exchange, NormalizedMessage outMsg, HttpServletRequest request, HttpServletResponse response) throws Exception {
+        addResponseHeaders(exchange, request, response);
+        response.setStatus(HttpServletResponse.SC_OK);
         XMLStreamReader reader = transformer.toXMLStreamReader(outMsg.getContent());
-        XMLStreamWriter writer = transformer.getOutputFactory().createXMLStreamWriter(response.getWriter());
+        OutputStream encodingStream = getResponseEncodingStream(request.getHeader(HttpHeaders.ACCEPT_ENCODING),
+            response.getOutputStream());
+        XMLStreamWriter writer = transformer.getOutputFactory().createXMLStreamWriter(encodingStream);
         writer.writeStartDocument();
         XMLStreamHelper.copy(reader, writer);
         writer.writeEndDocument();
-        writer.flush();
-        response.setStatus(HttpServletResponse.SC_OK);
+        writer.close();
+        encodingStream.close();
     }
 
-    public void sendFault(MessageExchange exchange, Fault fault, HttpServletRequest request,
-        HttpServletResponse response) throws Exception {
+    public void sendFault(MessageExchange exchange, Fault fault, HttpServletRequest request, HttpServletResponse response) throws Exception {
+        addResponseHeaders(exchange, request, response);
         response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
         XMLStreamReader reader = transformer.toXMLStreamReader(fault.getContent());
-        XMLStreamWriter writer = transformer.getOutputFactory().createXMLStreamWriter(response.getWriter());
+        OutputStream encodingStream = getResponseEncodingStream(request.getHeader(HttpHeaders.ACCEPT_ENCODING), response.getOutputStream());
+        XMLStreamWriter writer = transformer.getOutputFactory().createXMLStreamWriter(encodingStream);
         XMLStreamHelper.copy(reader, writer);
+        writer.close();
+        encodingStream.close();
     }
 
-    public void sendError(MessageExchange exchange, Exception error, HttpServletRequest request,
-        HttpServletResponse response) throws Exception {
+    public void sendError(MessageExchange exchange, Exception error, HttpServletRequest request, HttpServletResponse response) throws Exception {
+        addResponseHeaders(exchange, request, response);
         response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
-        XMLStreamWriter writer = transformer.getOutputFactory().createXMLStreamWriter(response.getWriter());
+        OutputStream encodingStream = getResponseEncodingStream(request.getHeader(HttpHeaders.ACCEPT_ENCODING), response.getOutputStream());
+        XMLStreamWriter writer = transformer.getOutputFactory().createXMLStreamWriter(encodingStream);
         writer.writeStartDocument();
         writer.writeStartElement("error");
         StringWriter sw = new StringWriter();
@@ -105,10 +119,11 @@
         writer.writeCData(sw.toString());
         writer.writeEndElement();
         writer.writeEndDocument();
+        writer.close();
+        encodingStream.close();
     }
 
-    public void sendAccepted(MessageExchange exchange, HttpServletRequest request, HttpServletResponse response)
-        throws Exception {
+    public void sendAccepted(MessageExchange exchange, HttpServletRequest request, HttpServletResponse response) throws Exception {
         response.setStatus(HttpServletResponse.SC_ACCEPTED);
     }
 

Modified: servicemix/components/bindings/servicemix-http/trunk/src/main/java/org/apache/servicemix/http/endpoints/DefaultHttpProviderMarshaler.java
URL: http://svn.apache.org/viewvc/servicemix/components/bindings/servicemix-http/trunk/src/main/java/org/apache/servicemix/http/endpoints/DefaultHttpProviderMarshaler.java?rev=719060&r1=719059&r2=719060&view=diff
==============================================================================
--- servicemix/components/bindings/servicemix-http/trunk/src/main/java/org/apache/servicemix/http/endpoints/DefaultHttpProviderMarshaler.java (original)
+++ servicemix/components/bindings/servicemix-http/trunk/src/main/java/org/apache/servicemix/http/endpoints/DefaultHttpProviderMarshaler.java Wed Nov 19 12:31:07 2008
@@ -18,8 +18,15 @@
 
 import java.io.ByteArrayOutputStream;
 import java.io.Reader;
+import java.io.OutputStream;
+import java.io.BufferedInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.BufferedOutputStream;
 import java.net.URI;
 import java.util.Map;
+import java.util.zip.GZIPInputStream;
+import java.util.zip.GZIPOutputStream;
 
 import javax.jbi.messaging.ExchangeStatus;
 import javax.jbi.messaging.Fault;
@@ -32,6 +39,8 @@
 import javax.xml.transform.stream.StreamSource;
 
 import org.apache.commons.httpclient.HttpStatus;
+import org.apache.commons.logging.LogFactory;
+import org.apache.commons.logging.Log;
 import org.apache.servicemix.expression.Expression;
 import org.apache.servicemix.http.jetty.SmxHttpExchange;
 import org.apache.servicemix.jbi.jaxp.SourceTransformer;
@@ -46,7 +55,7 @@
  * @author gnodet
  * @since 3.2
  */
-public class DefaultHttpProviderMarshaler implements HttpProviderMarshaler {
+public class DefaultHttpProviderMarshaler extends AbstractHttpProviderMarshaler implements HttpProviderMarshaler {
 
     private SourceTransformer transformer = new StAXSourceTransformer();
     private String locationURI;
@@ -173,6 +182,14 @@
 
         httpExchange.setMethod(getMethod(exchange, inMsg));
         httpExchange.setRequestHeader(HttpHeaders.CONTENT_TYPE, getContentType(exchange, inMsg));
+
+        if (getContentEncoding() != null) {
+            httpExchange.setRequestHeader(HttpHeaders.CONTENT_ENCODING, getContentEncoding());
+        }
+        if (getAcceptEncoding() != null) {
+            httpExchange.setRequestHeader(HttpHeaders.ACCEPT_ENCODING, getAcceptEncoding());
+        }
+
         if (getHeaders() != null) {
             for (Map.Entry<String, String> e : getHeaders().entrySet()) {
                 httpExchange.setRequestHeader(e.getKey(), e.getValue());
@@ -180,7 +197,9 @@
         }
         if (inMsg.getContent() != null) {
             ByteArrayOutputStream baos = new ByteArrayOutputStream();
-            transformer.toResult(inMsg.getContent(), new StreamResult(baos));
+            OutputStream encodingStream = getRequestEncodingStream(getContentEncoding(), baos);
+            transformer.toResult(inMsg.getContent(), new StreamResult(encodingStream));
+            encodingStream.close();
             httpExchange.setRequestContent(new ByteArrayBuffer(baos.toByteArray()));
         }
     }
@@ -190,20 +209,26 @@
         if (response != HttpStatus.SC_OK && response != HttpStatus.SC_ACCEPTED) {
             if (!(exchange instanceof InOnly)) {
                 Fault fault = exchange.createFault();
-                fault.setContent(new StreamSource(httpExchange.getResponseReader()));
+                fault.setContent(new StreamSource(getResponseEncodingStream(
+                    httpExchange.getResponseFields().getStringField(HttpHeaders.CONTENT_ENCODING),
+                    httpExchange.getResponseStream())));
                 exchange.setFault(fault);
             } else {
                 throw new Exception("Invalid status response: " + response);
             }
         } else if (exchange instanceof InOut) {
             NormalizedMessage msg = exchange.createMessage();
-            msg.setContent(new StreamSource(httpExchange.getResponseReader()));
+            msg.setContent(new StreamSource(getResponseEncodingStream(
+                httpExchange.getResponseFields().getStringField(HttpHeaders.CONTENT_ENCODING),
+                httpExchange.getResponseStream())));
             exchange.setMessage(msg, "out");
         } else if (exchange instanceof InOptionalOut) {
-            Reader r = httpExchange.getResponseReader();
-            if (r != null) {
+            InputStream is = httpExchange.getResponseStream();
+            if (is != null) {
                 NormalizedMessage msg = exchange.createMessage();
-                msg.setContent(new StreamSource(r));
+                msg.setContent(new StreamSource(getResponseEncodingStream(
+                    httpExchange.getResponseFields().getStringField(HttpHeaders.CONTENT_ENCODING),
+                    is)));
                 exchange.setMessage(msg, "out");
             } else {
                 exchange.setStatus(ExchangeStatus.DONE);

Modified: servicemix/components/bindings/servicemix-http/trunk/src/main/java/org/apache/servicemix/http/endpoints/HttpProviderEndpoint.java
URL: http://svn.apache.org/viewvc/servicemix/components/bindings/servicemix-http/trunk/src/main/java/org/apache/servicemix/http/endpoints/HttpProviderEndpoint.java?rev=719060&r1=719059&r2=719060&view=diff
==============================================================================
--- servicemix/components/bindings/servicemix-http/trunk/src/main/java/org/apache/servicemix/http/endpoints/HttpProviderEndpoint.java (original)
+++ servicemix/components/bindings/servicemix-http/trunk/src/main/java/org/apache/servicemix/http/endpoints/HttpProviderEndpoint.java Wed Nov 19 12:31:07 2008
@@ -73,6 +73,10 @@
 
     private SslParameters ssl;
 
+    private boolean expectGzippedResponse;
+    private boolean gzipRequest;
+
+
     public HttpProviderEndpoint() {
         super();
     }
@@ -192,6 +196,33 @@
         this.ssl = ssl;
     }
 
+    public boolean isExpectGzippedResponse() {
+        return expectGzippedResponse;
+    }
+
+    /**
+     * If true, the accept-encoding http header will be set to gzip and the response will be un-gzipped.
+     *
+     * @param expectGzippedResponse if the response should be unzipped
+     */
+    public void setExpectGzippedResponse(boolean expectGzippedResponse) {
+        this.expectGzippedResponse = expectGzippedResponse;
+    }
+
+    public boolean isGzipRequest() {
+        return gzipRequest;
+    }
+
+    /**
+     * If true, the request content will be gzipped and sent over the wire. The content-encoding http header will
+     * also be set to gzip.
+     *
+     * @param gzipRequest if the request should be compressed using gzip
+     */
+    public void setGzipRequest(boolean gzipRequest) {
+        this.gzipRequest = gzipRequest;
+    }
+
     public void process(MessageExchange exchange) throws Exception {
         if (exchange.getStatus() == ExchangeStatus.ACTIVE) {
             NormalizedMessage nm = exchange.getMessage("in");
@@ -298,7 +329,15 @@
             marshaler = new DefaultHttpProviderMarshaler();
         }
         if (marshaler instanceof DefaultHttpProviderMarshaler && locationURI != null) {
-            ((DefaultHttpProviderMarshaler)marshaler).setLocationURI(locationURI);
+            ((DefaultHttpProviderMarshaler) marshaler).setLocationURI(locationURI);
+        }
+        if (marshaler instanceof AbstractHttpProviderMarshaler) {
+            if (isGzipRequest()) {
+                ((AbstractHttpProviderMarshaler) marshaler).setContentEncoding("gzip");
+            }
+            if (isExpectGzippedResponse()) {
+                ((AbstractHttpProviderMarshaler) marshaler).setAcceptEncoding("gzip");
+            }
         }
     }
 

Modified: servicemix/components/bindings/servicemix-http/trunk/src/main/java/org/apache/servicemix/http/endpoints/HttpSoapConsumerMarshaler.java
URL: http://svn.apache.org/viewvc/servicemix/components/bindings/servicemix-http/trunk/src/main/java/org/apache/servicemix/http/endpoints/HttpSoapConsumerMarshaler.java?rev=719060&r1=719059&r2=719060&view=diff
==============================================================================
--- servicemix/components/bindings/servicemix-http/trunk/src/main/java/org/apache/servicemix/http/endpoints/HttpSoapConsumerMarshaler.java (original)
+++ servicemix/components/bindings/servicemix-http/trunk/src/main/java/org/apache/servicemix/http/endpoints/HttpSoapConsumerMarshaler.java Wed Nov 19 12:31:07 2008
@@ -18,10 +18,15 @@
 
 import java.io.InputStream;
 import java.io.OutputStream;
+import java.io.BufferedOutputStream;
+import java.io.IOException;
+import java.io.BufferedInputStream;
 import java.util.Enumeration;
 import java.util.Map;
 import java.util.List;
 import java.util.HashMap;
+import java.util.zip.GZIPOutputStream;
+import java.util.zip.GZIPInputStream;
 
 import javax.jbi.component.ComponentContext;
 import javax.jbi.messaging.Fault;
@@ -41,13 +46,14 @@
 import org.apache.servicemix.soap.bindings.soap.SoapFault;
 import org.apache.servicemix.soap.bindings.soap.SoapVersion;
 import org.apache.servicemix.soap.interceptors.jbi.JbiConstants;
+import org.mortbay.jetty.HttpHeaders;
 
 /**
  * 
  * @author gnodet
  * @since 3.2
  */
-public class HttpSoapConsumerMarshaler implements HttpConsumerMarshaler {
+public class HttpSoapConsumerMarshaler extends AbstractHttpConsumerMarshaler {
 
     private Binding<?> binding;
     private boolean useJbiWrapper = true;
@@ -94,7 +100,7 @@
         headers.put(HttpConstants.CONTENT_TYPE, request.getContentType());
         headers.put(HttpConstants.REQUEST_METHOD, method);
         if (HttpConstants.METHOD_POST.equals(method) || HttpConstants.METHOD_PUT.equals(method)) {
-            msg.setContent(InputStream.class, request.getInputStream());
+            msg.setContent(InputStream.class, getRequestEncodingStream(request.getHeader(HttpHeaders.CONTENT_ENCODING), request.getInputStream()));
         }
         request.setAttribute(Message.class.getName(), msg);
         InterceptorChain phase = getChain(Phase.ServerIn);
@@ -102,31 +108,33 @@
         return msg.getContent(MessageExchange.class);
     }
 
-    public void sendAccepted(MessageExchange exchange, HttpServletRequest request, HttpServletResponse response)
-        throws Exception {
+    public void sendAccepted(MessageExchange exchange, HttpServletRequest request, HttpServletResponse response) throws Exception {
         response.setStatus(HttpServletResponse.SC_ACCEPTED);
     }
 
-    public void sendOut(MessageExchange exchange, NormalizedMessage outMsg, HttpServletRequest request,
-        HttpServletResponse response) throws Exception {
+    public void sendOut(MessageExchange exchange, NormalizedMessage outMsg, HttpServletRequest request, HttpServletResponse response) throws Exception {
+        addResponseHeaders(exchange, request, response);
         Message in = (Message) request.getAttribute(Message.class.getName());
         Message msg = binding.createMessage(in);
-        msg.setContent(OutputStream.class, response.getOutputStream());
+        OutputStream encodingStream = getResponseEncodingStream(request.getHeader(HttpHeaders.CONTENT_ENCODING), response.getOutputStream());
+        msg.setContent(OutputStream.class, encodingStream);
         msg.setContent(MessageExchange.class, exchange);
         msg.setContent(NormalizedMessage.class, outMsg);
         msg.put(SoapVersion.class, in.get(SoapVersion.class));
         msg.put(JbiConstants.USE_JBI_WRAPPER, useJbiWrapper);
         InterceptorChain phase = getChain(Phase.ServerOut);
         phase.doIntercept(msg);
+        encodingStream.close();
         // TODO: handle http headers: Content-Type, ...
     }
 
-    public void sendError(MessageExchange exchange, Exception error, HttpServletRequest request,
-        HttpServletResponse response) throws Exception {
+    public void sendError(MessageExchange exchange, Exception error, HttpServletRequest request, HttpServletResponse response) throws Exception {
+        addResponseHeaders(exchange, request, response);
         response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
         Message in = (Message) request.getAttribute(Message.class.getName());
         Message msg = binding.createMessage(in);
-        msg.setContent(OutputStream.class, response.getOutputStream());
+        OutputStream encodingStream = getResponseEncodingStream(request.getHeader(HttpHeaders.CONTENT_ENCODING), response.getOutputStream());
+        msg.setContent(OutputStream.class, encodingStream);
         msg.setContent(MessageExchange.class, exchange);
         msg.put(SoapVersion.class, in.get(SoapVersion.class));
         msg.put(JbiConstants.USE_JBI_WRAPPER, useJbiWrapper);
@@ -139,14 +147,16 @@
         }
         msg.setContent(Exception.class, soapFault);
         phase.doIntercept(msg);
+        encodingStream.close();
     }
 
-    public void sendFault(MessageExchange exchange, Fault fault, HttpServletRequest request,
-        HttpServletResponse response) throws Exception {
+    public void sendFault(MessageExchange exchange, Fault fault, HttpServletRequest request, HttpServletResponse response) throws Exception {
+        addResponseHeaders(exchange, request, response);
         response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
         Message in = (Message) request.getAttribute(Message.class.getName());
         Message msg = binding.createMessage(in);
-        msg.setContent(OutputStream.class, response.getOutputStream());
+        OutputStream encodingStream = getResponseEncodingStream(request.getHeader(HttpHeaders.CONTENT_ENCODING), response.getOutputStream());
+        msg.setContent(OutputStream.class, encodingStream);
         msg.setContent(MessageExchange.class, exchange);
         msg.setContent(NormalizedMessage.class, fault);
         msg.put(SoapVersion.class, in.get(SoapVersion.class));
@@ -157,6 +167,7 @@
         SoapFault soapFault = new SoapFault(code, reason, null, null, fault.getContent());
         msg.setContent(Exception.class, soapFault);
         phase.doIntercept(msg);
+        encodingStream.close();
         // TODO: handle http headers: Content-Type, ...
     }
 

Modified: servicemix/components/bindings/servicemix-http/trunk/src/main/java/org/apache/servicemix/http/endpoints/HttpSoapProviderMarshaler.java
URL: http://svn.apache.org/viewvc/servicemix/components/bindings/servicemix-http/trunk/src/main/java/org/apache/servicemix/http/endpoints/HttpSoapProviderMarshaler.java?rev=719060&r1=719059&r2=719060&view=diff
==============================================================================
--- servicemix/components/bindings/servicemix-http/trunk/src/main/java/org/apache/servicemix/http/endpoints/HttpSoapProviderMarshaler.java (original)
+++ servicemix/components/bindings/servicemix-http/trunk/src/main/java/org/apache/servicemix/http/endpoints/HttpSoapProviderMarshaler.java Wed Nov 19 12:31:07 2008
@@ -43,7 +43,7 @@
  * @author gnodet
  * @since 3.2
  */
-public class HttpSoapProviderMarshaler implements HttpProviderMarshaler {
+public class HttpSoapProviderMarshaler extends AbstractHttpProviderMarshaler implements HttpProviderMarshaler {
 
     private Binding<?> binding;
     private boolean useJbiWrapper = true;
@@ -87,6 +87,7 @@
                               final NormalizedMessage inMsg, 
                               final SmxHttpExchange httpExchange) throws Exception {
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        OutputStream encodingStream = getRequestEncodingStream(getContentEncoding(), baos);
         Message msg = binding.createMessage();
         msg.put(JbiConstants.USE_JBI_WRAPPER, useJbiWrapper);
         msg.setContent(MessageExchange.class, exchange);
@@ -96,6 +97,7 @@
 
         InterceptorChain phaseOut = getChain(Phase.ClientOut);
         phaseOut.doIntercept(msg);
+        encodingStream.close();
         httpExchange.setMethod(HttpMethods.POST);
         httpExchange.setURL(baseUrl);
         httpExchange.setRequestContent(new ByteArrayBuffer(baos.toByteArray()));

Modified: servicemix/components/bindings/servicemix-http/trunk/src/main/java/org/apache/servicemix/http/jetty/SmxHttpExchange.java
URL: http://svn.apache.org/viewvc/servicemix/components/bindings/servicemix-http/trunk/src/main/java/org/apache/servicemix/http/jetty/SmxHttpExchange.java?rev=719060&r1=719059&r2=719060&view=diff
==============================================================================
--- servicemix/components/bindings/servicemix-http/trunk/src/main/java/org/apache/servicemix/http/jetty/SmxHttpExchange.java (original)
+++ servicemix/components/bindings/servicemix-http/trunk/src/main/java/org/apache/servicemix/http/jetty/SmxHttpExchange.java Wed Nov 19 12:31:07 2008
@@ -22,6 +22,7 @@
 import java.io.InputStreamReader;
 import java.io.Reader;
 import java.io.UnsupportedEncodingException;
+import java.io.InputStream;
 
 import org.mortbay.io.Buffer;
 import org.mortbay.io.BufferUtil;
@@ -75,6 +76,14 @@
     }
 
     /* ------------------------------------------------------------ */
+    public InputStream getResponseStream() throws UnsupportedEncodingException {
+        if (responseContent != null) {
+            return new ByteArrayInputStream(responseContent.toByteArray());
+        }
+        return null;
+    }
+
+    /* ------------------------------------------------------------ */
     public byte[] getResponseData() throws UnsupportedEncodingException {
         if (responseContent != null) {
             return responseContent.toByteArray();

Modified: servicemix/components/bindings/servicemix-http/trunk/src/test/java/org/apache/servicemix/http/ConsumerEndpointTest.java
URL: http://svn.apache.org/viewvc/servicemix/components/bindings/servicemix-http/trunk/src/test/java/org/apache/servicemix/http/ConsumerEndpointTest.java?rev=719060&r1=719059&r2=719060&view=diff
==============================================================================
--- servicemix/components/bindings/servicemix-http/trunk/src/test/java/org/apache/servicemix/http/ConsumerEndpointTest.java (original)
+++ servicemix/components/bindings/servicemix-http/trunk/src/test/java/org/apache/servicemix/http/ConsumerEndpointTest.java Wed Nov 19 12:31:07 2008
@@ -17,13 +17,17 @@
 package org.apache.servicemix.http;
 
 import java.util.List;
+import java.util.zip.GZIPOutputStream;
+import java.util.zip.GZIPInputStream;
 import java.util.concurrent.CopyOnWriteArrayList;
 import java.util.concurrent.CountDownLatch;
+import java.io.ByteArrayOutputStream;
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
 
 import javax.jbi.messaging.MessageExchange;
 import javax.jbi.messaging.MessagingException;
 import javax.jbi.messaging.NormalizedMessage;
-import javax.jbi.messaging.ExchangeStatus;
 import javax.xml.namespace.QName;
 import javax.xml.transform.TransformerException;
 import javax.xml.transform.stream.StreamSource;
@@ -37,6 +41,7 @@
 import org.apache.commons.httpclient.HttpClient;
 import org.apache.commons.httpclient.methods.PostMethod;
 import org.apache.commons.httpclient.methods.StringRequestEntity;
+import org.apache.commons.httpclient.methods.ByteArrayRequestEntity;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.servicemix.components.http.InvalidStatusResponseException;
@@ -49,7 +54,6 @@
 import org.apache.servicemix.jbi.jaxp.SourceTransformer;
 import org.apache.servicemix.jbi.jaxp.StringSource;
 import org.apache.servicemix.jbi.messaging.MessageExchangeSupport;
-import org.apache.servicemix.jbi.messaging.MessageExchangeImpl;
 import org.apache.servicemix.jbi.util.DOMUtil;
 import org.apache.servicemix.soap.bindings.soap.Soap11;
 import org.apache.servicemix.soap.bindings.soap.Soap12;
@@ -61,7 +65,7 @@
 import org.apache.servicemix.executors.impl.ExecutorFactoryImpl;
 import org.apache.xpath.CachedXPathAPI;
 import org.springframework.core.io.ClassPathResource;
-import org.mortbay.jetty.bio.SocketConnector;
+import org.mortbay.jetty.HttpHeaders;
 
 public class ConsumerEndpointTest extends TestCase {
     private static transient Log log = LogFactory.getLog(ConsumerEndpointTest.class);
@@ -440,6 +444,106 @@
         assertEquals(200, post.getStatusCode());
     }
 
+    public void testGzipEncodingNonSoap() throws Exception {
+        HttpComponent http = new HttpComponent();
+        HttpConsumerEndpoint ep = new HttpConsumerEndpoint();
+        ep.setService(new QName("urn:test", "svc"));
+        ep.setEndpoint("ep");
+        ep.setTargetService(new QName("urn:test", "echo"));
+        ep.setLocationURI("http://localhost:8192/ep1/");
+        http.setEndpoints(new HttpEndpointType[] {ep });
+        container.activateComponent(http, "http");
+
+        EchoComponent echo = new EchoComponent();
+        echo.setService(new QName("urn:test", "echo"));
+        echo.setEndpoint("endpoint");
+        container.activateComponent(echo, "echo");
+
+        container.start();
+
+        PostMethod post = new PostMethod("http://localhost:8192/ep1/");
+        post.addRequestHeader(HttpHeaders.CONTENT_ENCODING, "gzip");
+        post.addRequestHeader(HttpHeaders.ACCEPT_ENCODING, "gzip");
+
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        GZIPOutputStream gos = new GZIPOutputStream(baos);
+        gos.write("<hello>world</hello>".getBytes());
+        gos.flush();
+        gos.close();
+
+        post.setRequestEntity(new ByteArrayRequestEntity(baos.toByteArray()));
+        new HttpClient().executeMethod(post);
+
+        GZIPInputStream gis = new GZIPInputStream(post.getResponseBodyAsStream());
+        BufferedReader br = new BufferedReader(new InputStreamReader(gis));
+
+        String result = br.readLine();
+        log.info(result);
+        Node node = transformer.toDOMNode(new StringSource(result));
+        log.info(transformer.toString(node));
+        assertEquals("world", textValueOfXPath(node, "/hello/text()"));
+        if (post.getStatusCode() != 200) {
+            throw new InvalidStatusResponseException(post.getStatusCode());
+        }
+    }
+
+    public void testGzipEncodingSoap() throws Exception {
+        initSoapEndpoints(true);
+
+        TransformComponentSupport mock = new TransformComponentSupport() {
+            protected boolean transform(MessageExchange exchange, NormalizedMessage in, NormalizedMessage out)
+                throws MessagingException {
+                Element elem;
+                try {
+                    elem = transformer.toDOMElement(in.getContent());
+                    log.info(transformer.toString(elem));
+                } catch (Exception e) {
+                    throw new MessagingException(e);
+                }
+                assertEquals(JbiConstants.WSDL11_WRAPPER_MESSAGE, DomUtil.getQName(elem));
+                out.setContent(
+                    new StringSource("<jbi:message xmlns:jbi='http://java.sun.com/xml/ns/jbi/wsdl-11-wrapper'>"
+                        + "<jbi:part><HelloResponse xmlns='uri:HelloWorld'>world</HelloResponse></jbi:part>"
+                        + "</jbi:message> "));
+                return true;
+            }
+        };
+        mock.setService(new QName("urn:test", "echo"));
+        mock.setEndpoint("endpoint");
+        container.activateComponent(mock, "mock");
+
+        PostMethod post = new PostMethod("http://localhost:8192/ep2/");
+
+        post.addRequestHeader(HttpHeaders.CONTENT_ENCODING, "gzip");
+        post.addRequestHeader(HttpHeaders.ACCEPT_ENCODING, "gzip");
+
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        GZIPOutputStream gos = new GZIPOutputStream(baos);
+
+        gos.write(("<s:Envelope xmlns:s='http://www.w3.org/2003/05/soap-envelope'>"
+            + "<s:Header><HelloHeader xmlns='uri:HelloWorld'/></s:Header>"
+            + "<s:Body><HelloRequest xmlns='uri:HelloWorld'>world</HelloRequest></s:Body>"
+            + "</s:Envelope>").getBytes());
+        gos.flush();
+        gos.close();
+
+        post.setRequestEntity(new ByteArrayRequestEntity(baos.toByteArray()));
+        new HttpClient().executeMethod(post);
+
+        GZIPInputStream gis = new GZIPInputStream(post.getResponseBodyAsStream());
+        BufferedReader br = new BufferedReader(new InputStreamReader(gis));
+
+        String result = br.readLine();
+        log.info(result);
+        Element elem = transformer.toDOMElement(new StringSource(result));
+        assertEquals(Soap12.getInstance().getEnvelope(), DomUtil.getQName(elem));
+        elem = DomUtil.getFirstChildElement(elem);
+        assertEquals(Soap12.getInstance().getBody(), DomUtil.getQName(elem));
+        elem = DomUtil.getFirstChildElement(elem);
+        assertEquals(new QName("uri:HelloWorld", "HelloResponse"), DomUtil.getQName(elem));
+        assertEquals(200, post.getStatusCode());
+    }
+
     /*
      * Load testing test
      */

Modified: servicemix/components/bindings/servicemix-http/trunk/src/test/java/org/apache/servicemix/http/ProviderEndpointTest.java
URL: http://svn.apache.org/viewvc/servicemix/components/bindings/servicemix-http/trunk/src/test/java/org/apache/servicemix/http/ProviderEndpointTest.java?rev=719060&r1=719059&r2=719060&view=diff
==============================================================================
--- servicemix/components/bindings/servicemix-http/trunk/src/test/java/org/apache/servicemix/http/ProviderEndpointTest.java (original)
+++ servicemix/components/bindings/servicemix-http/trunk/src/test/java/org/apache/servicemix/http/ProviderEndpointTest.java Wed Nov 19 12:31:07 2008
@@ -353,4 +353,96 @@
         System.err.println(new SourceTransformer().contentToString(me.getOutMessage()));
         client.done(me);
     }
+
+    public void testGzipEncodingNonSoap() throws Exception {
+        EchoComponent echo = new EchoComponent();
+        echo.setService(new QName("http://servicemix.apache.org/samples/wsdl-first", "EchoService"));
+        echo.setEndpoint("service");
+        container.activateComponent(echo, "echo");
+
+        HttpComponent http = new HttpComponent();
+
+        HttpConsumerEndpoint ep0 = new HttpConsumerEndpoint();
+        ep0.setService(new QName("http://servicemix.apache.org/samples/wsdl-first", "PersonService"));
+        ep0.setEndpoint("consumer");
+        ep0.setTargetService(new QName("http://servicemix.apache.org/samples/wsdl-first", "EchoService"));
+        ep0.setTargetEndpoint("service");
+        ep0.setLocationURI("http://localhost:8192/person/");
+
+        HttpProviderEndpoint ep1 = new HttpProviderEndpoint();
+        ep1.setService(new QName("http://servicemix.apache.org/samples/wsdl-first", "PersonService"));
+        ep1.setEndpoint("provider");
+        ep1.setLocationURI("http://localhost:8192/person/");
+        ep1.setGzipRequest(true);
+        ep1.setExpectGzippedResponse(true);
+
+        http.setEndpoints(new HttpEndpointType[] {ep0, ep1});
+        container.activateComponent(http, "http");
+        container.start();
+
+        ServiceMixClient client = new DefaultServiceMixClient(container);
+        InOut me = client.createInOutExchange();
+        me.setService(new QName("http://servicemix.apache.org/samples/wsdl-first", "PersonService"));
+        me.setOperation(new QName("http://servicemix.apache.org/samples/wsdl-first", "GetPerson"));
+        me.getInMessage().setContent(new StringSource(
+            "<jbi:message xmlns:jbi=\"http://java.sun.com/xml/ns/jbi/wsdl-11-wrapper\""
+                + "             xmlns:msg=\"http://servicemix.apache.org/samples/wsdl-first/types\" "
+                + "             name=\"Hello\" "
+                + "             type=\"msg:HelloRequest\" "
+                + "             version=\"1.0\">"
+                + "  <jbi:part>"
+                + "    <msg:GetPerson><msg:personId>id</msg:personId></msg:GetPerson>"
+                + "  </jbi:part>"
+                + "</jbi:message>"));
+        client.sendSync(me);
+
+        System.err.println(new SourceTransformer().contentToString(me.getOutMessage()));
+    }
+
+    public void testGzipEncodingSoap() throws Exception {
+        EchoComponent echo = new EchoComponent();
+        echo.setService(new QName("http://servicemix.apache.org/samples/wsdl-first", "EchoService"));
+        echo.setEndpoint("service");
+        container.activateComponent(echo, "echo");
+
+        HttpComponent http = new HttpComponent();
+
+        HttpConsumerEndpoint ep0 = new HttpConsumerEndpoint();
+        ep0.setService(new QName("http://servicemix.apache.org/samples/wsdl-first", "PersonService"));
+        ep0.setEndpoint("consumer");
+        ep0.setTargetService(new QName("http://servicemix.apache.org/samples/wsdl-first", "EchoService"));
+        ep0.setTargetEndpoint("service");
+        ep0.setLocationURI("http://localhost:8192/PersonService/");
+
+        HttpSoapProviderEndpoint ep1 = new HttpSoapProviderEndpoint();
+        ep1.setService(new QName("http://servicemix.apache.org/samples/wsdl-first", "PersonService"));
+        ep1.setEndpoint("soap");
+        ep1.setWsdl(new ClassPathResource("person.wsdl"));
+        ep1.setValidateWsdl(false); // TODO: Soap 1.2 not handled yet
+        ep1.setUseJbiWrapper(true);
+        ep1.setGzipRequest(true);
+        ep1.setExpectGzippedResponse(true);
+
+        http.setEndpoints(new HttpEndpointType[] {ep0, ep1});
+        container.activateComponent(http, "http");
+
+        container.start();
+
+        ServiceMixClient client = new DefaultServiceMixClient(container);
+        InOut me = client.createInOutExchange();
+        me.setService(new QName("http://servicemix.apache.org/samples/wsdl-first", "PersonService"));
+        me.setOperation(new QName("http://servicemix.apache.org/samples/wsdl-first", "GetPerson"));
+        me.getInMessage().setContent(new StringSource(
+                                "<jbi:message xmlns:jbi=\"http://java.sun.com/xml/ns/jbi/wsdl-11-wrapper\""
+                             +  "             xmlns:msg=\"http://servicemix.apache.org/samples/wsdl-first/types\" "
+                             +  "             name=\"Hello\" "
+                             +  "             type=\"msg:HelloRequest\" "
+                             +  "             version=\"1.0\">"
+                             +  "  <jbi:part>"
+                             +  "    <msg:GetPerson><msg:personId>id</msg:personId></msg:GetPerson>"
+                             +  "  </jbi:part>"
+                             +  "</jbi:message>"));
+        client.sendSync(me);
+    }
+
 }