Author: hiranya
Date: Sun Jul 14 21:30:22 2013
New Revision: 1503064

URL: http://svn.apache.org/r1503064
Log:
Fixing a race condition in the new GET handler. Code refactoring and cleanup.

Modified:
    
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/PassThroughConstants.java
    
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/ProtocolState.java
    
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/ServerWorker.java
    
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/SourceHandler.java
    
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/api/PassThroughNHttpGetProcessor.java

Modified: 
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/PassThroughConstants.java
URL: 
http://svn.apache.org/viewvc/synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/PassThroughConstants.java?rev=1503064&r1=1503063&r2=1503064&view=diff
==============================================================================
--- 
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/PassThroughConstants.java
 (original)
+++ 
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/PassThroughConstants.java
 Sun Jul 14 21:30:22 2013
@@ -124,6 +124,6 @@ public class PassThroughConstants {
        
        public static final String FORCE_PASS_THROUGH_BUILDER = 
"force.passthrough.builder";
        
-       public static final String WSDL_GEN_HANDLED = "WSDL_GEN_HANDLED";
+       public static final String GET_REQUEST_HANDLED = "GET_REQUEST_HANDLED";
 
 }

Modified: 
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/ProtocolState.java
URL: 
http://svn.apache.org/viewvc/synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/ProtocolState.java?rev=1503064&r1=1503063&r2=1503064&view=diff
==============================================================================
--- 
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/ProtocolState.java
 (original)
+++ 
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/ProtocolState.java
 Sun Jul 14 21:30:22 2013
@@ -35,7 +35,7 @@ public enum ProtocolState {
     REQUEST_DONE,
     /** The connection is reading the response headers */
     RESPONSE_HEAD,
-    /** The connection si reading the response body */
+    /** The connection is reading the response body */
     RESPONSE_BODY,
     /** The response is completed */
     RESPONSE_DONE,
@@ -43,6 +43,6 @@ public enum ProtocolState {
     CLOSING,
     /** The connection is closed */
     CLOSED,
-    /** WSDL response has been sent */
-    WSDL_XSD_RESPONSE_DONE
+    /** GET request has been responded to */
+    GET_REQUEST_COMPLETE
 }

Modified: 
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/ServerWorker.java
URL: 
http://svn.apache.org/viewvc/synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/ServerWorker.java?rev=1503064&r1=1503063&r2=1503064&view=diff
==============================================================================
--- 
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/ServerWorker.java
 (original)
+++ 
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/ServerWorker.java
 Sun Jul 14 21:30:22 2013
@@ -184,9 +184,9 @@ public class ServerWorker implements Run
                } 
                
                //need special case to handle REST
-               boolean restHandle =false;
+               boolean restHandle = false;
                if 
(msgContext.getProperty(PassThroughConstants.REST_GET_DELETE_INVOKE) != null &&
-                
(Boolean)msgContext.getProperty(PassThroughConstants.REST_GET_DELETE_INVOKE)){
+                (Boolean) 
msgContext.getProperty(PassThroughConstants.REST_GET_DELETE_INVOKE)){
                        msgContext.setProperty(HTTPConstants.HTTP_METHOD, 
method);
                msgContext.setServerSide(true);
                msgContext.setDoingREST(true);
@@ -196,13 +196,13 @@ public class ServerWorker implements Run
                        restHandle = true;
                }
                
-               //if WSDL done then moved out rather than hand over to entity 
handle methods.
+               // If WSDL generation is done then move out rather than hand 
over to
+               // entity handle methods.
                SourceContext info = (SourceContext) 
request.getConnection().getContext().
                 getAttribute(SourceContext.CONNECTION_INFORMATION);
-               if (info != null &&
-                   
info.getState().equals(ProtocolState.WSDL_XSD_RESPONSE_DONE) ||
-                   
(msgContext.getProperty(PassThroughConstants.WSDL_GEN_HANDLED) != null &&
-                    
Boolean.TRUE.equals((msgContext.getProperty(PassThroughConstants.WSDL_GEN_HANDLED)))))
 {
+        Object getHandled = 
msgContext.getProperty(PassThroughConstants.GET_REQUEST_HANDLED);
+               if ((info != null && 
info.getState().equals(ProtocolState.GET_REQUEST_COMPLETE)) ||
+                Boolean.TRUE.equals(getHandled)) {
                        return;
                }
                

Modified: 
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/SourceHandler.java
URL: 
http://svn.apache.org/viewvc/synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/SourceHandler.java?rev=1503064&r1=1503063&r2=1503064&view=diff
==============================================================================
--- 
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/SourceHandler.java
 (original)
+++ 
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/SourceHandler.java
 Sun Jul 14 21:30:22 2013
@@ -83,7 +83,7 @@ public class SourceHandler implements NH
                     System.currentTimeMillis());
                 
             if (!SourceContext.assertState(conn, ProtocolState.REQUEST_READY) 
&&
-                    !SourceContext.assertState(conn, 
ProtocolState.WSDL_XSD_RESPONSE_DONE)) {
+                    !SourceContext.assertState(conn, 
ProtocolState.GET_REQUEST_COMPLETE)) {
                 handleInvalidState(conn, "Request received");
                 return;
             }
@@ -192,7 +192,7 @@ public class SourceHandler implements NH
             ProtocolState protocolState = SourceContext.getState(conn);
             
             //special case to handle WSDLs
-            if(protocolState == ProtocolState.WSDL_XSD_RESPONSE_DONE){
+            if(protocolState == ProtocolState.GET_REQUEST_COMPLETE){
                // we need to shut down if the shutdown flag is set
                 HttpContext context = conn.getContext();
                 ContentOutputBuffer outBuf = (ContentOutputBuffer) 
context.getAttribute(

Modified: 
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/api/PassThroughNHttpGetProcessor.java
URL: 
http://svn.apache.org/viewvc/synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/api/PassThroughNHttpGetProcessor.java?rev=1503064&r1=1503063&r2=1503064&view=diff
==============================================================================
--- 
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/api/PassThroughNHttpGetProcessor.java
 (original)
+++ 
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/api/PassThroughNHttpGetProcessor.java
 Sun Jul 14 21:30:22 2013
@@ -102,14 +102,10 @@ public class PassThroughNHttpGetProcesso
                }
 
                if (isServiceListBlocked(uri)) {
-                       response.setStatusCode(HttpStatus.SC_FORBIDDEN);
-                       sourceHandler.commitResponseHideExceptions(conn, 
response);
-            closeOutputStream(os);
+            sendResponseAndFinish(response, HttpStatus.SC_FORBIDDEN, conn, os, 
msgContext);
                } else if (uri.equals("/favicon.ico")) {
-                       response.setStatusCode(HttpStatus.SC_MOVED_PERMANENTLY);
                        response.addHeader(LOCATION, 
"http://ws.apache.org/favicon.ico";);
-                       sourceHandler.commitResponseHideExceptions(conn, 
response);
-            closeOutputStream(os);
+            sendResponseAndFinish(response, HttpStatus.SC_MOVED_PERMANENTLY, 
conn, os, msgContext);
                } else if (serviceName != null && 
parameters.containsKey("wsdl")) {
                        generateWsdl(response, msgContext, conn, os, 
serviceName, parameters);
                } else if (serviceName != null && 
parameters.containsKey("wsdl2")) {
@@ -121,6 +117,26 @@ public class PassThroughNHttpGetProcesso
                }
        }
 
+    private void sendResponseAndFinish(HttpResponse response, int status,
+                                       NHttpServerConnection conn, 
OutputStream os,
+                                       MessageContext msgContext) {
+        response.setStatusCode(status);
+        SourceContext.updateState(conn, ProtocolState.GET_REQUEST_COMPLETE);
+        sourceHandler.commitResponseHideExceptions(conn, response);
+        closeOutputStream(os);
+        msgContext.setProperty(PassThroughConstants.GET_REQUEST_HANDLED, true);
+    }
+
+    private void sendResponseAndFinish(HttpResponse response, byte[] data,
+                                       NHttpServerConnection conn, 
OutputStream os,
+                                       MessageContext msgContext) throws 
IOException {
+        SourceContext.updateState(conn, ProtocolState.GET_REQUEST_COMPLETE);
+        sourceHandler.commitResponseHideExceptions(conn, response);
+        os.write(data);
+        closeOutputStream(os);
+        msgContext.setProperty(PassThroughConstants.GET_REQUEST_HANDLED, true);
+    }
+
        private void closeOutputStream(OutputStream os) {
                try {
                        os.flush();
@@ -161,11 +177,9 @@ public class PassThroughNHttpGetProcesso
                                        // here the parameter value should be 
the wsdl file name
                                        service.printUserWSDL(baos, 
parameterValue);
                                }
-                               SourceContext.updateState(conn, 
ProtocolState.WSDL_XSD_RESPONSE_DONE);
-                               response.addHeader(CONTENT_TYPE, TEXT_XML);
-                               
sourceHandler.commitResponseHideExceptions(conn, response);
-                               os.write(baos.toByteArray());
-                               closeOutputStream(os);
+
+                response.addHeader(CONTENT_TYPE, TEXT_XML);
+                sendResponseAndFinish(response, baos.toByteArray(), conn, os, 
msgContext);
 
                        } catch (Exception e) {
                                handleBrowserException(response, conn, os,
@@ -209,11 +223,7 @@ public class PassThroughNHttpGetProcesso
                                ByteArrayOutputStream baos = new 
ByteArrayOutputStream();
                                service.printWSDL2(baos, getIpAddress());
                                response.addHeader(CONTENT_TYPE, TEXT_XML);
-                               SourceContext.updateState(conn, 
ProtocolState.WSDL_XSD_RESPONSE_DONE);
-                               
sourceHandler.commitResponseHideExceptions(conn, response);
-                               os.write(baos.toByteArray());
-                               closeOutputStream(os);
-
+                sendResponseAndFinish(response, baos.toByteArray(), conn, os, 
msgContext);
                        } catch (Exception e) {
                                handleBrowserException(response, conn, os,
                                                "Error generating ?wsdl2 output 
for service : "
@@ -280,7 +290,7 @@ public class PassThroughNHttpGetProcesso
         *
         * @param response
         *            HttpResponse
-        * @param messageCtx
+        * @param msgContext
         *            Current MessageContext
         * @param conn
         *            NHttpServerConnection
@@ -292,7 +302,7 @@ public class PassThroughNHttpGetProcesso
         *            url parameters
         */
        protected void generateXsd(HttpResponse response,
-                       MessageContext messageCtx, NHttpServerConnection conn,
+                       MessageContext msgContext, NHttpServerConnection conn,
                        OutputStream os, String serviceName,
                        Map<String, String> parameters) {
                if (parameters.get("xsd") == null || 
"".equals(parameters.get("xsd"))) {
@@ -303,19 +313,14 @@ public class PassThroughNHttpGetProcesso
                                        ByteArrayOutputStream baos = new 
ByteArrayOutputStream();
                                        service.printSchema(baos);
                                        response.addHeader(CONTENT_TYPE, 
TEXT_XML);
-                                       SourceContext.updateState(conn, 
ProtocolState.WSDL_XSD_RESPONSE_DONE);
-                                       
sourceHandler.commitResponseHideExceptions(conn, response);
-                                       os.write(baos.toByteArray());
-                                       closeOutputStream(os);
-
+                    sendResponseAndFinish(response, baos.toByteArray(), conn, 
os, msgContext);
                                } catch (Exception e) {
                                        handleBrowserException(response, conn, 
os,
                                                        "Error generating ?xsd 
output for service : "
                                                                        + 
serviceName, e);
                                }
                        } else {
-                               
messageCtx.setProperty(PassThroughConstants.REST_GET_DELETE_INVOKE,
-                                               true);
+                               
msgContext.setProperty(PassThroughConstants.REST_GET_DELETE_INVOKE, true);
                        }
 
                } else {
@@ -347,6 +352,7 @@ public class PassThroughNHttpGetProcesso
                                                                response);
                                                os.write(baos.toByteArray());
                                                closeOutputStream(os);
+                        
msgContext.setProperty(PassThroughConstants.GET_REQUEST_HANDLED, true);
                                        } catch (Exception e) {
                                                
handleBrowserException(response, conn, os,
                                                                "Error 
generating named ?xsd output for service : "
@@ -357,10 +363,10 @@ public class PassThroughNHttpGetProcesso
                                        // no schema available by that name - 
send 404
                                        
response.setStatusCode(HttpStatus.SC_NOT_FOUND);
                                        closeOutputStream(os);
+                    
msgContext.setProperty(PassThroughConstants.GET_REQUEST_HANDLED, true);
                                }
                        } else {
-                               
messageCtx.setProperty(PassThroughConstants.REST_GET_DELETE_INVOKE,
-                                               true);
+                               
msgContext.setProperty(PassThroughConstants.REST_GET_DELETE_INVOKE, true);
                        }
                }
        }


Reply via email to