Hi Oleg

Sorry for the delay in response. I will run this through some load tests and get back to you soon. I will be traveling next week, and thus if I am unable to perform this on time, I will check if Ruwan would be able to get back to you by early next week.

thanks
asankha

Oleg Kalnichevski wrote:
Hi Asankha

I am submitting for your consideration a patch that upgrades Synapse
NHttp transport to HttpCore 4.0-ALPHA5-SNAPSHOT and adds some
incremental improvements to the I/O debug logging (such as prettier I/O
session logs and optional HTTP header logs)

All tests pass for me, but please do run a few stress tests to make sure
there are no regressions.

Provided everything goes well HttpCore 4.0-ALPHA5 release is expected
within the next two weeks.

Cheers

Oleg
  

Index: modules/nhttp/src/org/apache/axis2/transport/nhttp/Axis2HttpRequest.java =================================================================== --- modules/nhttp/src/org/apache/axis2/transport/nhttp/Axis2HttpRequest.java (revision 548631) +++ modules/nhttp/src/org/apache/axis2/transport/nhttp/Axis2HttpRequest.java (working copy) @@ -26,17 +26,15 @@ import org.apache.axis2.transport.MessageFormatter; import org.apache.axis2.transport.TransportUtils; import org.apache.http.*; +import org.apache.http.message.BasicHttpEntityEnclosingRequest; import org.apache.http.protocol.HTTP; import org.apache.http.entity.BasicHttpEntity; -import org.apache.http.message.HttpPost; import org.apache.axiom.om.OMOutputFormat; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import javax.xml.stream.XMLStreamException; import java.io.IOException; import java.io.OutputStream; -import java.nio.channels.Pipe; import java.nio.channels.Channels; import java.nio.channels.ReadableByteChannel; import java.util.Map; @@ -98,7 +96,9 @@ * @return the HttpRequest to be sent out */ public HttpRequest getRequest() throws IOException { - HttpPost httpRequest = new HttpPost(epr.getAddress()); + HttpEntityEnclosingRequest httpRequest = new BasicHttpEntityEnclosingRequest( + "POST", + epr.getAddress()); httpRequest.setEntity(new BasicHttpEntity()); // set any transport headers Index: modules/nhttp/src/org/apache/axis2/transport/nhttp/LoggingNHttpClientHandler.java =================================================================== --- modules/nhttp/src/org/apache/axis2/transport/nhttp/LoggingNHttpClientHandler.java (revision 548631) +++ modules/nhttp/src/org/apache/axis2/transport/nhttp/LoggingNHttpClientHandler.java (working copy) @@ -22,6 +22,7 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.apache.http.Header; import org.apache.http.HttpException; import org.apache.http.HttpResponse; import org.apache.http.nio.ContentDecoder; @@ -36,6 +37,7 @@ public class LoggingNHttpClientHandler implements NHttpClientHandler { private final Log log; + private final Log headerlog; private final NHttpClientHandler handler; public LoggingNHttpClientHandler(final NHttpClientHandler handler) { @@ -45,6 +47,7 @@ } this.handler = handler; this.log = LogFactory.getLog(handler.getClass()); + this.headerlog = LogFactory.getLog("org.apache.axis2.transport.nhttp.headers"); } public void connected(final NHttpClientConnection conn, final Object attachment) { @@ -89,11 +92,18 @@ } public void responseReceived(final NHttpClientConnection conn) { + HttpResponse response = conn.getHttpResponse(); if (this.log.isDebugEnabled()) { - HttpResponse response = conn.getHttpResponse(); this.log.debug("HTTP connection " + conn + ": " + response.getStatusLine()); } this.handler.responseReceived(conn); + if (this.headerlog.isDebugEnabled()) { + this.headerlog.debug("<< " + response.getStatusLine().toString()); + Header[] headers = response.getAllHeaders(); + for (int i = 0; i < headers.length; i++) { + this.headerlog.debug("<< " + headers[i].toString()); + } + } } public void inputReady(final NHttpClientConnection conn, final ContentDecoder decoder) { Index: modules/nhttp/src/org/apache/axis2/transport/nhttp/SSLServerIOEventDispatch.java =================================================================== --- modules/nhttp/src/org/apache/axis2/transport/nhttp/SSLServerIOEventDispatch.java (revision 548631) +++ modules/nhttp/src/org/apache/axis2/transport/nhttp/SSLServerIOEventDispatch.java (working copy) @@ -31,6 +31,7 @@ import org.apache.http.nio.NHttpServiceHandler; import org.apache.http.nio.reactor.IOEventDispatch; import org.apache.http.nio.reactor.IOSession; +import org.apache.http.nio.util.HeapByteBufferAllocator; import org.apache.http.params.HttpParams; public class SSLServerIOEventDispatch implements IOEventDispatch { @@ -81,6 +82,7 @@ DefaultNHttpServerConnection conn = new DefaultNHttpServerConnection( new LoggingIOSession(sslSession), new DefaultHttpRequestFactory(), + new HeapByteBufferAllocator(), this.params); session.setAttribute(NHTTP_CONN, conn); @@ -89,7 +91,7 @@ this.handler.connected(conn); try { - sslSession.initialize(SSLMode.SERVER, this.params); + sslSession.bind(SSLMode.SERVER, this.params); } catch (SSLException ex) { this.handler.exception(conn, ex); sslSession.shutdown(); Index: modules/nhttp/src/org/apache/axis2/transport/nhttp/PlainServerIOEventDispatch.java =================================================================== --- modules/nhttp/src/org/apache/axis2/transport/nhttp/PlainServerIOEventDispatch.java (revision 548631) +++ modules/nhttp/src/org/apache/axis2/transport/nhttp/PlainServerIOEventDispatch.java (working copy) @@ -23,6 +23,7 @@ import org.apache.http.nio.NHttpServiceHandler; import org.apache.http.nio.reactor.IOEventDispatch; import org.apache.http.nio.reactor.IOSession; +import org.apache.http.nio.util.HeapByteBufferAllocator; import org.apache.http.params.HttpParams; public class PlainServerIOEventDispatch implements IOEventDispatch { @@ -47,9 +48,10 @@ public void connected(final IOSession session) { // Decorate I/O session with logging capabilities - DefaultNHttpServerConnection conn = new DefaultNHttpServerConnection( + LoggingNHttpServerConnection conn = new LoggingNHttpServerConnection( new LoggingIOSession(session), new DefaultHttpRequestFactory(), + new HeapByteBufferAllocator(), this.params); session.setAttribute(NHTTP_CONN, conn); this.handler.connected(conn); Index: modules/nhttp/src/org/apache/axis2/transport/nhttp/SSLClientIOEventDispatch.java =================================================================== --- modules/nhttp/src/org/apache/axis2/transport/nhttp/SSLClientIOEventDispatch.java (revision 548631) +++ modules/nhttp/src/org/apache/axis2/transport/nhttp/SSLClientIOEventDispatch.java (working copy) @@ -31,6 +31,7 @@ import org.apache.http.nio.NHttpClientHandler; import org.apache.http.nio.reactor.IOEventDispatch; import org.apache.http.nio.reactor.IOSession; +import org.apache.http.nio.util.HeapByteBufferAllocator; import org.apache.http.params.HttpParams; public class SSLClientIOEventDispatch implements IOEventDispatch { @@ -81,6 +82,7 @@ DefaultNHttpClientConnection conn = new DefaultNHttpClientConnection( new LoggingIOSession(sslSession), new DefaultHttpResponseFactory(), + new HeapByteBufferAllocator(), this.params); session.setAttribute(NHTTP_CONN, conn); @@ -90,7 +92,7 @@ this.handler.connected(conn, attachment); try { - sslSession.initialize(SSLMode.CLIENT, this.params); + sslSession.bind(SSLMode.CLIENT, this.params); } catch (SSLException ex) { this.handler.exception(conn, ex); sslSession.shutdown(); Index: modules/nhttp/src/org/apache/axis2/transport/nhttp/LoggingNHttpServerConnection.java =================================================================== --- modules/nhttp/src/org/apache/axis2/transport/nhttp/LoggingNHttpServerConnection.java (revision 0) +++ modules/nhttp/src/org/apache/axis2/transport/nhttp/LoggingNHttpServerConnection.java (revision 0) @@ -0,0 +1,76 @@ +/* + * $HeadURL$ + * $Revision$ + * $Date$ + * + * ==================================================================== + * 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. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * <http://www.apache.org/>. + * + */ + +package org.apache.axis2.transport.nhttp; + +import java.io.IOException; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.http.Header; +import org.apache.http.HttpException; +import org.apache.http.HttpRequestFactory; +import org.apache.http.HttpResponse; +import org.apache.http.impl.nio.DefaultNHttpServerConnection; +import org.apache.http.nio.reactor.IOSession; +import org.apache.http.nio.util.ByteBufferAllocator; +import org.apache.http.params.HttpParams; + +public class LoggingNHttpServerConnection extends DefaultNHttpServerConnection { + + private final Log log; + private final Log headerlog; + + public LoggingNHttpServerConnection( + final IOSession session, + final HttpRequestFactory requestFactory, + final ByteBufferAllocator allocator, + final HttpParams params) { + super(session, requestFactory, allocator, params); + this.log = LogFactory.getLog(DefaultNHttpServerConnection.class); + this.headerlog = LogFactory.getLog("org.apache.axis2.transport.nhttp.headers"); + } + + public void submitResponse(final HttpResponse response) throws IOException, HttpException { + if (this.log.isDebugEnabled()) { + this.log.debug("HTTP connection " + this + ": " + response.getStatusLine().toString()); + } + super.submitResponse(response); + if (this.headerlog.isDebugEnabled()) { + this.headerlog.debug("<< " + response.getStatusLine().toString()); + Header[] headers = response.getAllHeaders(); + for (int i = 0; i < headers.length; i++) { + this.headerlog.debug("<< " + headers[i].toString()); + } + } + } + +} \ No newline at end of file Property changes on: modules/nhttp/src/org/apache/axis2/transport/nhttp/LoggingNHttpServerConnection.java ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:keywords + Date Author Id Revision HeadURL Name: svn:eol-style + native Index: modules/nhttp/src/org/apache/axis2/transport/nhttp/ClientHandler.java =================================================================== --- modules/nhttp/src/org/apache/axis2/transport/nhttp/ClientHandler.java (revision 548631) +++ modules/nhttp/src/org/apache/axis2/transport/nhttp/ClientHandler.java (working copy) @@ -23,6 +23,7 @@ import org.apache.http.nio.ContentDecoder; import org.apache.http.nio.ContentEncoder; import org.apache.http.params.HttpParams; +import org.apache.http.params.HttpParamsLinker; import org.apache.http.*; import org.apache.http.entity.BasicHttpEntity; import org.apache.http.impl.DefaultConnectionReuseStrategy; @@ -30,7 +31,6 @@ import org.apache.axis2.context.ConfigurationContext; import org.apache.axis2.context.MessageContext; import org.apache.axis2.transport.nhttp.util.PipeImpl; -import org.apache.axis2.transport.nhttp.util.NativeWorkerPool; import org.apache.axis2.transport.nhttp.util.WorkerPool; import org.apache.axis2.transport.nhttp.util.WorkerPoolFactory; import org.apache.axis2.description.WSDL2Constants; @@ -124,7 +124,7 @@ context.setAttribute(REQUEST_SOURCE_CHANNEL, axis2Req.getSourceChannel()); HttpRequest request = axis2Req.getRequest(); - request.getParams().setDefaults(this.params); + HttpParamsLinker.link(request, this.params); this.httpProcessor.process(request, context); conn.submitRequest(request); @@ -158,7 +158,7 @@ context.setAttribute(REQUEST_SOURCE_CHANNEL, axis2Req.getSourceChannel()); HttpRequest request = axis2Req.getRequest(); - request.getParams().setDefaults(this.params); + HttpParamsLinker.link(request, this.params); this.httpProcessor.process(request, context); conn.submitRequest(request); @@ -243,7 +243,6 @@ */ public void outputReady(final NHttpClientConnection conn, final ContentEncoder encoder) { HttpContext context = conn.getContext(); - HttpResponse response = conn.getHttpResponse(); ReadableByteChannel source = (ReadableByteChannel) context.getAttribute(REQUEST_SOURCE_CHANNEL); ByteBuffer outbuf = (ByteBuffer) context.getAttribute(RESPONSE_BUFFER); Index: modules/nhttp/src/org/apache/axis2/transport/nhttp/PlainClientIOEventDispatch.java =================================================================== --- modules/nhttp/src/org/apache/axis2/transport/nhttp/PlainClientIOEventDispatch.java (revision 548631) +++ modules/nhttp/src/org/apache/axis2/transport/nhttp/PlainClientIOEventDispatch.java (working copy) @@ -23,6 +23,7 @@ import org.apache.http.nio.NHttpClientHandler; import org.apache.http.nio.reactor.IOEventDispatch; import org.apache.http.nio.reactor.IOSession; +import org.apache.http.nio.util.HeapByteBufferAllocator; import org.apache.http.params.HttpParams; public class PlainClientIOEventDispatch implements IOEventDispatch { @@ -47,9 +48,10 @@ public void connected(final IOSession session) { // Decorate I/O session with logging capabilities - DefaultNHttpClientConnection conn = new DefaultNHttpClientConnection( + LoggingNHttpClientConnection conn = new LoggingNHttpClientConnection( new LoggingIOSession(session), new DefaultHttpResponseFactory(), + new HeapByteBufferAllocator(), this.params); session.setAttribute(NHTTP_CONN, conn); Index: modules/nhttp/src/org/apache/axis2/transport/nhttp/LoggingIOSession.java =================================================================== --- modules/nhttp/src/org/apache/axis2/transport/nhttp/LoggingIOSession.java (revision 548631) +++ modules/nhttp/src/org/apache/axis2/transport/nhttp/LoggingIOSession.java (working copy) @@ -22,6 +22,7 @@ import java.net.SocketAddress; import java.nio.ByteBuffer; import java.nio.channels.ByteChannel; +import java.nio.channels.SelectionKey; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -68,10 +69,29 @@ return this.session.getEventMask(); } + private static String formatOps(int ops) { + StringBuffer buffer = new StringBuffer(6); + buffer.append('['); + if ((ops & SelectionKey.OP_READ) > 0) { + buffer.append('r'); + } + if ((ops & SelectionKey.OP_WRITE) > 0) { + buffer.append('w'); + } + if ((ops & SelectionKey.OP_ACCEPT) > 0) { + buffer.append('a'); + } + if ((ops & SelectionKey.OP_CONNECT) > 0) { + buffer.append('c'); + } + buffer.append(']'); + return buffer.toString(); + } + public void setEventMask(int ops) { if (this.log.isDebugEnabled()) { this.log.debug("I/O session " + this.id + " " + this.session + ": Set event mask " - + ops); + + formatOps(ops)); } this.session.setEventMask(ops); } @@ -79,7 +99,7 @@ public void setEvent(int op) { if (this.log.isDebugEnabled()) { this.log.debug("I/O session " + this.id + " " + this.session + ": Set event " - + op); + + formatOps(op)); } this.session.setEvent(op); } @@ -87,7 +107,7 @@ public void clearEvent(int op) { if (this.log.isDebugEnabled()) { this.log.debug("I/O session " + this.id + " " + this.session + ": Clear event " - + op); + + formatOps(op)); } this.session.clearEvent(op); } @@ -103,6 +123,13 @@ return this.session.isClosed(); } + public void shutdown() { + if (this.log.isDebugEnabled()) { + this.log.debug("I/O session " + this.id + " " + this.session + ": Shutdown"); + } + this.session.shutdown(); + } + public int getSocketTimeout() { return this.session.getSocketTimeout(); } Index: modules/nhttp/src/org/apache/axis2/transport/nhttp/LoggingNHttpServiceHandler.java =================================================================== --- modules/nhttp/src/org/apache/axis2/transport/nhttp/LoggingNHttpServiceHandler.java (revision 548631) +++ modules/nhttp/src/org/apache/axis2/transport/nhttp/LoggingNHttpServiceHandler.java (working copy) @@ -22,6 +22,7 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.apache.http.Header; import org.apache.http.HttpException; import org.apache.http.HttpRequest; import org.apache.http.nio.ContentDecoder; @@ -36,6 +37,7 @@ public class LoggingNHttpServiceHandler implements NHttpServiceHandler { private final Log log; + private final Log headerlog; private final NHttpServiceHandler handler; public LoggingNHttpServiceHandler(final NHttpServiceHandler handler) { @@ -45,6 +47,7 @@ } this.handler = handler; this.log = LogFactory.getLog(handler.getClass()); + this.headerlog = LogFactory.getLog("org.apache.axis2.transport.nhttp.headers"); } public void connected(final NHttpServerConnection conn) { @@ -62,31 +65,28 @@ } public void exception(final NHttpServerConnection conn, final IOException ex) { - if (ex.getMessage().indexOf("Connection reset") != -1 || - ex.getMessage().indexOf("forcibly closed") != -1) { - this.log.warn("HTTP connection " + conn + ": " + ex.getMessage()); - } else { - this.log.error("HTTP connection " + conn + ": " + ex.getMessage(), ex); - } + this.log.error("HTTP connection " + conn + ": " + ex.getMessage(), ex); this.handler.exception(conn, ex); } public void exception(final NHttpServerConnection conn, final HttpException ex) { - if (ex.getMessage().contains("Connection reset") || - ex.getMessage().contains("forcibly closed")) { - this.log.warn("HTTP connection " + conn + ": " + ex.getMessage()); - } else { - this.log.error("HTTP connection " + conn + ": " + ex.getMessage(), ex); - } + this.log.error("HTTP connection " + conn + ": " + ex.getMessage(), ex); this.handler.exception(conn, ex); } public void requestReceived(final NHttpServerConnection conn) { + HttpRequest request = conn.getHttpRequest(); if (this.log.isDebugEnabled()) { - HttpRequest request = conn.getHttpRequest(); this.log.debug("HTTP connection " + conn + ": " + request.getRequestLine()); } this.handler.requestReceived(conn); + if (this.headerlog.isDebugEnabled()) { + this.headerlog.debug(">> " + request.getRequestLine().toString()); + Header[] headers = request.getAllHeaders(); + for (int i = 0; i < headers.length; i++) { + this.headerlog.debug(">> " + headers[i].toString()); + } + } } public void outputReady(final NHttpServerConnection conn, final ContentEncoder encoder) { Index: modules/nhttp/src/org/apache/axis2/transport/nhttp/LoggingNHttpClientConnection.java =================================================================== --- modules/nhttp/src/org/apache/axis2/transport/nhttp/LoggingNHttpClientConnection.java (revision 0) +++ modules/nhttp/src/org/apache/axis2/transport/nhttp/LoggingNHttpClientConnection.java (revision 0) @@ -0,0 +1,76 @@ +/* + * $HeadURL$ + * $Revision$ + * $Date$ + * + * ==================================================================== + * 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. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * <http://www.apache.org/>. + * + */ + +package org.apache.axis2.transport.nhttp; + +import java.io.IOException; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.http.Header; +import org.apache.http.HttpException; +import org.apache.http.HttpRequest; +import org.apache.http.HttpResponseFactory; +import org.apache.http.impl.nio.DefaultNHttpClientConnection; +import org.apache.http.nio.reactor.IOSession; +import org.apache.http.nio.util.ByteBufferAllocator; +import org.apache.http.params.HttpParams; + +public class LoggingNHttpClientConnection extends DefaultNHttpClientConnection { + + private final Log log; + private final Log headerlog; + + public LoggingNHttpClientConnection( + final IOSession session, + final HttpResponseFactory responseFactory, + final ByteBufferAllocator allocator, + final HttpParams params) { + super(session, responseFactory, allocator, params); + this.log = LogFactory.getLog(DefaultNHttpClientConnection.class); + this.headerlog = LogFactory.getLog("org.apache.axis2.transport.nhttp.headers"); + } + + public void submitRequest(final HttpRequest request) throws IOException, HttpException { + if (this.log.isDebugEnabled()) { + this.log.debug("HTTP connection " + this + ": " + request.getRequestLine().toString()); + } + super.submitRequest(request); + if (this.headerlog.isDebugEnabled()) { + this.headerlog.debug(">> " + request.getRequestLine().toString()); + Header[] headers = request.getAllHeaders(); + for (int i = 0; i < headers.length; i++) { + this.headerlog.debug(">> " + headers[i].toString()); + } + } + } + +} \ No newline at end of file Property changes on: modules/nhttp/src/org/apache/axis2/transport/nhttp/LoggingNHttpClientConnection.java ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:keywords + Date Author Id Revision HeadURL Name: svn:eol-style + native Index: pom.xml =================================================================== --- pom.xml (revision 548631) +++ pom.xml (working copy) @@ -306,7 +306,7 @@ <dependency> <groupId>org.apache.httpcomponents</groupId> - <artifactId>jakarta-httpcore</artifactId> + <artifactId>httpcore</artifactId> <version>${jakarta.httpcore.nio.version}</version> </dependency> @@ -585,17 +585,17 @@ <!-- dependencies for nhttp transport --> <dependency> <groupId>org.apache.httpcomponents</groupId> - <artifactId>jakarta-httpcore</artifactId> + <artifactId>httpcore</artifactId> <version>${jakarta.httpcore.nio.version}</version> </dependency> <dependency> <groupId>org.apache.httpcomponents</groupId> - <artifactId>jakarta-httpcore-nio</artifactId> + <artifactId>httpcore-nio</artifactId> <version>${jakarta.httpcore.nio.version}</version> </dependency> <dependency> <groupId>org.apache.httpcomponents</groupId> - <artifactId>jakarta-httpcore-niossl</artifactId> + <artifactId>httpcore-niossl</artifactId> <version>${jakarta.httpcore.nio.version}</version> </dependency> @@ -728,7 +728,7 @@ <properties> <!-- Synapse and related components --> <synapse.version>1.0-RC2-SNAPSHOT</synapse.version> - <jakarta.httpcore.nio.version>4.0-alpha4</jakarta.httpcore.nio.version> + <jakarta.httpcore.nio.version>4.0-alpha5-SNAPSHOT</jakarta.httpcore.nio.version> <!-- Axis2 1.2 and its dependencies --> <axis2.version>1.2</axis2.version>

--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to