Author: asankha
Date: Thu May 3 05:31:44 2007
New Revision: 534821
URL: http://svn.apache.org/viewvc?view=rev&rev=534821
Log:
fix SYNAPSE-93 for http/s 202 Accepted with the non-blocking transport
The fix involves creating a dummy message context with an empty SOAP envelope
and passing it back to Synapse as the response received. Synapse needs to now
<send/> this message back to the client, in order to write a 202 Accepted back
to its client. If the client <-> synapse transport is anything other than
http/s, this dummy message would be dropped - e.g. for JMS
Added:
webservices/synapse/trunk/java/modules/nhttp/src/org/apache/axis2/transport/nhttp/NhttpConstants.java
Modified:
webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/core/axis2/SynapseCallbackReceiver.java
webservices/synapse/trunk/java/modules/nhttp/src/org/apache/axis2/transport/nhttp/ClientHandler.java
webservices/synapse/trunk/java/modules/nhttp/src/org/apache/axis2/transport/nhttp/HttpCoreNIOSender.java
Modified:
webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/core/axis2/SynapseCallbackReceiver.java
URL:
http://svn.apache.org/viewvc/webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/core/axis2/SynapseCallbackReceiver.java?view=diff&rev=534821&r1=534820&r2=534821
==============================================================================
---
webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/core/axis2/SynapseCallbackReceiver.java
(original)
+++
webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/core/axis2/SynapseCallbackReceiver.java
Thu May 3 05:31:44 2007
@@ -23,6 +23,7 @@
import org.apache.axis2.client.async.Callback;
import org.apache.axis2.context.MessageContext;
import org.apache.axis2.AxisFault;
+import org.apache.axis2.transport.nhttp.NhttpConstants;
import org.apache.axis2.addressing.RelatesTo;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -97,7 +98,7 @@
private void handleMessage(MessageContext response,
org.apache.synapse.MessageContext
synapseOutMsgCtx) {
- Object o = response.getProperty("sending_fault");
+ Object o = response.getProperty(NhttpConstants.SENDING_FAULT);
if (o != null && Boolean.TRUE.equals(o)) {
// there is a sending fault. propagate the fault to fault handlers.
Modified:
webservices/synapse/trunk/java/modules/nhttp/src/org/apache/axis2/transport/nhttp/ClientHandler.java
URL:
http://svn.apache.org/viewvc/webservices/synapse/trunk/java/modules/nhttp/src/org/apache/axis2/transport/nhttp/ClientHandler.java?view=diff&rev=534821&r1=534820&r2=534821
==============================================================================
---
webservices/synapse/trunk/java/modules/nhttp/src/org/apache/axis2/transport/nhttp/ClientHandler.java
(original)
+++
webservices/synapse/trunk/java/modules/nhttp/src/org/apache/axis2/transport/nhttp/ClientHandler.java
Thu May 3 05:31:44 2007
@@ -33,10 +33,15 @@
import org.apache.axis2.transport.nhttp.util.NativeWorkerPool;
import org.apache.axis2.transport.nhttp.util.WorkerPool;
import org.apache.axis2.transport.nhttp.util.WorkerPoolFactory;
+import org.apache.axis2.description.WSDL2Constants;
+import org.apache.axis2.engine.MessageReceiver;
+import org.apache.axis2.wsdl.WSDLConstants;
+import org.apache.axis2.addressing.AddressingConstants;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.axiom.soap.SOAP11Constants;
import org.apache.axiom.soap.SOAP12Constants;
+import org.apache.axiom.soap.SOAPFactory;
import java.nio.ByteBuffer;
import java.nio.channels.Channels;
@@ -271,6 +276,43 @@
switch (response.getStatusLine().getStatusCode()) {
case HttpStatus.SC_ACCEPTED : {
log.debug("Received a 202 Accepted response");
+
+ // create a dummy message with an empty SOAP envelope and a
property
+ // NhttpConstants.SC_ACCEPTED set to Boolean.TRUE to indicate
this is a
+ // placeholder message for the transport to send a HTTP 202 to
the
+ // client. Should / would be ignored by any transport other
than
+ // nhttp. For example, JMS would not send a reply message for
one-way
+ // operations.
+ MessageContext outMsgCtx =
+ (MessageContext)
context.getAttribute(OUTGOING_MESSAGE_CONTEXT);
+ MessageReceiver mr =
outMsgCtx.getAxisOperation().getMessageReceiver();
+
+ try {
+ MessageContext responseMsgCtx =
outMsgCtx.getOperationContext().
+ getMessageContext(WSDL2Constants.MESSAGE_LABEL_IN);
+ responseMsgCtx.setServerSide(true);
+ responseMsgCtx.setDoingREST(outMsgCtx.isDoingREST());
+ responseMsgCtx.setProperty(MessageContext.TRANSPORT_IN,
+ outMsgCtx.getProperty(MessageContext.TRANSPORT_IN));
+ responseMsgCtx.setTransportIn(outMsgCtx.getTransportIn());
+
responseMsgCtx.setTransportOut(outMsgCtx.getTransportOut());
+
+ responseMsgCtx.setAxisMessage(outMsgCtx.getAxisOperation().
+ getMessage(WSDLConstants.MESSAGE_LABEL_IN_VALUE));
+
responseMsgCtx.setOperationContext(outMsgCtx.getOperationContext());
+
responseMsgCtx.setConfigurationContext(outMsgCtx.getConfigurationContext());
+ responseMsgCtx.setTo(null);
+
+ responseMsgCtx.setEnvelope(
+
((SOAPFactory)outMsgCtx.getEnvelope().getOMFactory()).getDefaultEnvelope());
+
responseMsgCtx.setProperty(AddressingConstants.DISABLE_ADDRESSING_FOR_OUT_MESSAGES,
Boolean.TRUE);
+ responseMsgCtx.setProperty(NhttpConstants.SC_ACCEPTED,
Boolean.TRUE);
+ mr.receive(responseMsgCtx);
+
+ } catch (org.apache.axis2.AxisFault af) {
+ log.error("Unable to report back 202 Accepted state to the
message receiver", af);
+ }
+
return;
}
case HttpStatus.SC_INTERNAL_SERVER_ERROR : {
Modified:
webservices/synapse/trunk/java/modules/nhttp/src/org/apache/axis2/transport/nhttp/HttpCoreNIOSender.java
URL:
http://svn.apache.org/viewvc/webservices/synapse/trunk/java/modules/nhttp/src/org/apache/axis2/transport/nhttp/HttpCoreNIOSender.java?view=diff&rev=534821&r1=534820&r2=534821
==============================================================================
---
webservices/synapse/trunk/java/modules/nhttp/src/org/apache/axis2/transport/nhttp/HttpCoreNIOSender.java
(original)
+++
webservices/synapse/trunk/java/modules/nhttp/src/org/apache/axis2/transport/nhttp/HttpCoreNIOSender.java
Thu May 3 05:31:44 2007
@@ -50,6 +50,7 @@
import org.apache.commons.logging.LogFactory;
import org.apache.http.HttpHost;
import org.apache.http.HttpResponse;
+import org.apache.http.HttpStatus;
import org.apache.http.impl.nio.reactor.DefaultConnectingIOReactor;
import org.apache.http.impl.nio.reactor.SSLIOSessionHandler;
import org.apache.http.nio.NHttpClientConnection;
@@ -308,6 +309,12 @@
HTTP.CONTENT_TYPE,
messageFormatter.getContentType(msgContext, format,
msgContext.getSoapAction()));
+ // 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
(Boolean.TRUE.equals(msgContext.getProperty(NhttpConstants.SC_ACCEPTED))) {
+ response.setStatusCode(HttpStatus.SC_ACCEPTED);
+ }
+
// set any transport headers
Map transportHeaders = (Map)
msgContext.getProperty(MessageContext.TRANSPORT_HEADERS);
if (transportHeaders != null && !transportHeaders.values().isEmpty()) {
@@ -324,7 +331,12 @@
OutputStream out = worker.getOutputStream();
try {
- messageFormatter.writeTo(msgContext, format, out, true);
+ if
(!Boolean.TRUE.equals(msgContext.getProperty(NhttpConstants.SC_ACCEPTED))) {
+ messageFormatter.writeTo(msgContext, format, out, true);
+ } else {
+ // see comment above on the reasoning
+ out.write(new byte[0]);
+ }
out.close();
} catch (IOException e) {
handleException("IO Error sending response message", e);
@@ -417,7 +429,7 @@
MessageContextBuilder.createFaultMessageContext(
/** this is not a mistake I do NOT want
getMessage()*/
mc, new AxisFault(exception.toString(),
exception));
- nioFaultMessageContext.setProperty("sending_fault",
Boolean.TRUE);
+
nioFaultMessageContext.setProperty(NhttpConstants.SENDING_FAULT, Boolean.TRUE);
mr.receive(nioFaultMessageContext);
} catch (AxisFault af) {
Added:
webservices/synapse/trunk/java/modules/nhttp/src/org/apache/axis2/transport/nhttp/NhttpConstants.java
URL:
http://svn.apache.org/viewvc/webservices/synapse/trunk/java/modules/nhttp/src/org/apache/axis2/transport/nhttp/NhttpConstants.java?view=auto&rev=534821
==============================================================================
---
webservices/synapse/trunk/java/modules/nhttp/src/org/apache/axis2/transport/nhttp/NhttpConstants.java
(added)
+++
webservices/synapse/trunk/java/modules/nhttp/src/org/apache/axis2/transport/nhttp/NhttpConstants.java
Thu May 3 05:31:44 2007
@@ -0,0 +1,25 @@
+/*
+ * 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.axis2.transport.nhttp;
+
+public class NhttpConstants {
+ public static final String SC_ACCEPTED = "SC_ACCEPTED";
+ public static final String SENDING_FAULT = "sending_fault";
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]