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