Author: ruwan
Date: Wed Feb 24 12:22:12 2010
New Revision: 915762

URL: http://svn.apache.org/viewvc?rev=915762&view=rev
Log:
Connection infromation of the client side as well as serverside for a 
connection timeout

Added:
    
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/nhttp/debug/
    
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/nhttp/debug/AbstractConnectionDebug.java
    
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/nhttp/debug/ClientConnectionDebug.java
    
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/nhttp/debug/NhttpConnectionDebugConfig.java
    
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/nhttp/debug/ServerConnectionDebug.java
Modified:
    
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/nhttp/ClientHandler.java
    
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/nhttp/ClientWorker.java
    
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/NHttpConfiguration.java
    
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/nhttp/ServerHandler.java
    
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/nhttp/ServerWorker.java

Modified: 
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/nhttp/ClientHandler.java
URL: 
http://svn.apache.org/viewvc/synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/nhttp/ClientHandler.java?rev=915762&r1=915761&r2=915762&view=diff
==============================================================================
--- 
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/nhttp/ClientHandler.java
 (original)
+++ 
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/nhttp/ClientHandler.java
 Wed Feb 24 12:22:12 2010
@@ -54,6 +54,7 @@
 import org.apache.http.params.DefaultedHttpParams;
 import org.apache.http.params.HttpParams;
 import org.apache.http.protocol.*;
+import org.apache.synapse.transport.nhttp.debug.ClientConnectionDebug;
 
 import java.io.IOException;
 
@@ -89,6 +90,8 @@
 
     public static final String OUTGOING_MESSAGE_CONTEXT = 
"synapse.axis2_message_context";
     public static final String AXIS2_HTTP_REQUEST = 
"synapse.axis2-http-request";
+    public static final String CLIENT_CONNECTION_DEBUG = 
"synapse.client-connection-debug";
+    public static final String CONNECTION_CREATION_TIME = 
"synapse.connectioCreationTime";
 
     public static final String REQUEST_SOURCE_BUFFER = 
"synapse.request-source-buffer";
     public static final String RESPONSE_SINK_BUFFER = 
"synapse.response-sink-buffer";
@@ -156,6 +159,10 @@
         if (log.isDebugEnabled() ) {
             log.debug("ClientHandler connected : " + conn);
         }
+        // record connection creation time for debug logging
+        conn.getContext().setAttribute(CONNECTION_CREATION_TIME, 
System.currentTimeMillis());
+
+
         try {
             processConnection(conn, (Axis2HttpRequest) attachment);
         } catch (ConnectionClosedException e) {
@@ -176,6 +183,14 @@
     private void processConnection(final NHttpClientConnection conn,
         final Axis2HttpRequest axis2Req) throws ConnectionClosedException {
 
+        // record start time of request
+        ClientConnectionDebug cd = (ClientConnectionDebug)
+                axis2Req.getMsgContext().getProperty(CLIENT_CONNECTION_DEBUG);
+        if (cd != null) {
+            cd.recordRequestStartTime(conn, axis2Req);
+            conn.getContext().setAttribute(CLIENT_CONNECTION_DEBUG, cd);
+        }
+
         try {
             // Reset connection metrics
             conn.getMetrics().reset();
@@ -218,7 +233,7 @@
             synchronized(axis2Req) {
                 axis2Req.setReadyToStream(true);
                 axis2Req.notifyAll();
-            }            
+            }
         }
     }
 
@@ -427,6 +442,8 @@
                                 NhttpConstants.ERROR_DETAIL, errorMessage);
                             
envelope.getBody().getFault().getDetail().setText(errorMessage);
                         }
+                        
nioFaultMessageContext.setProperty(CLIENT_CONNECTION_DEBUG,
+                            mc.getProperty(CLIENT_CONNECTION_DEBUG));
                         mr.receive(nioFaultMessageContext);
 
                     } catch (AxisFault af) {
@@ -459,6 +476,9 @@
             }
 
             if (decoder.isCompleted()) {
+                ((ClientConnectionDebug) 
conn.getContext().getAttribute(CLIENT_CONNECTION_DEBUG)).
+                    recordResponseCompletionTime();
+                
                 if (metrics != null) {
                     if (metrics.getLevel() == MetricsCollector.LEVEL_FULL) {
                         MessageContext mc = getMessageContext(conn);
@@ -527,6 +547,8 @@
                 } else {
                     metrics.incrementBytesSent(bytesWritten);
                 }
+                ((ClientConnectionDebug) context.getAttribute(
+                        
CLIENT_CONNECTION_DEBUG)).recordRequestCompletionTime();
             }
 
         } catch (IOException e) {
@@ -562,6 +584,8 @@
             return;
         }
 
+        ((ClientConnectionDebug) 
conn.getContext().getAttribute(CLIENT_CONNECTION_DEBUG)).
+                recordResponseStartTime(response.getStatusLine().toString());
 
         // Have we sent out our request fully in the first place? if not, 
forget about it now..
         Axis2HttpRequest req
@@ -829,19 +853,25 @@
      * @param conn the connection to be shutdown
      */
     private void shutdownConnection(final NHttpClientConnection conn) {
+        HttpContext context = conn.getContext();
         SharedOutputBuffer outputBuffer = (SharedOutputBuffer)
-            conn.getContext().getAttribute(REQUEST_SOURCE_BUFFER);
+                context.getAttribute(REQUEST_SOURCE_BUFFER);
         if (outputBuffer != null) {
             outputBuffer.close();
         }
         SharedInputBuffer inputBuffer = (SharedInputBuffer)
-            conn.getContext().getAttribute(RESPONSE_SINK_BUFFER);
+            context.getAttribute(RESPONSE_SINK_BUFFER);
         if (inputBuffer != null) {
             inputBuffer.close();
         }
         try {
             conn.shutdown();
         } catch (IOException ignore) {}
+
+        context.removeAttribute(RESPONSE_SINK_BUFFER);
+        context.removeAttribute(REQUEST_SOURCE_BUFFER);
+        context.removeAttribute(CLIENT_CONNECTION_DEBUG);
+        context.removeAttribute(CONNECTION_CREATION_TIME);
     }
 
     /**

Modified: 
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/nhttp/ClientWorker.java
URL: 
http://svn.apache.org/viewvc/synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/nhttp/ClientWorker.java?rev=915762&r1=915761&r2=915762&view=diff
==============================================================================
--- 
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/nhttp/ClientWorker.java
 (original)
+++ 
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/nhttp/ClientWorker.java
 Wed Feb 24 12:22:12 2010
@@ -37,6 +37,7 @@
 import org.apache.http.Header;
 import org.apache.http.HttpResponse;
 import org.apache.http.protocol.HTTP;
+import org.apache.synapse.transport.nhttp.debug.ClientConnectionDebug;
 
 import javax.xml.stream.XMLStreamException;
 import java.io.IOException;
@@ -139,6 +140,13 @@
             
responseMsgCtx.setOperationContext(outMsgCtx.getOperationContext());
             
responseMsgCtx.setConfigurationContext(outMsgCtx.getConfigurationContext());
             responseMsgCtx.setTo(null);
+
+            // Ensure MessageContext has a ClientConnectionDebug attached 
before we start streaming
+            ClientConnectionDebug cd = (ClientConnectionDebug)
+                outMsgCtx.getProperty(ClientHandler.CLIENT_CONNECTION_DEBUG);
+            if (cd != null) {
+                
responseMsgCtx.setProperty(ClientHandler.CLIENT_CONNECTION_DEBUG, cd);
+            }
         }
     }
 

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=915762&r1=915761&r2=915762&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
 Wed Feb 24 12:22:12 2010
@@ -54,6 +54,8 @@
 import org.apache.http.params.HttpProtocolParams;
 import org.apache.http.protocol.HTTP;
 import org.apache.axis2.transport.base.threads.NativeThreadFactory;
+import org.apache.synapse.transport.nhttp.debug.ClientConnectionDebug;
+import org.apache.synapse.transport.nhttp.debug.ServerConnectionDebug;
 import 
org.apache.synapse.transport.nhttp.util.MessageFormatterDecoratorFactory;
 import org.apache.synapse.transport.nhttp.util.NhttpUtil;
 
@@ -383,6 +385,21 @@
             
             NHttpClientConnection conn = ConnectionPool.getConnection(host, 
port);
 
+            // Ensure MessageContext has a ClientConnectionDebug attached 
before we start streaming
+            ServerConnectionDebug scd = (ServerConnectionDebug)
+                msgContext.getProperty(ServerHandler.SERVER_CONNECTION_DEBUG);
+
+            ClientConnectionDebug ccd = null;
+            if (scd != null) {
+                ccd = scd.getClientConnectionDebug();
+                if (ccd == null) {
+                    ccd = new ClientConnectionDebug(scd);
+                    scd.setClientConnectionDebug(ccd);
+                }
+                ccd.recordRequestStartTime(conn, axis2Req);
+                msgContext.setProperty(ClientHandler.CLIENT_CONNECTION_DEBUG, 
ccd);
+            }
+
             if (conn == null) {
                 ioReactor.connect(new InetSocketAddress(host, port),
                     null, axis2Req, sessionRequestCallback);
@@ -460,6 +477,23 @@
             }
         }
 
+        // 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);
+        }
+
+        if (scd != null) {
+            scd.recordResponseStartTime();
+        }
+
         MetricsCollector lstMetrics = worker.getServiceHandler().getMetrics();
         try {
             worker.getServiceHandler().commitResponse(worker.getConn(), 
response);
@@ -486,29 +520,31 @@
                 lstMetrics.incrementFaultsSending();
             }
             handleException("Unexpected HTTP protocol error sending response 
to : " +
-                worker.getRemoteAddress(), e);
+                worker.getRemoteAddress() + "\n" + scd.dump(), e);
         } catch (ConnectionClosedException e) {
             if (lstMetrics != null) {
                 lstMetrics.incrementFaultsSending();
             }
-            log.warn("Connection closed by client : " + 
worker.getRemoteAddress());
+            log.warn("Connection closed by client : "
+                    + worker.getRemoteAddress() + "\n" + scd.dump());
         } catch (IllegalStateException e) {
             if (lstMetrics != null) {
                 lstMetrics.incrementFaultsSending();
             }
-            log.warn("Connection closed by client : " + 
worker.getRemoteAddress());
+            log.warn("Connection closed by client : "
+                    + worker.getRemoteAddress() + "\n" + scd.dump());
         } catch (IOException e) {
             if (lstMetrics != null) {
                 lstMetrics.incrementFaultsSending();
             }
             handleException("IO Error sending response message to : " +
-                worker.getRemoteAddress(), e);
+                worker.getRemoteAddress() + "\n" + scd.dump(), e);
         } catch (Exception e) {
             if (lstMetrics != null) {
                 lstMetrics.incrementFaultsSending();
             }
             handleException("General Error sending response message to : " +
-                worker.getRemoteAddress(), e);
+                worker.getRemoteAddress() + "\n" + scd.dump(), e);
         }
 
         InputStream is = worker.getIs();

Modified: 
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/nhttp/NHttpConfiguration.java
URL: 
http://svn.apache.org/viewvc/synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/nhttp/NHttpConfiguration.java?rev=915762&r1=915761&r2=915762&view=diff
==============================================================================
--- 
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/nhttp/NHttpConfiguration.java
 (original)
+++ 
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/nhttp/NHttpConfiguration.java
 Wed Feb 24 12:22:12 2010
@@ -160,4 +160,19 @@
         return def;
     }
 
+    /**
+     * Get properties that tune nhttp transport. Preference to system 
properties
+     * @param name name of the system/config property
+     * @param def default value to return if the property is not set
+     * @return the value of the property to be used
+     */
+    public String getStringValue(String name, String def) {
+        String val = System.getProperty(name);
+        if (val == null) {
+            val = props.getProperty(name);
+        }
+
+        return val == null ? def : val;
+    }
+
 }

Modified: 
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/nhttp/ServerHandler.java
URL: 
http://svn.apache.org/viewvc/synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/nhttp/ServerHandler.java?rev=915762&r1=915761&r2=915762&view=diff
==============================================================================
--- 
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/nhttp/ServerHandler.java
 (original)
+++ 
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/nhttp/ServerHandler.java
 Wed Feb 24 12:22:12 2010
@@ -47,6 +47,7 @@
 import org.apache.synapse.commons.evaluators.Parser;
 import org.apache.synapse.commons.evaluators.EvaluatorContext;
 import org.apache.synapse.commons.executors.PriorityExecutor;
+import org.apache.synapse.transport.nhttp.debug.ServerConnectionDebug;
 
 import java.io.IOException;
 import java.io.InputStream;
@@ -92,6 +93,8 @@
 
     public static final String REQUEST_SINK_BUFFER = 
"synapse.request-sink-buffer";
     public static final String RESPONSE_SOURCE_BUFFER = 
"synapse.response-source-buffer";
+    public static final String CONNECTION_CREATION_TIME = 
"synapse.connectionCreationTime";
+    public static final String SERVER_CONNECTION_DEBUG = 
"synapse.server-connection-debug";
 
     public ServerHandler(final ConfigurationContext cfgCtx, final HttpParams 
params,
         final boolean isHttps, final MetricsCollector metrics,
@@ -130,6 +133,10 @@
         HttpRequest request = conn.getHttpRequest();
         context.setAttribute(ExecutionContext.HTTP_REQUEST, request);
 
+        // prepare to collect debug information
+        conn.getContext().setAttribute(
+                ServerHandler.SERVER_CONNECTION_DEBUG, new 
ServerConnectionDebug(conn));
+
         try {
             InputStream is;
             // Only create an input buffer and ContentInputStream if the 
request has content
@@ -137,7 +144,8 @@
                 // Mark request as not yet fully read, to detect timeouts from 
harmless keepalive deaths
                 conn.getContext().setAttribute(NhttpConstants.REQUEST_READ, 
Boolean.FALSE);
                 
-                ContentInputBuffer inputBuffer = new 
SharedInputBuffer(cfg.getBufferSize(), conn, allocator);
+                ContentInputBuffer inputBuffer
+                        = new SharedInputBuffer(cfg.getBufferSize(), conn, 
allocator);
                 context.setAttribute(REQUEST_SINK_BUFFER, inputBuffer);
                 is = new ContentInputStream(inputBuffer);
             } else {
@@ -145,7 +153,8 @@
                 conn.getContext().removeAttribute(NhttpConstants.REQUEST_READ);
             }
             
-            ContentOutputBuffer outputBuffer = new 
SharedOutputBuffer(cfg.getBufferSize(), conn, allocator);
+            ContentOutputBuffer outputBuffer
+                    = new SharedOutputBuffer(cfg.getBufferSize(), conn, 
allocator);
             context.setAttribute(RESPONSE_SOURCE_BUFFER, outputBuffer);
             OutputStream os = new ContentOutputStream(outputBuffer);
 
@@ -197,7 +206,8 @@
     public void inputReady(final NHttpServerConnection conn, final 
ContentDecoder decoder) {
 
         HttpContext context = conn.getContext();
-        ContentInputBuffer inBuf = (ContentInputBuffer) 
context.getAttribute(REQUEST_SINK_BUFFER);
+        ContentInputBuffer inBuf
+                = (ContentInputBuffer) 
context.getAttribute(REQUEST_SINK_BUFFER);
 
         try {
             int bytesRead = inBuf.consumeContent(decoder);
@@ -206,6 +216,10 @@
             }
 
             if (decoder.isCompleted()) {
+                
+                ((ServerConnectionDebug) conn.getContext().getAttribute(
+                        
SERVER_CONNECTION_DEBUG)).recordRequestCompletionTime();
+
                 if (metrics != null) {
                     metrics.incrementMessagesReceived();
                 }
@@ -231,7 +245,14 @@
 
         HttpContext context = conn.getContext();
         HttpResponse response = conn.getHttpResponse();
-        ContentOutputBuffer outBuf = (ContentOutputBuffer) 
context.getAttribute(RESPONSE_SOURCE_BUFFER);
+        ContentOutputBuffer outBuf = (ContentOutputBuffer) 
context.getAttribute(
+                RESPONSE_SOURCE_BUFFER);
+
+        if (outBuf == null) {
+            // fix for SYNAPSE 584. This is a temporaly fix becuase of 
HTTPCORE-208
+            shutdownConnection(conn);
+            return;
+        }
 
         try {
             int bytesWritten = outBuf.produceContent(encoder);
@@ -240,7 +261,12 @@
             }
 
             if (encoder.isCompleted()) {
-                Boolean reqRead = (Boolean) 
conn.getContext().getAttribute(NhttpConstants.REQUEST_READ);
+                
+                ((ServerConnectionDebug) conn.getContext().getAttribute(
+                        
SERVER_CONNECTION_DEBUG)).recordResponseCompletionTime();
+
+                Boolean reqRead = (Boolean) conn.getContext().getAttribute(
+                        NhttpConstants.REQUEST_READ);
                 if (reqRead != null && !reqRead) {
                     try {
                         // this is a connection we should not re-use
@@ -268,7 +294,8 @@
      * @param conn the connection being processed
      * @param response the response to commit over the connection
      */
-    public void commitResponseHideExceptions(final NHttpServerConnection conn, 
final HttpResponse response) {
+    public void commitResponseHideExceptions(
+            final NHttpServerConnection conn, final HttpResponse response) {
         try {
             conn.suspendInput();
             httpProcessor.process(response, conn.getContext());
@@ -328,6 +355,8 @@
         if (log.isTraceEnabled()) {
             log.trace("New incoming connection");
         }
+        // record connection creation time for debug logging
+        conn.getContext().setAttribute(CONNECTION_CREATION_TIME, 
System.currentTimeMillis());
     }
 
     public void responseReady(NHttpServerConnection conn) {
@@ -347,6 +376,8 @@
         shutdownConnection(conn);
         context.removeAttribute(REQUEST_SINK_BUFFER);
         context.removeAttribute(RESPONSE_SOURCE_BUFFER);
+        context.removeAttribute(CONNECTION_CREATION_TIME);
+        context.removeAttribute(SERVER_CONNECTION_DEBUG);
 
         if (log.isTraceEnabled()) {
             log.trace("Connection closed");

Modified: 
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/nhttp/ServerWorker.java
URL: 
http://svn.apache.org/viewvc/synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/nhttp/ServerWorker.java?rev=915762&r1=915761&r2=915762&view=diff
==============================================================================
--- 
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/nhttp/ServerWorker.java
 (original)
+++ 
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/nhttp/ServerWorker.java
 Wed Feb 24 12:22:12 2010
@@ -172,14 +172,19 @@
             HttpInetConnection inetConn = (HttpInetConnection) conn;
             InetAddress remoteAddr = inetConn.getRemoteAddress();
             if (remoteAddr != null) {
-                msgContext.setProperty(MessageContext.REMOTE_ADDR, 
remoteAddr.getHostAddress());
-                msgContext.setProperty(NhttpConstants.REMOTE_HOST, 
NhttpUtil.getHostName(remoteAddr));
+                msgContext.setProperty(
+                        MessageContext.REMOTE_ADDR, 
remoteAddr.getHostAddress());
+                msgContext.setProperty(
+                        NhttpConstants.REMOTE_HOST, 
NhttpUtil.getHostName(remoteAddr));
                 remoteAddress = remoteAddr.getHostAddress();
             }
         }
 
         msgContext.setProperty(RequestResponseTransport.TRANSPORT_CONTROL,
                 new HttpCoreRequestResponseTransport(msgContext));
+
+        msgContext.setProperty(ServerHandler.SERVER_CONNECTION_DEBUG,
+            
conn.getContext().getAttribute(ServerHandler.SERVER_CONNECTION_DEBUG));
         
         return msgContext;
     }
@@ -228,8 +233,10 @@
         if (servicePrefix.indexOf("://") == -1) {
             HttpInetConnection inetConn = (HttpInetConnection) conn;
             InetAddress localAddr = inetConn.getLocalAddress();
-            servicePrefix = (isHttps ? "https://"; : "http://";) +
-                localAddr.getHostName() + ":" + inetConn.getLocalPort() + 
servicePrefix;
+            if (localAddr != null) {
+                servicePrefix = (isHttps ? "https://"; : "http://";) +
+                        localAddr.getHostName() + ":" + 
inetConn.getLocalPort() + servicePrefix;
+            }
         }
         msgContext.setProperty(NhttpConstants.SERVICE_PREFIX, servicePrefix);
 
@@ -263,12 +270,11 @@
 
             String respWritten = (String)
                 
msgContext.getOperationContext().getProperty(Constants.RESPONSE_WRITTEN);
-            boolean respWillFollow =
-                !Constants.VALUE_TRUE.equals(respWritten) && 
!"SKIP".equals(respWritten);
-            boolean acked = ((
-                (RequestResponseTransport)
-                    
msgContext.getProperty(RequestResponseTransport.TRANSPORT_CONTROL)).getStatus()
-                == 
RequestResponseTransport.RequestResponseTransportStatus.ACKED);
+            boolean respWillFollow
+                    = !Constants.VALUE_TRUE.equals(respWritten) && 
!"SKIP".equals(respWritten);
+            boolean acked = (((RequestResponseTransport) 
msgContext.getProperty(
+                    RequestResponseTransport.TRANSPORT_CONTROL)).getStatus()
+                    == 
RequestResponseTransport.RequestResponseTransportStatus.ACKED);
             boolean forced = 
msgContext.isPropertyTrue(NhttpConstants.FORCE_SC_ACCEPTED);
 
             if (respWillFollow || acked || forced) {
@@ -341,7 +347,8 @@
             String contentTypeStr = contentType != null ? 
contentType.getValue() : null;
 
             String charSetEncoding = 
BuilderUtil.getCharSetEncoding(contentTypeStr);
-            
msgContext.setProperty(Constants.Configuration.CHARACTER_SET_ENCODING, 
charSetEncoding);
+            msgContext.setProperty(
+                    Constants.Configuration.CHARACTER_SET_ENCODING, 
charSetEncoding);
 
             Header soapAction  = request.getFirstHeader(SOAPACTION);
 
@@ -590,6 +597,8 @@
 
     /**
      * Calls the RESTUtil to process GET and DELETE Request
+     *
+     * @param method HTTP method, either GET or DELETE
      */
     private void processGetAndDelete(String method) {
         try {

Added: 
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/nhttp/debug/AbstractConnectionDebug.java
URL: 
http://svn.apache.org/viewvc/synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/nhttp/debug/AbstractConnectionDebug.java?rev=915762&view=auto
==============================================================================
--- 
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/nhttp/debug/AbstractConnectionDebug.java
 (added)
+++ 
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/nhttp/debug/AbstractConnectionDebug.java
 Wed Feb 24 12:22:12 2010
@@ -0,0 +1,82 @@
+/**
+ *  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.synapse.transport.nhttp.debug;
+
+import org.apache.http.Header;
+
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.List;
+
+/**
+ *
+ */
+public abstract class AbstractConnectionDebug {
+
+    protected static final DateFormat formatter = new 
SimpleDateFormat("HH:mm:ss.SSS");
+
+    protected String keyValueSeparator;
+    protected String fieldSeparator;
+    protected String statementSeparator;
+    protected boolean printAllHeaders;
+    protected boolean printNoHeaders;
+    protected List<String> printHeaderNames;
+
+    protected Header[] headers;
+
+    protected AbstractConnectionDebug() {
+        NhttpConnectionDebugConfig connDebugConfig = 
NhttpConnectionDebugConfig.getInstance();
+        this.keyValueSeparator = connDebugConfig.getKeyValueSeparator();
+        this.fieldSeparator = connDebugConfig.getFieldSeparator();
+        this.statementSeparator = connDebugConfig.getStatementSeparator();
+        if (connDebugConfig.isNoHeaders()) {
+            this.printNoHeaders = true;
+        } else if (connDebugConfig.isAllHeaders()) {
+            this.printAllHeaders = true;
+        } else {
+            this.printHeaderNames = connDebugConfig.getHeaders();
+        }
+    }
+
+    protected String format(long ms) {
+        return formatter.format(new Date(ms));
+    }
+
+    public abstract String dump();
+
+    protected StringBuffer headersToString() {
+        StringBuffer sb = new StringBuffer();
+        if (headers != null) {
+            if (printAllHeaders) {
+                for (Header h : headers) {
+                    
sb.append(h.getName()).append(keyValueSeparator).append(h.getValue());
+                }
+            } else if (printHeaderNames != null) {
+                for (Header h : headers) {
+                    if (printHeaderNames.contains(h.getName())) {
+                        
sb.append(h.getName()).append(keyValueSeparator).append(h.getValue());
+                    }
+                }
+            }
+        }
+        return sb.length() > 0 ? sb : sb.append("NOT_AVAILABLE");
+    }
+}

Added: 
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/nhttp/debug/ClientConnectionDebug.java
URL: 
http://svn.apache.org/viewvc/synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/nhttp/debug/ClientConnectionDebug.java?rev=915762&view=auto
==============================================================================
--- 
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/nhttp/debug/ClientConnectionDebug.java
 (added)
+++ 
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/nhttp/debug/ClientConnectionDebug.java
 Wed Feb 24 12:22:12 2010
@@ -0,0 +1,146 @@
+/*
+ *  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.synapse.transport.nhttp.debug;
+
+import org.apache.http.Header;
+import org.apache.http.HttpRequest;
+import org.apache.http.RequestLine;
+import org.apache.http.nio.NHttpClientConnection;
+import org.apache.synapse.transport.nhttp.Axis2HttpRequest;
+import org.apache.synapse.transport.nhttp.ClientHandler;
+
+import java.io.IOException;
+
+/**
+ * A connection debug object would be accumulated during processing, but only 
made use of if the connection
+ * encounters issues during processing.
+ */
+public class ClientConnectionDebug extends AbstractConnectionDebug {
+
+    private long connectionCreationTime;
+    private long lastRequestStartTime;
+    private String lastRequestEPR;
+    private String lastRequestProtocol;
+    private String lastRequestHTTPMethod;
+    private StringBuffer previousRequestAttempts;
+
+    private long requestCompletionTime;
+    private long responseStartTime;
+    private long responseCompletionTime;
+    private String responseLine;
+
+    private ServerConnectionDebug serverConnectionDebug;
+
+    public ClientConnectionDebug(ServerConnectionDebug serverConnectionDebug) {
+        super();
+        this.serverConnectionDebug = serverConnectionDebug;
+    }
+
+    public void recordRequestStartTime(NHttpClientConnection conn, 
Axis2HttpRequest axis2Req) {
+
+        if (conn != null) {
+            this.connectionCreationTime = (Long) 
conn.getContext().getAttribute(
+                    ClientHandler.CONNECTION_CREATION_TIME);
+            try {
+                HttpRequest request = axis2Req.getRequest();
+                RequestLine requestLine = request.getRequestLine();
+                this.lastRequestProtocol = 
requestLine.getProtocolVersion().toString();
+                this.lastRequestHTTPMethod = requestLine.getMethod();
+            } catch (IOException ignore) {}
+        }
+
+        if (this.lastRequestStartTime != 0) {
+            if (previousRequestAttempts == null) {
+                previousRequestAttempts = new StringBuffer();
+            } else {
+                previousRequestAttempts.append(fieldSeparator);
+            }
+            
previousRequestAttempts.append("Attempt-Info").append(keyValueSeparator).append("{");
+            
previousRequestAttempts.append("Req-Start-Time").append(keyValueSeparator)
+                    .append(format(this.lastRequestStartTime));
+            previousRequestAttempts.append(fieldSeparator);
+            previousRequestAttempts.append("Req-URL").append(keyValueSeparator)
+                    .append(this.lastRequestEPR).append("}");
+        }
+        this.lastRequestStartTime = System.currentTimeMillis();
+        this.lastRequestEPR = axis2Req.getEpr().toString();
+    }
+
+    public void recordResponseCompletionTime() {
+        this.responseCompletionTime = System.currentTimeMillis();
+    }
+
+    public void recordRequestCompletionTime() {
+        this.requestCompletionTime = System.currentTimeMillis();
+    }
+
+    public void recordResponseStartTime(String responseLine) {
+        this.responseStartTime = System.currentTimeMillis();
+        this.responseLine = responseLine;
+    }
+
+    public void recordResponseInfo(Header[] headers) {
+        this.headers = headers;
+    }
+
+    public String dump() {
+        StringBuffer sb = new StringBuffer(25);
+
+        
sb.append("E2S-Req-Start").append(keyValueSeparator).append(lastRequestStartTime);
+        sb.append(fieldSeparator);
+        
sb.append("E2S-Req-End").append(keyValueSeparator).append(format(requestCompletionTime));
+        sb.append(fieldSeparator);
+        sb.append("E2S-Req-ConnCreateTime").append(keyValueSeparator)
+                .append(format(connectionCreationTime));
+        sb.append(statementSeparator);
+
+        
sb.append("E2S-Req-URL").append(keyValueSeparator).append(lastRequestEPR);
+        sb.append(fieldSeparator);
+        
sb.append("E2S-Req-Protocol").append(keyValueSeparator).append(lastRequestProtocol);
+        sb.append(fieldSeparator);
+        
sb.append("E2S-Req-Method").append(keyValueSeparator).append(lastRequestHTTPMethod);
+        sb.append(statementSeparator);
+
+        if (previousRequestAttempts != null) {
+            sb.append("E2S-Previous-Attempts").append(keyValueSeparator)
+                    .append(previousRequestAttempts);
+            sb.append(statementSeparator);
+        }
+
+        
sb.append("S2E-Resp-Start").append(keyValueSeparator).append(responseStartTime);
+        sb.append(fieldSeparator);
+        
sb.append("S2E-Resp-End").append(keyValueSeparator).append(responseCompletionTime);
+        sb.append(statementSeparator);
+
+        
sb.append("S2E-Resp-Status").append(keyValueSeparator).append(responseLine);
+        if (!printNoHeaders) {
+            sb.append(fieldSeparator);
+            sb.append("S2E-Resp-Info").append(keyValueSeparator).append("{")
+                    .append(headersToString()).append("}");
+        }
+        sb.append(statementSeparator);
+
+        return sb.toString();
+    }
+
+    public ServerConnectionDebug getServerConnectionDebug() {
+        return serverConnectionDebug;
+    }
+}
\ No newline at end of file

Added: 
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/nhttp/debug/NhttpConnectionDebugConfig.java
URL: 
http://svn.apache.org/viewvc/synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/nhttp/debug/NhttpConnectionDebugConfig.java?rev=915762&view=auto
==============================================================================
--- 
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/nhttp/debug/NhttpConnectionDebugConfig.java
 (added)
+++ 
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/nhttp/debug/NhttpConnectionDebugConfig.java
 Wed Feb 24 12:22:12 2010
@@ -0,0 +1,107 @@
+/**
+ *  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.synapse.transport.nhttp.debug;
+
+import org.apache.synapse.transport.nhttp.NHttpConfiguration;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ *
+ */
+public class NhttpConnectionDebugConfig {
+
+    private static final String KEY_VALUE_SEPARATOR_PROPERTY = 
"nhttp.debug.key.value.separator";
+    private static final String FIELD_SEPARATOR_PROPERTY = 
"nhttp.debug.field.separator";
+    private static final String STATEMENT_SEPARATOR_PROPERTY = 
"nhttp.debug.statement.separator";
+    // "all" | "none" | "foo,bar"
+    private static final String HEADER_INFO_PROPERTY = "nhttp.debug.headers";
+
+    private static final String HEADER_INFO_ALL = "all";
+    private static final String HEADER_INFO_NONE = "none";
+
+    private static final String DEFAULT_KEY_VALUE_SEPARATOR = "=";
+    private static final String DEFAULT_FIELD_SEPARATOR = ", ";
+    private static final String DEFAULT_STATEMENT_SEPARATOR = "\n";
+
+    private String keyValueSeparator;
+    private String fieldSeparator;
+    private String statementSeparator;
+    private List<String> headers;
+    private boolean noHeaders = false;
+    private boolean allHeaders = true;
+
+    private static NhttpConnectionDebugConfig _instance;
+
+    private NhttpConnectionDebugConfig() {
+
+        this.keyValueSeparator = 
NHttpConfiguration.getInstance().getStringValue(
+                KEY_VALUE_SEPARATOR_PROPERTY, DEFAULT_KEY_VALUE_SEPARATOR);
+        this.fieldSeparator = NHttpConfiguration.getInstance().getStringValue(
+                FIELD_SEPARATOR_PROPERTY, DEFAULT_FIELD_SEPARATOR);
+        this.statementSeparator = 
NHttpConfiguration.getInstance().getStringValue(
+                STATEMENT_SEPARATOR_PROPERTY, DEFAULT_STATEMENT_SEPARATOR);
+        String headerSet = NHttpConfiguration.getInstance().getStringValue(
+                HEADER_INFO_PROPERTY, HEADER_INFO_ALL);
+        if (HEADER_INFO_NONE.equals(headerSet)) {
+            this.noHeaders = true;
+        } else if (HEADER_INFO_ALL.equals(headerSet)) {
+            this.allHeaders = true;
+        } else {
+            String[] headerNames = headerSet.split(",");
+            this.headers = new ArrayList<String>();
+            for (String headerName : headerNames) {
+                this.headers.add(headerName.trim());
+            }
+        }
+    }
+
+    public static NhttpConnectionDebugConfig getInstance() {
+        if (_instance == null) {
+            _instance = new NhttpConnectionDebugConfig();
+        }
+        return _instance;
+    }
+
+    public String getKeyValueSeparator() {
+        return keyValueSeparator;
+    }
+
+    public String getFieldSeparator() {
+        return fieldSeparator;
+    }
+
+    public String getStatementSeparator() {
+        return statementSeparator;
+    }
+
+    public List<String> getHeaders() {
+        return headers;
+    }
+
+    public boolean isNoHeaders() {
+        return noHeaders;
+    }
+
+    public boolean isAllHeaders() {
+        return allHeaders;
+    }
+}

Added: 
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/nhttp/debug/ServerConnectionDebug.java
URL: 
http://svn.apache.org/viewvc/synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/nhttp/debug/ServerConnectionDebug.java?rev=915762&view=auto
==============================================================================
--- 
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/nhttp/debug/ServerConnectionDebug.java
 (added)
+++ 
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/nhttp/debug/ServerConnectionDebug.java
 Wed Feb 24 12:22:12 2010
@@ -0,0 +1,134 @@
+/**
+ *  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.synapse.transport.nhttp.debug;
+
+import org.apache.http.Header;
+import org.apache.http.HttpInetConnection;
+import org.apache.http.HttpRequest;
+import org.apache.http.RequestLine;
+import org.apache.http.nio.NHttpServerConnection;
+import org.apache.synapse.transport.nhttp.ServerHandler;
+
+import java.net.InetAddress;
+
+/**
+ * A connection debug object would be accumulated during request processing, 
but only made use
+ * of if the connection encounters issues during processing.
+ */
+public class ServerConnectionDebug extends AbstractConnectionDebug {
+
+    private long connectionCreationTime;
+    private long requestStartTime;
+    private long requestCompletionTime;
+    private long responseStartTime;
+    private long responseCompletionTime;
+
+    private String remoteClientIP;
+    private String requestURLPAth;
+    private String requestHTTPMethod;
+    private String requestHTTPProtocol;
+
+    private ClientConnectionDebug clientConnectionDebug = null;
+
+    public ServerConnectionDebug(NHttpServerConnection conn) {
+
+        super();
+        this.connectionCreationTime = (Long) conn.getContext().getAttribute(
+                ServerHandler.CONNECTION_CREATION_TIME);
+        this.requestStartTime = System.currentTimeMillis();
+
+        // assume an entity body is not present. If present this would be 
overwritten
+        this.requestCompletionTime = System.currentTimeMillis();
+
+        RequestLine reqLine = conn.getHttpRequest().getRequestLine();
+        this.requestURLPAth = reqLine.getUri();
+        this.requestHTTPMethod = reqLine.getMethod();
+        this.requestHTTPProtocol = reqLine.getProtocolVersion().toString();
+
+        if (conn instanceof HttpInetConnection) {
+            HttpInetConnection inetConn = (HttpInetConnection) conn;
+            InetAddress remoteAddr = inetConn.getRemoteAddress();
+            if (remoteAddr != null) {
+                this.remoteClientIP = remoteAddr.getHostAddress();
+            }
+        }
+
+        HttpRequest req = conn.getHttpRequest();
+        this.headers = req.getAllHeaders();
+    }
+
+    public void recordResponseStartTime() {
+        this.responseStartTime = System.currentTimeMillis();
+    }
+
+    public void recordRequestCompletionTime() {
+        this.requestCompletionTime = System.currentTimeMillis();
+    }
+
+    public void recordResponseCompletionTime() {
+        this.responseCompletionTime = System.currentTimeMillis();
+    }
+
+    public void setClientConnectionDebug(ClientConnectionDebug 
clientConnectionDebug) {
+        this.clientConnectionDebug = clientConnectionDebug;
+    }
+
+    public ClientConnectionDebug getClientConnectionDebug() {
+        return clientConnectionDebug;
+    }
+
+    public String dump() {
+        StringBuffer sb = new StringBuffer(50);
+
+        
sb.append("C2E-Req-StartTime").append(keyValueSeparator).append(format(requestStartTime));
+        sb.append(fieldSeparator);
+        
sb.append("C2E-Req-EndTime").append(keyValueSeparator).append(format(requestCompletionTime));
+        sb.append(fieldSeparator);
+        
sb.append("C2E-Req-ConnCreateTime").append(keyValueSeparator).append(format(connectionCreationTime));
+        sb.append(statementSeparator);
+
+        
sb.append("C2E-Req-URL").append(keyValueSeparator).append(requestURLPAth);
+        sb.append(fieldSeparator);
+        
sb.append("C2E-Req-Protocol").append(keyValueSeparator).append(requestHTTPProtocol);
+        sb.append(fieldSeparator);
+        
sb.append("C2E-Req-Method").append(keyValueSeparator).append(requestHTTPMethod);
+        sb.append(statementSeparator);
+
+        
sb.append("C2E-Req-IP").append(keyValueSeparator).append(remoteClientIP);
+        if (!printNoHeaders) {
+            sb.append(fieldSeparator);
+            
sb.append("C2E-Req-Info").append("{").append(headersToString()).append("}");
+        }
+        sb.append(statementSeparator);
+
+        if (clientConnectionDebug != null) {
+            sb.append(clientConnectionDebug.dump());
+        }
+
+        
sb.append("E2C-Resp-Start").append(keyValueSeparator).append(format(responseStartTime));
+        sb.append(fieldSeparator);
+        sb.append("E2C-Resp-End").append(keyValueSeparator).append(format(
+                responseCompletionTime == 0 ? System.currentTimeMillis() : 
responseCompletionTime));
+        sb.append(statementSeparator);
+
+        return sb.toString();
+    }
+
+}
\ No newline at end of file


Reply via email to