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);
+ }
+
}