Author: asankha
Date: Sat Mar 21 05:24:43 2009
New Revision: 756878

URL: http://svn.apache.org/viewvc?rev=756878&view=rev
Log:
commit fix for SYNAPSE-521 from Eric Hubert

Modified:
    
synapse/trunk/java/modules/extensions/src/main/java/org/apache/synapse/format/hessian/HessianMessageBuilder.java
    
synapse/trunk/java/modules/transports/src/main/java/org/apache/synapse/transport/nhttp/HttpCoreNIOSender.java
    
synapse/trunk/java/modules/transports/src/main/java/org/apache/synapse/transport/nhttp/NhttpConstants.java

Modified: 
synapse/trunk/java/modules/extensions/src/main/java/org/apache/synapse/format/hessian/HessianMessageBuilder.java
URL: 
http://svn.apache.org/viewvc/synapse/trunk/java/modules/extensions/src/main/java/org/apache/synapse/format/hessian/HessianMessageBuilder.java?rev=756878&r1=756877&r2=756878&view=diff
==============================================================================
--- 
synapse/trunk/java/modules/extensions/src/main/java/org/apache/synapse/format/hessian/HessianMessageBuilder.java
 (original)
+++ 
synapse/trunk/java/modules/extensions/src/main/java/org/apache/synapse/format/hessian/HessianMessageBuilder.java
 Sat Mar 21 05:24:43 2009
@@ -33,6 +33,7 @@
 import org.apache.commons.logging.LogFactory;
 import org.apache.synapse.SynapseConstants;
 import org.apache.synapse.core.SynapseEnvironment;
+import org.apache.synapse.transport.nhttp.NhttpConstants;
 import org.apache.synapse.util.SynapseBinaryDataSource;
 
 import javax.activation.DataHandler;
@@ -94,6 +95,9 @@
             }
             OMText textData = factory.createOMText(dataHandler, true);
             element.addChild(textData);
+            
+            // indicate that message faults shall be handled as http 200
+            messageContext.setProperty(NhttpConstants.FAULTS_AS_HTTP_200, 
NhttpConstants.TRUE);
 
         } catch (IOException e) {
             String msg = "Unable to create the HessianDataSource";

Modified: 
synapse/trunk/java/modules/transports/src/main/java/org/apache/synapse/transport/nhttp/HttpCoreNIOSender.java
URL: 
http://svn.apache.org/viewvc/synapse/trunk/java/modules/transports/src/main/java/org/apache/synapse/transport/nhttp/HttpCoreNIOSender.java?rev=756878&r1=756877&r2=756878&view=diff
==============================================================================
--- 
synapse/trunk/java/modules/transports/src/main/java/org/apache/synapse/transport/nhttp/HttpCoreNIOSender.java
 (original)
+++ 
synapse/trunk/java/modules/transports/src/main/java/org/apache/synapse/transport/nhttp/HttpCoreNIOSender.java
 Sat Mar 21 05:24:43 2009
@@ -431,27 +431,7 @@
             HTTP.CONTENT_TYPE,
             messageFormatter.getContentType(msgContext, format, 
msgContext.getSoapAction()));
 
-        // return http 500 when a SOAP fault is returned
-        if (msgContext.getEnvelope().getBody().hasFault() || 
msgContext.isProcessingFault()) {
-            response.setStatusCode(HttpStatus.SC_INTERNAL_SERVER_ERROR);
-        }
-
-        // if this is a dummy message to handle http 202 case with 
non-blocking IO
-        // set the status code to 202 and the message body to an empty byte 
array (see below)
-        if (msgContext.isPropertyTrue(NhttpConstants.SC_ACCEPTED)) {
-            response.setStatusCode(HttpStatus.SC_ACCEPTED);
-        } else {
-            Object statusCode = msgContext.getProperty(NhttpConstants.HTTP_SC);
-            if (statusCode != null) {
-                try {
-                    response.setStatusCode(Integer.parseInt(
-                            
msgContext.getProperty(NhttpConstants.HTTP_SC).toString()));
-                } catch (NumberFormatException e) {
-                    log.warn("Unable to set the HTTP Status Code from " +
-                            "the property HHTP_SC with value : " + statusCode);
-                }
-            }
-        }
+        response.setStatusCode(determineHttpStatusCode(msgContext, response));
 
         // set any transport headers
         Map transportHeaders = (Map) 
msgContext.getProperty(MessageContext.TRANSPORT_HEADERS);
@@ -472,8 +452,11 @@
             
lstMetrics.reportResponseCode(response.getStatusLine().getStatusCode());
             OutputStream out = worker.getOutputStream();
 
+            /* 
+             * if this is a dummy message to handle http 202 case with 
non-blocking IO
+             * write an empty byte array as body
+             */ 
             if (msgContext.isPropertyTrue(NhttpConstants.SC_ACCEPTED)) {
-                // see comment above on the reasoning
                 out.write(new byte[0]);
             } else {
                 messageFormatter.writeTo(msgContext, format, out, false);
@@ -521,6 +504,67 @@
         }
     }
 
+    /**
+     * Determine the HttpStatusCodedepending on the message type processed <br>
+     * (normal response versus fault response) as well as Axis2 message 
context properties set
+     * via Synapse configuration or MessageBuilders.
+     * 
+     * @see NhttpConstants.FAULTS_AS_HTTP_200
+     * @see NhttpConstants.HTTP_SC
+     * 
+     * @param msgContext the Axis2 message context 
+     * @param response the HTTP response object
+     * 
+     * @return the HTTP status code to set in the HTTP response object
+     */
+    private int determineHttpStatusCode(MessageContext msgContext, 
HttpResponse response) {
+        
+        int httpStatus = HttpStatus.SC_OK;
+        
+        // retrieve original status code (if present)
+        if (response.getStatusLine() != null) {
+            httpStatus = response.getStatusLine().getStatusCode();
+        }
+        
+        // if this is a dummy message to handle http 202 case with 
non-blocking IO
+        // set the status code to 202
+        if (msgContext.isPropertyTrue(NhttpConstants.SC_ACCEPTED)) {
+            httpStatus = HttpStatus.SC_ACCEPTED;
+        } else {            
+            
+            // is this a fault message
+            boolean handleFault = 
+                msgContext.getEnvelope().getBody().hasFault() || 
msgContext.isProcessingFault();
+            
+            // shall faults be transmitted with HTTP 200
+            boolean faultsAsHttp200 =
+                NhttpConstants.TRUE.equals(
+                    msgContext.getProperty(NhttpConstants.FAULTS_AS_HTTP_200));
+            
+            // Set HTTP status code to 500 if this is a fault case and we 
shall not use HTTP 200
+            if (handleFault && !faultsAsHttp200) {
+                httpStatus = HttpStatus.SC_INTERNAL_SERVER_ERROR;
+            }
+            
+            /* 
+             * Any status code previously set shall be overwritten with the 
value of the following
+             * message context property if it is set. 
+             */
+            Object statusCode = msgContext.getProperty(NhttpConstants.HTTP_SC);
+            if (statusCode != null) {
+                try {
+                    httpStatus = Integer.parseInt(
+                            
msgContext.getProperty(NhttpConstants.HTTP_SC).toString());
+                } catch (NumberFormatException e) {
+                    log.warn("Unable to set the HTTP status code from the 
property " 
+                            + NhttpConstants.HTTP_SC + " with value: " + 
statusCode);
+                }
+            }
+        }
+        
+        return httpStatus;
+    }
+
     private void sendUsingOutputStream(MessageContext msgContext) throws 
AxisFault {
 
         OMOutputFormat format = NhttpUtil.getOMOutputFormat(msgContext);

Modified: 
synapse/trunk/java/modules/transports/src/main/java/org/apache/synapse/transport/nhttp/NhttpConstants.java
URL: 
http://svn.apache.org/viewvc/synapse/trunk/java/modules/transports/src/main/java/org/apache/synapse/transport/nhttp/NhttpConstants.java?rev=756878&r1=756877&r2=756878&view=diff
==============================================================================
--- 
synapse/trunk/java/modules/transports/src/main/java/org/apache/synapse/transport/nhttp/NhttpConstants.java
 (original)
+++ 
synapse/trunk/java/modules/transports/src/main/java/org/apache/synapse/transport/nhttp/NhttpConstants.java
 Sat Mar 21 05:24:43 2009
@@ -26,6 +26,7 @@
      * has information that the current message is a fault (e.g. SOAP faults, 
non-HTTP 2xx, etc)
      */
     public static final String FAULT_MESSAGE = "FAULT_MESSAGE"; // corresponds 
with BaseConstants
+    public static final String FAULTS_AS_HTTP_200 = "FAULTS_AS_HTTP_200";
     public static final String SC_ACCEPTED = "SC_ACCEPTED";
     public static final String HTTP_SC = "HTTP_SC";
     public static final String FORCE_HTTP_1_0 = "FORCE_HTTP_1.0";


Reply via email to