You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hc.apache.org by ol...@apache.org on 2009/10/10 15:19:55 UTC

svn commit: r823851 - in /httpcomponents/httpcore/trunk/contrib/src/main/java/org/apache/http/contrib/logging: LoggingIOSession.java LoggingNHttpClientConnection.java LoggingNHttpServerConnection.java Wire.java

Author: olegk
Date: Sat Oct 10 13:19:54 2009
New Revision: 823851

URL: http://svn.apache.org/viewvc?rev=823851&view=rev
Log:
Logging improvements

Added:
    httpcomponents/httpcore/trunk/contrib/src/main/java/org/apache/http/contrib/logging/Wire.java   (with props)
Modified:
    httpcomponents/httpcore/trunk/contrib/src/main/java/org/apache/http/contrib/logging/LoggingIOSession.java
    httpcomponents/httpcore/trunk/contrib/src/main/java/org/apache/http/contrib/logging/LoggingNHttpClientConnection.java
    httpcomponents/httpcore/trunk/contrib/src/main/java/org/apache/http/contrib/logging/LoggingNHttpServerConnection.java

Modified: httpcomponents/httpcore/trunk/contrib/src/main/java/org/apache/http/contrib/logging/LoggingIOSession.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/contrib/src/main/java/org/apache/http/contrib/logging/LoggingIOSession.java?rev=823851&r1=823850&r2=823851&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/contrib/src/main/java/org/apache/http/contrib/logging/LoggingIOSession.java (original)
+++ httpcomponents/httpcore/trunk/contrib/src/main/java/org/apache/http/contrib/logging/LoggingIOSession.java Sat Oct 10 13:19:54 2009
@@ -49,6 +49,7 @@
     private static AtomicLong COUNT = new AtomicLong(0);
     
     private final Log log;
+    private final Wire wirelog;
     private final IOSession session;
     private final ByteChannel channel;
     private final String id;
@@ -62,6 +63,7 @@
         this.channel = new LoggingByteChannel();
         this.id = id + "-" + COUNT.incrementAndGet();
         this.log = LogFactory.getLog(session.getClass());
+        this.wirelog = new Wire(LogFactory.getLog("org.apache.http.wire"));
     }
 
     public ByteChannel channel() {
@@ -196,6 +198,13 @@
             if (log.isDebugEnabled()) {
                 log.debug("I/O session " + id + " " + session + ": " + bytesRead + " bytes read");
             }
+            if (bytesRead > 0 && wirelog.isEnabled()) {
+                ByteBuffer b = dst.duplicate();
+                int p = b.position();
+                b.limit(p);
+                b.position(p - bytesRead);
+                wirelog.input(b);
+            }
             return bytesRead;
         }
 
@@ -204,6 +213,13 @@
             if (log.isDebugEnabled()) {
                 log.debug("I/O session " + id + " " + session + ": " + byteWritten + " bytes written");
             }
+            if (byteWritten > 0 && wirelog.isEnabled()) {
+                ByteBuffer b = src.duplicate();
+                int p = b.position();
+                b.limit(p);
+                b.position(p - byteWritten);
+                wirelog.output(b);
+            }
             return byteWritten;
         }
 

Modified: httpcomponents/httpcore/trunk/contrib/src/main/java/org/apache/http/contrib/logging/LoggingNHttpClientConnection.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/contrib/src/main/java/org/apache/http/contrib/logging/LoggingNHttpClientConnection.java?rev=823851&r1=823850&r2=823851&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/contrib/src/main/java/org/apache/http/contrib/logging/LoggingNHttpClientConnection.java (original)
+++ httpcomponents/httpcore/trunk/contrib/src/main/java/org/apache/http/contrib/logging/LoggingNHttpClientConnection.java Sat Oct 10 13:19:54 2009
@@ -28,16 +28,23 @@
 package org.apache.http.contrib.logging;
 
 import java.io.IOException;
+import java.nio.channels.ReadableByteChannel;
 
 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.HttpMessage;
 import org.apache.http.HttpRequest;
+import org.apache.http.HttpResponse;
 import org.apache.http.HttpResponseFactory;
 import org.apache.http.impl.nio.DefaultNHttpClientConnection;
 import org.apache.http.nio.NHttpClientHandler;
+import org.apache.http.nio.NHttpMessageParser;
+import org.apache.http.nio.NHttpMessageWriter;
 import org.apache.http.nio.reactor.IOSession;
+import org.apache.http.nio.reactor.SessionInputBuffer;
+import org.apache.http.nio.reactor.SessionOutputBuffer;
 import org.apache.http.nio.util.ByteBufferAllocator;
 import org.apache.http.params.HttpParams;
 
@@ -56,38 +63,114 @@
         this.headerlog = LogFactory.getLog("org.apache.http.headers");
     }
 
+    @Override
     public void close() throws IOException {
         this.log.debug("Close connection");        
         super.close();
     }
 
+    @Override
     public void shutdown() throws IOException {
         this.log.debug("Shutdown connection");        
         super.shutdown();
     }
 
+    @Override
     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());
-            }
-        }
     }
 
+    @Override
     public void consumeInput(final NHttpClientHandler handler) {
         this.log.debug("Consume input");        
         super.consumeInput(handler);
     }
 
+    @Override
     public void produceOutput(final NHttpClientHandler handler) {
         this.log.debug("Produce output");        
         super.produceOutput(handler);
     }
+
+    @Override
+    protected NHttpMessageWriter createRequestWriter(
+            final SessionOutputBuffer buffer, 
+            final HttpParams params) {
+        return new LoggingNHttpMessageWriter(
+                super.createRequestWriter(buffer, params));
+    }
+
+    @Override
+    protected NHttpMessageParser createResponseParser(
+            final SessionInputBuffer buffer, 
+            final HttpResponseFactory responseFactory,
+            final HttpParams params) {
+        return new LoggingNHttpMessageParser(
+                super.createResponseParser(buffer, responseFactory, params));
+    }
+
+    class LoggingNHttpMessageWriter implements NHttpMessageWriter {
+
+        private final NHttpMessageWriter writer;
+        
+        public LoggingNHttpMessageWriter(final NHttpMessageWriter writer) {
+            super();
+            this.writer = writer;
+        }
+        
+        public void reset() {
+            this.writer.reset();
+        }
+
+        public void write(final HttpMessage message) throws IOException, HttpException {
+            if (message != null && headerlog.isDebugEnabled()) {
+                HttpRequest request = (HttpRequest) message; 
+                headerlog.debug(">> " + request.getRequestLine().toString());
+                Header[] headers = request.getAllHeaders();
+                for (int i = 0; i < headers.length; i++) {
+                    headerlog.debug(">> " + headers[i].toString());
+                }
+            }
+            this.writer.write(message);
+        }
+        
+    }
     
+    class LoggingNHttpMessageParser implements NHttpMessageParser {
+
+        private final NHttpMessageParser parser;
+        
+        public LoggingNHttpMessageParser(final NHttpMessageParser parser) {
+            super();
+            this.parser = parser;
+        }
+        
+        public void reset() {
+            this.parser.reset();
+        }
+
+        public int fillBuffer(final ReadableByteChannel channel) throws IOException {
+            return this.parser.fillBuffer(channel);
+        }
+
+        public HttpMessage parse() throws IOException, HttpException {
+            HttpMessage message = this.parser.parse();
+            if (headerlog.isDebugEnabled()) {
+                HttpResponse response = (HttpResponse) message; 
+                if (response != null && headerlog.isDebugEnabled()) {
+                    headerlog.debug("<< " + response.getStatusLine().toString());
+                    Header[] headers = response.getAllHeaders();
+                    for (int i = 0; i < headers.length; i++) {
+                        headerlog.debug("<< " + headers[i].toString());
+                    }
+                }
+            }
+            return message;
+        }
+        
+    }
+
 }
\ No newline at end of file

Modified: httpcomponents/httpcore/trunk/contrib/src/main/java/org/apache/http/contrib/logging/LoggingNHttpServerConnection.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/contrib/src/main/java/org/apache/http/contrib/logging/LoggingNHttpServerConnection.java?rev=823851&r1=823850&r2=823851&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/contrib/src/main/java/org/apache/http/contrib/logging/LoggingNHttpServerConnection.java (original)
+++ httpcomponents/httpcore/trunk/contrib/src/main/java/org/apache/http/contrib/logging/LoggingNHttpServerConnection.java Sat Oct 10 13:19:54 2009
@@ -28,16 +28,23 @@
 package org.apache.http.contrib.logging;
 
 import java.io.IOException;
+import java.nio.channels.ReadableByteChannel;
 
 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.HttpMessage;
+import org.apache.http.HttpRequest;
 import org.apache.http.HttpRequestFactory;
 import org.apache.http.HttpResponse;
 import org.apache.http.impl.nio.DefaultNHttpServerConnection;
+import org.apache.http.nio.NHttpMessageParser;
+import org.apache.http.nio.NHttpMessageWriter;
 import org.apache.http.nio.NHttpServiceHandler;
 import org.apache.http.nio.reactor.IOSession;
+import org.apache.http.nio.reactor.SessionInputBuffer;
+import org.apache.http.nio.reactor.SessionOutputBuffer;
 import org.apache.http.nio.util.ByteBufferAllocator;
 import org.apache.http.params.HttpParams;
 
@@ -56,38 +63,112 @@
         this.headerlog = LogFactory.getLog("org.apache.http.headers");
     }
 
+    @Override
     public void close() throws IOException {
         this.log.debug("Close connection");        
         super.close();
     }
 
+    @Override
     public void shutdown() throws IOException {
         this.log.debug("Shutdown connection");        
         super.shutdown();
     }
     
+    @Override
     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());
-            }
-        }
     }
 
+    @Override
     public void consumeInput(final NHttpServiceHandler handler) {
         this.log.debug("Consume input");        
         super.consumeInput(handler);
     }
 
+    @Override
     public void produceOutput(final NHttpServiceHandler handler) {
         this.log.debug("Produce output");        
         super.produceOutput(handler);
     }
     
+    @Override
+    protected NHttpMessageWriter createResponseWriter(
+            final SessionOutputBuffer buffer, 
+            final HttpParams params) {
+        return new LoggingNHttpMessageWriter(
+                super.createResponseWriter(buffer, params));
+    }
+
+    @Override
+    protected NHttpMessageParser createRequestParser(
+            final SessionInputBuffer buffer, 
+            final HttpRequestFactory requestFactory,
+            final HttpParams params) {
+        return new LoggingNHttpMessageParser(
+                super.createRequestParser(buffer, requestFactory, params));
+    }
+
+    class LoggingNHttpMessageWriter implements NHttpMessageWriter {
+
+        private final NHttpMessageWriter writer;
+        
+        public LoggingNHttpMessageWriter(final NHttpMessageWriter writer) {
+            super();
+            this.writer = writer;
+        }
+        
+        public void reset() {
+            this.writer.reset();
+        }
+
+        public void write(final HttpMessage message) throws IOException, HttpException {
+            if (message != null && headerlog.isDebugEnabled()) {
+                HttpResponse response = (HttpResponse) message; 
+                headerlog.debug("<< " + response.getStatusLine().toString());
+                Header[] headers = response.getAllHeaders();
+                for (int i = 0; i < headers.length; i++) {
+                    headerlog.debug("<< " + headers[i].toString());
+                }
+            }
+            this.writer.write(message);
+        }
+        
+    }
+    
+    class LoggingNHttpMessageParser implements NHttpMessageParser {
+
+        private final NHttpMessageParser parser;
+        
+        public LoggingNHttpMessageParser(final NHttpMessageParser parser) {
+            super();
+            this.parser = parser;
+        }
+        
+        public void reset() {
+            this.parser.reset();
+        }
+
+        public int fillBuffer(final ReadableByteChannel channel) throws IOException {
+            return this.parser.fillBuffer(channel);
+        }
+
+        public HttpMessage parse() throws IOException, HttpException {
+            HttpMessage message = this.parser.parse();
+            if (message != null && headerlog.isDebugEnabled()) {
+                HttpRequest request = (HttpRequest) message; 
+                headerlog.debug(">> " + request.getRequestLine().toString());
+                Header[] headers = request.getAllHeaders();
+                for (int i = 0; i < headers.length; i++) {
+                    headerlog.debug(">> " + headers[i].toString());
+                }
+            }
+            return message;
+        }
+        
+    }
+
 }
\ No newline at end of file

Added: httpcomponents/httpcore/trunk/contrib/src/main/java/org/apache/http/contrib/logging/Wire.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/contrib/src/main/java/org/apache/http/contrib/logging/Wire.java?rev=823851&view=auto
==============================================================================
--- httpcomponents/httpcore/trunk/contrib/src/main/java/org/apache/http/contrib/logging/Wire.java (added)
+++ httpcomponents/httpcore/trunk/contrib/src/main/java/org/apache/http/contrib/logging/Wire.java Sat Oct 10 13:19:54 2009
@@ -0,0 +1,119 @@
+/*
+ * ====================================================================
+ * 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.http.contrib.logging;
+
+import java.nio.ByteBuffer;
+
+import org.apache.commons.logging.Log;
+
+class Wire {
+
+    private final Log log;
+    
+    public Wire(final Log log) {
+        super();
+        this.log = log;
+    }
+    
+    private void wire(final String header, final byte[] b, int pos, int off) {
+        StringBuilder buffer = new StringBuilder();
+        for (int i = 0; i < off; i++) {
+            int ch = b[pos + i];
+            if (ch == 13) {
+                buffer.append("[\\r]");
+            } else if (ch == 10) {
+                    buffer.append("[\\n]\"");
+                    buffer.insert(0, "\"");
+                    buffer.insert(0, header);
+                    this.log.debug(buffer.toString());
+                    buffer.setLength(0);
+            } else if ((ch < 32) || (ch > 127)) {
+                buffer.append("[0x");
+                buffer.append(Integer.toHexString(ch));
+                buffer.append("]");
+            } else {
+                buffer.append((char) ch);
+            }
+        } 
+        if (buffer.length() > 0) {
+            buffer.append('\"');
+            buffer.insert(0, '\"');
+            buffer.insert(0, header);
+            this.log.debug(buffer.toString());
+        }
+    }
+
+
+    public boolean isEnabled() {
+        return this.log.isDebugEnabled();
+    }    
+    
+    public void output(final byte[] b, int pos, int off) {
+        wire("<< ", b, pos, off);
+    }
+
+    public void input(final byte[] b, int pos, int off) {
+        wire(">> ", b, pos, off);
+    }
+
+    public void output(byte[] b) {
+        output(b, 0, b.length);
+    }
+
+    public void input(byte[] b) {
+        input(b, 0, b.length);
+    }
+
+    public void output(int b) {
+        output(new byte[] {(byte) b});
+    }
+
+    public void input(int b) {
+        input(new byte[] {(byte) b});
+    }
+
+    public void output(final ByteBuffer b) {
+        if (b.hasArray()) {
+            output(b.array(), b.arrayOffset() + b.position(), b.remaining());
+        } else {
+            byte[] tmp = new byte[b.remaining()];
+            b.get(tmp);
+            output(tmp);
+        }
+    }
+
+    public void input(final ByteBuffer b) {
+        if (b.hasArray()) {
+            input(b.array(), b.arrayOffset() + b.position(), b.remaining());
+        } else {
+            byte[] tmp = new byte[b.remaining()];
+            b.get(tmp);
+            input(tmp);
+        }
+    }
+
+}

Propchange: httpcomponents/httpcore/trunk/contrib/src/main/java/org/apache/http/contrib/logging/Wire.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: httpcomponents/httpcore/trunk/contrib/src/main/java/org/apache/http/contrib/logging/Wire.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: httpcomponents/httpcore/trunk/contrib/src/main/java/org/apache/http/contrib/logging/Wire.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain