You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@synapse.apache.org by hi...@apache.org on 2009/10/02 09:21:19 UTC
svn commit: r820914 - in
/synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/nhttp:
ClientWorker.java NhttpConstants.java
Author: hiranya
Date: Fri Oct 2 07:21:19 2009
New Revision: 820914
URL: http://svn.apache.org/viewvc?rev=820914&view=rev
Log:
Fixing SYNAPSE-587. Response messages that do not have a content type header are now properly handled according to the specs.
Modified:
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/nhttp/ClientWorker.java
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/nhttp/NhttpConstants.java
Modified: synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/nhttp/ClientWorker.java
URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/nhttp/ClientWorker.java?rev=820914&r1=820913&r2=820914&view=diff
==============================================================================
--- synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/nhttp/ClientWorker.java (original)
+++ synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/nhttp/ClientWorker.java Fri Oct 2 07:21:19 2009
@@ -27,6 +27,7 @@
import org.apache.axis2.context.ConfigurationContext;
import org.apache.axis2.context.MessageContext;
import org.apache.axis2.description.WSDL2Constants;
+import org.apache.axis2.description.Parameter;
import org.apache.axis2.engine.AxisEngine;
import org.apache.axis2.transport.TransportUtils;
import org.apache.axis2.transport.http.HTTPTransportUtils;
@@ -153,65 +154,63 @@
SOAPEnvelope envelope = null;
try {
-
Header cType = response.getFirstHeader(HTTP.CONTENT_TYPE);
-
+ String contentType;
if (cType != null) {
- String contentType = cType.getValue();
+ // This is the most common case - Most of the time servers send the Content-Type
+ contentType = cType.getValue();
+ } else {
+ // Server hasn't sent the header - Try to infer the content type
+ contentType = inferContentType();
+ }
- String charSetEnc = BuilderUtil.getCharSetEncoding(contentType);
- if (charSetEnc == null) {
- charSetEnc = MessageContext.DEFAULT_CHAR_SET_ENCODING;
- }
+ String charSetEnc = BuilderUtil.getCharSetEncoding(contentType);
+ if (charSetEnc == null) {
+ charSetEnc = MessageContext.DEFAULT_CHAR_SET_ENCODING;
+ }
- responseMsgCtx.setProperty(
- Constants.Configuration.CHARACTER_SET_ENCODING,
- contentType.indexOf(HTTP.CHARSET_PARAM) > 0 ?
- charSetEnc : MessageContext.DEFAULT_CHAR_SET_ENCODING);
-
- // workaround for Axis2 TransportUtils.createSOAPMessage() issue, where a response
- // of content type "text/xml" is thought to be REST if !MC.isServerSide(). This
- // question is still under debate and due to the timelines, I am commiting this
- // workaround as Axis2 1.2 is about to be released and Synapse 1.0
- responseMsgCtx.setServerSide(false);
- try {
- envelope = TransportUtils.createSOAPMessage(
- responseMsgCtx,
- HTTPTransportUtils.handleGZip(responseMsgCtx, in),
- contentType);
-
- } catch (OMException e) {
- // handle non SOAP and POX/REST payloads (probably text/html)
- String errorMessage = "Unexpected response received. HTTP response code : "
- + this.response.getStatusLine().getStatusCode() + " HTTP status : "
- + this.response.getStatusLine().getReasonPhrase() + " exception : "
- + e.getMessage();
-
- log.warn(errorMessage);
- if (log.isDebugEnabled()) {
- log.debug(errorMessage, e);
- log.debug("Creating the SOAPFault to be injected...");
- }
- SOAPFactory factory = new SOAP11Factory();
- envelope = factory.getDefaultFaultEnvelope();
- SOAPFaultDetail detail = factory.createSOAPFaultDetail();
- detail.setText(errorMessage);
- envelope.getBody().getFault().setDetail(detail);
- SOAPFaultReason reason = factory.createSOAPFaultReason();
- reason.setText(errorMessage);
- envelope.getBody().getFault().setReason(reason);
- SOAPFaultCode code = factory.createSOAPFaultCode();
- code.setText(Integer.toString(this.response.getStatusLine().getStatusCode()));
- envelope.getBody().getFault().setCode(code);
- }
- responseMsgCtx.setServerSide(true);
- responseMsgCtx.setEnvelope(envelope);
+ responseMsgCtx.setProperty(
+ Constants.Configuration.CHARACTER_SET_ENCODING,
+ contentType.indexOf(HTTP.CHARSET_PARAM) > 0 ?
+ charSetEnc : MessageContext.DEFAULT_CHAR_SET_ENCODING);
- } else {
- // there is no response entity-body
- responseMsgCtx.setProperty(NhttpConstants.NO_ENTITY_BODY, Boolean.TRUE);
- responseMsgCtx.setEnvelope(new SOAP11Factory().getDefaultEnvelope());
+ // workaround for Axis2 TransportUtils.createSOAPMessage() issue, where a response
+ // of content type "text/xml" is thought to be REST if !MC.isServerSide(). This
+ // question is still under debate and due to the timelines, I am commiting this
+ // workaround as Axis2 1.2 is about to be released and Synapse 1.0
+ responseMsgCtx.setServerSide(false);
+ try {
+ envelope = TransportUtils.createSOAPMessage(
+ responseMsgCtx,
+ HTTPTransportUtils.handleGZip(responseMsgCtx, in),
+ contentType);
+
+ } catch (OMException e) {
+ // handle non SOAP and POX/REST payloads (probably text/html)
+ String errorMessage = "Unexpected response received. HTTP response code : "
+ + this.response.getStatusLine().getStatusCode() + " HTTP status : "
+ + this.response.getStatusLine().getReasonPhrase() + " exception : "
+ + e.getMessage();
+
+ log.warn(errorMessage);
+ if (log.isDebugEnabled()) {
+ log.debug(errorMessage, e);
+ log.debug("Creating the SOAPFault to be injected...");
+ }
+ SOAPFactory factory = new SOAP11Factory();
+ envelope = factory.getDefaultFaultEnvelope();
+ SOAPFaultDetail detail = factory.createSOAPFaultDetail();
+ detail.setText(errorMessage);
+ envelope.getBody().getFault().setDetail(detail);
+ SOAPFaultReason reason = factory.createSOAPFaultReason();
+ reason.setText(errorMessage);
+ envelope.getBody().getFault().setReason(reason);
+ SOAPFaultCode code = factory.createSOAPFaultCode();
+ code.setText(Integer.toString(this.response.getStatusLine().getStatusCode()));
+ envelope.getBody().getFault().setCode(code);
}
+ responseMsgCtx.setServerSide(true);
+ responseMsgCtx.setEnvelope(envelope);
// copy the HTTP status code as a message context property with the key HTTP_SC to be
// used at the sender to set the propper status code when passing the message
@@ -251,6 +250,24 @@
}
}
+ private String inferContentType() {
+ // Try to get the content type from the message context
+ Object cTypeProperty = responseMsgCtx.getProperty(NhttpConstants.CONTENT_TYPE);
+ if (cTypeProperty != null) {
+ return cTypeProperty.toString();
+ }
+
+ // Try to get the content type from the axis configuration
+ Parameter cTypeParam = cfgCtx.getAxisConfiguration().getParameter(
+ NhttpConstants.CONTENT_TYPE);
+ if (cTypeParam != null) {
+ return cTypeParam.getValue().toString();
+ }
+
+ // Unable to determine the content type - Return default value
+ return NhttpConstants.DEFAULT_CONTENT_TYPE;
+ }
+
// -------------- utility methods -------------
private void handleException(String msg, Exception e) throws AxisFault {
log.error(msg, e);
Modified: synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/nhttp/NhttpConstants.java
URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/nhttp/NhttpConstants.java?rev=820914&r1=820913&r2=820914&view=diff
==============================================================================
--- synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/nhttp/NhttpConstants.java (original)
+++ synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/nhttp/NhttpConstants.java Fri Oct 2 07:21:19 2009
@@ -46,6 +46,8 @@
public static final String NON_BLOCKING_TRANSPORT = "NonBlockingTransport";
public static final String SERIALIZED_BYTES = "SerializedBytes";
public static final String REQUEST_READ = "REQUEST_READ";
+ public static final String CONTENT_TYPE = "CONTENT_TYPE";
+ public static final String DEFAULT_CONTENT_TYPE = "application/octet-stream";
public static final String SEND_TIMEOUT = "SEND_TIMEOUT";