/* * ==================================================================== * 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 * . * */ package org.apache.http.contrib.logging; import java.io.IOException; import java.util.concurrent.atomic.AtomicLong; 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.HttpResponse; import org.apache.http.HttpResponseFactory; import org.apache.http.impl.nio.DefaultNHttpClientConnection; import org.apache.http.nio.NHttpClientEventHandler; 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 static final AtomicLong COUNT = new AtomicLong(); private final Log log; private final Log iolog; private final Log headerlog; private final Log wirelog; private final String id; public LoggingNHttpClientConnection( final IOSession session, final HttpResponseFactory responseFactory, final ByteBufferAllocator allocator, final HttpParams params) { super(session, responseFactory, allocator, params); this.log = LogFactory.getLog(getClass()); this.iolog = LogFactory.getLog(session.getClass()); this.headerlog = LogFactory.getLog("org.apache.http.headers"); this.wirelog = LogFactory.getLog("org.apache.http.wire"); this.id = "http-outgoing-" + COUNT.incrementAndGet(); if (this.iolog.isDebugEnabled() || this.wirelog.isDebugEnabled()) { this.session = new LoggingIOSession(session, this.id, this.iolog, this.wirelog); } } @Override public void close() throws IOException { if (this.log.isDebugEnabled()) { this.log.debug(this.id + ": Close connection"); } super.close(); } @Override public void shutdown() throws IOException { if (this.log.isDebugEnabled()) { this.log.debug(this.id + ": Shutdown connection"); } super.shutdown(); } @Override public void submitRequest(final HttpRequest request) throws IOException, HttpException { if (this.log.isDebugEnabled()) { this.log.debug(this.id + ": " + request.getRequestLine().toString()); } super.submitRequest(request); } @Override public void consumeInput(final NHttpClientEventHandler handler) { if (this.log.isDebugEnabled()) { this.log.debug(this.id + ": Consume input"); } super.consumeInput(handler); } @Override public void produceOutput(final NHttpClientEventHandler handler) { if (this.log.isDebugEnabled()) { this.log.debug(this.id + ": Produce output"); } super.produceOutput(handler); } @Override protected void onResponseReceived(final HttpResponse response) { if (response != null && this.headerlog.isDebugEnabled()) { this.headerlog.debug(this.id + " << " + response.getStatusLine().toString()); Header[] headers = response.getAllHeaders(); for (int i = 0; i < headers.length; i++) { this.headerlog.debug(this.id + " << " + headers[i].toString()); } } } @Override protected void onRequestSubmitted(final HttpRequest request) { if (request != null && this.headerlog.isDebugEnabled()) { this.headerlog.debug(id + " >> " + request.getRequestLine().toString()); Header[] headers = request.getAllHeaders(); for (int i = 0; i < headers.length; i++) { this.headerlog.debug(this.id + " >> " + headers[i].toString()); } } } @Override public String toString() { return this.id; } }