You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@synapse.apache.org by Hiranya Jayathilaka <hi...@gmail.com> on 2010/10/08 01:49:39 UTC
Re: svn commit: r1005337 - in /synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/nhttp:
HttpCoreNIOSender.java NhttpConstants.java
2.0 branch?
Thanks,
Hiranya
On Thu, Oct 7, 2010 at 11:55 AM, <su...@apache.org> wrote:
> Author: supun
> Date: Thu Oct 7 06:25:32 2010
> New Revision: 1005337
>
> URL: http://svn.apache.org/viewvc?rev=1005337&view=rev
> Log:
> adding the capability to force content length
>
> Modified:
> synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/nhttp/HttpCoreNIOSender.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/HttpCoreNIOSender.java
> URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/nhttp/HttpCoreNIOSender.java?rev=1005337&r1=1005336&r2=1005337&view=diff
> ==============================================================================
> --- synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/nhttp/HttpCoreNIOSender.java (original)
> +++ synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/nhttp/HttpCoreNIOSender.java Thu Oct 7 06:25:32 2010
> @@ -40,6 +40,7 @@ import org.apache.axis2.util.JavaUtils;
> import org.apache.commons.logging.Log;
> import org.apache.commons.logging.LogFactory;
> import org.apache.http.*;
> +import org.apache.http.entity.BasicHttpEntity;
> import org.apache.http.impl.nio.reactor.DefaultConnectingIOReactor;
> import org.apache.http.impl.nio.reactor.SSLIOSessionHandler;
> import org.apache.http.nio.NHttpClientConnection;
> @@ -60,6 +61,7 @@ import org.apache.synapse.transport.nhtt
> import org.apache.synapse.transport.nhttp.util.MessageFormatterDecoratorFactory;
> import org.apache.synapse.transport.nhttp.util.NhttpUtil;
> import org.apache.synapse.transport.nhttp.util.NhttpMetricsCollector;
> +import org.apache.synapse.commons.util.TemporaryData;
>
> import javax.net.ssl.SSLContext;
> import java.io.IOException;
> @@ -458,9 +460,11 @@ public class HttpCoreNIOSender extends A
> */
> private void sendAsyncResponse(MessageContext msgContext) throws AxisFault {
>
> + int contentLength = extractContentLength(msgContext);
> +
> // remove unwanted HTTP headers (if any from the current message)
> removeUnwantedHeaders(msgContext);
> -
> +
> ServerWorker worker = (ServerWorker) msgContext.getProperty(Constants.OUT_TRANSPORT_INFO);
> HttpResponse response = worker.getResponse();
>
> @@ -488,31 +492,24 @@ public class HttpCoreNIOSender extends A
> }
> }
>
> - if (JavaUtils.isTrueExplicitly(worker.getConn().getContext().getAttribute("forceClosing"))) {
> - HttpRequest req = (HttpRequest)
> - worker.getConn().getContext().getAttribute("http.request");
> - req.setHeader(HTTP.CONN_DIRECTIVE, HTTP.CONN_CLOSE);
> - }
> -
> - // pass ClientConnectionDebug to the Server side
> - ServerConnectionDebug scd = (ServerConnectionDebug)
> - worker.getConn().getContext().getAttribute(ServerHandler.SERVER_CONNECTION_DEBUG);
> - ClientConnectionDebug ccd = (ClientConnectionDebug)
> - msgContext.getProperty(ClientHandler.CLIENT_CONNECTION_DEBUG);
> -
> - if (scd != null && ccd != null) {
> - scd.setClientConnectionDebug(ccd);
> - } else if (scd == null && ccd != null) {
> - scd = ccd.getServerConnectionDebug();
> - scd.setClientConnectionDebug(ccd);
> - }
> + boolean forceContentLength = msgContext.isPropertyTrue(
> + NhttpConstants.FORCE_HTTP_CONTENT_LENGTH);
> + boolean forceContentLengthCopy = msgContext.isPropertyTrue(
> + NhttpConstants.COPY_CONTENT_LENGTH_FROM_INCOMING);
>
> - if (scd != null) {
> - scd.recordResponseStartTime();
> - }
> + BasicHttpEntity entity = (BasicHttpEntity) response.getEntity();
>
> MetricsCollector lstMetrics = worker.getServiceHandler().getMetrics();
> try {
> + if (forceContentLength) {
> + entity.setChunked(false);
> + if (forceContentLengthCopy && contentLength > 0) {
> + entity.setContentLength(contentLength);
> + } else {
> + setStreamAsTempData(entity, messageFormatter, msgContext, format);
> + }
> + }
> +
> worker.getServiceHandler().commitResponse(worker.getConn(), response);
> lstMetrics.reportResponseCode(response.getStatusLine().getStatusCode());
> OutputStream out = worker.getOutputStream();
> @@ -525,41 +522,49 @@ public class HttpCoreNIOSender extends A
> || Boolean.TRUE == noEntityBody) {
> out.write(new byte[0]);
> } else {
> - messageFormatter.writeTo(msgContext, format, out, false);
> + if (forceContentLength) {
> + if (forceContentLengthCopy && contentLength > 0) {
> + messageFormatter.writeTo(msgContext, format, out, false);
> + } else {
> + writeMessageFromTempData(out, msgContext);
> + }
> + } else {
> + messageFormatter.writeTo(msgContext, format, out, false);
> + }
> }
> out.close();
> - lstMetrics.incrementMessagesSent();
> + if (lstMetrics != null) {
> + lstMetrics.incrementMessagesSent();
> + }
>
> } catch (HttpException e) {
> if (lstMetrics != null) {
> lstMetrics.incrementFaultsSending();
> }
> handleException("Unexpected HTTP protocol error sending response to : " +
> - worker.getRemoteAddress() + "\n" + scd.dump(), e);
> + worker.getRemoteAddress(), e);
> } catch (ConnectionClosedException e) {
> if (lstMetrics != null) {
> lstMetrics.incrementFaultsSending();
> }
> - log.warn("Connection closed by client : "
> - + worker.getRemoteAddress() + "\n" + scd.dump());
> + log.warn("Connection closed by client : " + worker.getRemoteAddress());
> } catch (IllegalStateException e) {
> if (lstMetrics != null) {
> lstMetrics.incrementFaultsSending();
> }
> - log.warn("Connection closed by client : "
> - + worker.getRemoteAddress() + "\n" + scd.dump());
> + log.warn("Connection closed by client : " + worker.getRemoteAddress());
> } catch (IOException e) {
> if (lstMetrics != null) {
> lstMetrics.incrementFaultsSending();
> }
> handleException("IO Error sending response message to : " +
> - worker.getRemoteAddress() + "\n" + scd.dump(), e);
> + worker.getRemoteAddress(), e);
> } catch (Exception e) {
> if (lstMetrics != null) {
> lstMetrics.incrementFaultsSending();
> }
> handleException("General Error sending response message to : " +
> - worker.getRemoteAddress() + "\n" + scd.dump(), e);
> + worker.getRemoteAddress(), e);
> }
>
> InputStream is = worker.getIs();
> @@ -571,6 +576,76 @@ public class HttpCoreNIOSender extends A
> }
>
> /**
> + * Extract the content length from the incoming message
> + *
> + * @param msgContext current MessageContext
> + * @return the length of the message
> + */
> + private int extractContentLength(MessageContext msgContext) {
> + Map headers = (Map) msgContext.getProperty(MessageContext.TRANSPORT_HEADERS);
> +
> + if (headers == null || headers.isEmpty()) {
> + return -1;
> + }
> +
> + for (Object o : headers.keySet()) {
> + String headerName = (String) o;
> + if (HTTP.CONTENT_LEN.equalsIgnoreCase(headerName)) {
> + Object value = headers.get(headerName);
> +
> + if (value != null && value instanceof String) {
> + try {
> + return Integer.parseInt((String) value);
> + } catch (NumberFormatException e) {
> + return -1;
> + }
> + }
> + }
> + }
> +
> + return -1;
> + }
> +
> + /**
> + * Write the stream to a temporary storage and calculate the content length
> + * @param entity HTTPEntity
> + * @param messageFormatter message formatter
> + * @param msgContext current message context
> + * @param format message format
> + * @throws IOException if an exception occurred while writing data
> + */
> + private void setStreamAsTempData(BasicHttpEntity entity, MessageFormatter messageFormatter,
> + MessageContext msgContext, OMOutputFormat format)
> + throws IOException {
> + TemporaryData serialized = new TemporaryData(256, 4096, "http-nio_", ".dat");
> + OutputStream out = serialized.getOutputStream();
> + try {
> + messageFormatter.writeTo(msgContext, format, out, true);
> + } finally {
> + out.close();
> + }
> + msgContext.setProperty(NhttpConstants.SERIALIZED_BYTES, serialized);
> + entity.setContentLength(serialized.getLength());
> + }
> +
> + /**
> + * Take the data from temporary storage and write it to the output stream
> + * @param out output stream output stream
> + * @param msgContext messagecontext
> + * @throws IOException if an exception occurred while writing data
> + */
> + private void writeMessageFromTempData(OutputStream out, MessageContext msgContext)
> + throws IOException {
> + TemporaryData serialized =
> + (TemporaryData) msgContext.getProperty(NhttpConstants.SERIALIZED_BYTES);
> + try {
> + serialized.writeTo(out);
> + } finally {
> + serialized.release();
> + }
> + }
> +
> + /**
> * 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.
>
> 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=1005337&r1=1005336&r2=1005337&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 Thu Oct 7 06:25:32 2010
> @@ -30,6 +30,9 @@ public class NhttpConstants {
> 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";
> + public static final String FORCE_HTTP_CONTENT_LENGTH = "FORCE_HTTP_CONTENT_LENGTH";
> + public static final String COPY_CONTENT_LENGTH_FROM_INCOMING =
> + "COPY_CONTENT_LENGTH_FROM_INCOMING";
> public static final String DISABLE_CHUNKING = "DISABLE_CHUNKING";
> public static final String POST_TO_URI = "POST_TO_URI";
> public static final String NO_KEEPALIVE = "NO_KEEPALIVE";
>
>
>
--
Hiranya Jayathilaka
Senior Software Engineer;
WSO2 Inc.; http://wso2.org
E-mail: hiranya@wso2.com; Mobile: +94 77 633 3491
Blog: http://techfeast-hiranya.blogspot.com
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@synapse.apache.org
For additional commands, e-mail: dev-help@synapse.apache.org
Re: svn commit: r1005337 - in /synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/nhttp:
HttpCoreNIOSender.java NhttpConstants.java
Posted by Supun Kamburugamuva <su...@gmail.com>.
I was thinking weather it is too late. Since we haven't done the final packs
I'll incorporate in to 2.0 as well.
Thanks,
Supun..
On Fri, Oct 8, 2010 at 5:19 AM, Hiranya Jayathilaka <hi...@gmail.com>wrote:
> 2.0 branch?
>
> Thanks,
> Hiranya
>
> On Thu, Oct 7, 2010 at 11:55 AM, <su...@apache.org> wrote:
> > Author: supun
> > Date: Thu Oct 7 06:25:32 2010
> > New Revision: 1005337
> >
> > URL: http://svn.apache.org/viewvc?rev=1005337&view=rev
> > Log:
> > adding the capability to force content length
> >
> > Modified:
> >
> synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/nhttp/HttpCoreNIOSender.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/HttpCoreNIOSender.java
> > URL:
> http://svn.apache.org/viewvc/synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/nhttp/HttpCoreNIOSender.java?rev=1005337&r1=1005336&r2=1005337&view=diff
> >
> ==============================================================================
> > ---
> synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/nhttp/HttpCoreNIOSender.java
> (original)
> > +++
> synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/nhttp/HttpCoreNIOSender.java
> Thu Oct 7 06:25:32 2010
> > @@ -40,6 +40,7 @@ import org.apache.axis2.util.JavaUtils;
> > import org.apache.commons.logging.Log;
> > import org.apache.commons.logging.LogFactory;
> > import org.apache.http.*;
> > +import org.apache.http.entity.BasicHttpEntity;
> > import org.apache.http.impl.nio.reactor.DefaultConnectingIOReactor;
> > import org.apache.http.impl.nio.reactor.SSLIOSessionHandler;
> > import org.apache.http.nio.NHttpClientConnection;
> > @@ -60,6 +61,7 @@ import org.apache.synapse.transport.nhtt
> > import
> org.apache.synapse.transport.nhttp.util.MessageFormatterDecoratorFactory;
> > import org.apache.synapse.transport.nhttp.util.NhttpUtil;
> > import org.apache.synapse.transport.nhttp.util.NhttpMetricsCollector;
> > +import org.apache.synapse.commons.util.TemporaryData;
> >
> > import javax.net.ssl.SSLContext;
> > import java.io.IOException;
> > @@ -458,9 +460,11 @@ public class HttpCoreNIOSender extends A
> > */
> > private void sendAsyncResponse(MessageContext msgContext) throws
> AxisFault {
> >
> > + int contentLength = extractContentLength(msgContext);
> > +
> > // remove unwanted HTTP headers (if any from the current message)
> > removeUnwantedHeaders(msgContext);
> > -
> > +
> > ServerWorker worker = (ServerWorker)
> msgContext.getProperty(Constants.OUT_TRANSPORT_INFO);
> > HttpResponse response = worker.getResponse();
> >
> > @@ -488,31 +492,24 @@ public class HttpCoreNIOSender extends A
> > }
> > }
> >
> > - if
> (JavaUtils.isTrueExplicitly(worker.getConn().getContext().getAttribute("forceClosing")))
> {
> > - HttpRequest req = (HttpRequest)
> > -
> worker.getConn().getContext().getAttribute("http.request");
> > - req.setHeader(HTTP.CONN_DIRECTIVE, HTTP.CONN_CLOSE);
> > - }
> > -
> > - // pass ClientConnectionDebug to the Server side
> > - ServerConnectionDebug scd = (ServerConnectionDebug)
> > -
> worker.getConn().getContext().getAttribute(ServerHandler.SERVER_CONNECTION_DEBUG);
> > - ClientConnectionDebug ccd = (ClientConnectionDebug)
> > -
> msgContext.getProperty(ClientHandler.CLIENT_CONNECTION_DEBUG);
> > -
> > - if (scd != null && ccd != null) {
> > - scd.setClientConnectionDebug(ccd);
> > - } else if (scd == null && ccd != null) {
> > - scd = ccd.getServerConnectionDebug();
> > - scd.setClientConnectionDebug(ccd);
> > - }
> > + boolean forceContentLength = msgContext.isPropertyTrue(
> > + NhttpConstants.FORCE_HTTP_CONTENT_LENGTH);
> > + boolean forceContentLengthCopy = msgContext.isPropertyTrue(
> > + NhttpConstants.COPY_CONTENT_LENGTH_FROM_INCOMING);
> >
> > - if (scd != null) {
> > - scd.recordResponseStartTime();
> > - }
> > + BasicHttpEntity entity = (BasicHttpEntity) response.getEntity();
> >
> > MetricsCollector lstMetrics =
> worker.getServiceHandler().getMetrics();
> > try {
> > + if (forceContentLength) {
> > + entity.setChunked(false);
> > + if (forceContentLengthCopy && contentLength > 0) {
> > + entity.setContentLength(contentLength);
> > + } else {
> > + setStreamAsTempData(entity, messageFormatter,
> msgContext, format);
> > + }
> > + }
> > +
> > worker.getServiceHandler().commitResponse(worker.getConn(),
> response);
> >
> lstMetrics.reportResponseCode(response.getStatusLine().getStatusCode());
> > OutputStream out = worker.getOutputStream();
> > @@ -525,41 +522,49 @@ public class HttpCoreNIOSender extends A
> > || Boolean.TRUE == noEntityBody) {
> > out.write(new byte[0]);
> > } else {
> > - messageFormatter.writeTo(msgContext, format, out,
> false);
> > + if (forceContentLength) {
> > + if (forceContentLengthCopy && contentLength > 0) {
> > + messageFormatter.writeTo(msgContext, format,
> out, false);
> > + } else {
> > + writeMessageFromTempData(out, msgContext);
> > + }
> > + } else {
> > + messageFormatter.writeTo(msgContext, format, out,
> false);
> > + }
> > }
> > out.close();
> > - lstMetrics.incrementMessagesSent();
> > + if (lstMetrics != null) {
> > + lstMetrics.incrementMessagesSent();
> > + }
> >
> > } catch (HttpException e) {
> > if (lstMetrics != null) {
> > lstMetrics.incrementFaultsSending();
> > }
> > handleException("Unexpected HTTP protocol error sending
> response to : " +
> > - worker.getRemoteAddress() + "\n" + scd.dump(), e);
> > + worker.getRemoteAddress(), e);
> > } catch (ConnectionClosedException e) {
> > if (lstMetrics != null) {
> > lstMetrics.incrementFaultsSending();
> > }
> > - log.warn("Connection closed by client : "
> > - + worker.getRemoteAddress() + "\n" + scd.dump());
> > + log.warn("Connection closed by client : " +
> worker.getRemoteAddress());
> > } catch (IllegalStateException e) {
> > if (lstMetrics != null) {
> > lstMetrics.incrementFaultsSending();
> > }
> > - log.warn("Connection closed by client : "
> > - + worker.getRemoteAddress() + "\n" + scd.dump());
> > + log.warn("Connection closed by client : " +
> worker.getRemoteAddress());
> > } catch (IOException e) {
> > if (lstMetrics != null) {
> > lstMetrics.incrementFaultsSending();
> > }
> > handleException("IO Error sending response message to : " +
> > - worker.getRemoteAddress() + "\n" + scd.dump(), e);
> > + worker.getRemoteAddress(), e);
> > } catch (Exception e) {
> > if (lstMetrics != null) {
> > lstMetrics.incrementFaultsSending();
> > }
> > handleException("General Error sending response message to :
> " +
> > - worker.getRemoteAddress() + "\n" + scd.dump(), e);
> > + worker.getRemoteAddress(), e);
> > }
> >
> > InputStream is = worker.getIs();
> > @@ -571,6 +576,76 @@ public class HttpCoreNIOSender extends A
> > }
> >
> > /**
> > + * Extract the content length from the incoming message
> > + *
> > + * @param msgContext current MessageContext
> > + * @return the length of the message
> > + */
> > + private int extractContentLength(MessageContext msgContext) {
> > + Map headers = (Map)
> msgContext.getProperty(MessageContext.TRANSPORT_HEADERS);
> > +
> > + if (headers == null || headers.isEmpty()) {
> > + return -1;
> > + }
> > +
> > + for (Object o : headers.keySet()) {
> > + String headerName = (String) o;
> > + if (HTTP.CONTENT_LEN.equalsIgnoreCase(headerName)) {
> > + Object value = headers.get(headerName);
> > +
> > + if (value != null && value instanceof String) {
> > + try {
> > + return Integer.parseInt((String) value);
> > + } catch (NumberFormatException e) {
> > + return -1;
> > + }
> > + }
> > + }
> > + }
> > +
> > + return -1;
> > + }
> > +
> > + /**
> > + * Write the stream to a temporary storage and calculate the content
> length
> > + * @param entity HTTPEntity
> > + * @param messageFormatter message formatter
> > + * @param msgContext current message context
> > + * @param format message format
> > + * @throws IOException if an exception occurred while writing data
> > + */
> > + private void setStreamAsTempData(BasicHttpEntity entity,
> MessageFormatter messageFormatter,
> > + MessageContext msgContext,
> OMOutputFormat format)
> > + throws IOException {
> > + TemporaryData serialized = new TemporaryData(256, 4096,
> "http-nio_", ".dat");
> > + OutputStream out = serialized.getOutputStream();
> > + try {
> > + messageFormatter.writeTo(msgContext, format, out, true);
> > + } finally {
> > + out.close();
> > + }
> > + msgContext.setProperty(NhttpConstants.SERIALIZED_BYTES,
> serialized);
> > + entity.setContentLength(serialized.getLength());
> > + }
> > +
> > + /**
> > + * Take the data from temporary storage and write it to the output
> stream
> > + * @param out output stream output stream
> > + * @param msgContext messagecontext
> > + * @throws IOException if an exception occurred while writing data
> > + */
> > + private void writeMessageFromTempData(OutputStream out,
> MessageContext msgContext)
> > + throws IOException {
> > + TemporaryData serialized =
> > + (TemporaryData)
> msgContext.getProperty(NhttpConstants.SERIALIZED_BYTES);
> > + try {
> > + serialized.writeTo(out);
> > + } finally {
> > + serialized.release();
> > + }
> > + }
> > +
> > + /**
> > * 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.
> >
> > 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=1005337&r1=1005336&r2=1005337&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
> Thu Oct 7 06:25:32 2010
> > @@ -30,6 +30,9 @@ public class NhttpConstants {
> > 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";
> > + public static final String FORCE_HTTP_CONTENT_LENGTH =
> "FORCE_HTTP_CONTENT_LENGTH";
> > + public static final String COPY_CONTENT_LENGTH_FROM_INCOMING =
> > + "COPY_CONTENT_LENGTH_FROM_INCOMING";
> > public static final String DISABLE_CHUNKING = "DISABLE_CHUNKING";
> > public static final String POST_TO_URI = "POST_TO_URI";
> > public static final String NO_KEEPALIVE = "NO_KEEPALIVE";
> >
> >
> >
>
>
>
> --
> Hiranya Jayathilaka
> Senior Software Engineer;
> WSO2 Inc.; http://wso2.org
> E-mail: hiranya@wso2.com; Mobile: +94 77 633 3491
> Blog: http://techfeast-hiranya.blogspot.com
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscribe@synapse.apache.org
> For additional commands, e-mail: dev-help@synapse.apache.org
>
>
--
Tech Lead, WSO2 Inc
http://wso2.org
supunk.blogspot.com