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