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