All Downloads are FREE. Search and download functionalities are using the official Maven repository.

simplehttp.listener.LoggingHttpClient Maven / Gradle / Ivy

The newest version!
/*
 * Copyright (c) 2011-2019, simple-http committers
 *
 * 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 simplehttp.listener;

import org.apache.log4j.Logger;
import simplehttp.*;

import java.net.URL;

public class LoggingHttpClient implements HttpClient {

    private static final String lineSeparator = System.getProperty("line.separator");

    private final HttpClient delegate;
    private final Logger log;

    public LoggingHttpClient(HttpClient delegate, Logger logger) {
        this.log = logger;
        this.delegate = delegate;
    }

    @Override
    public HttpResponse get(final URL url) throws HttpException {
        HttpResponse response = null;
        try {
            response = delegate.get(url);
            return response;
        } finally {
            if (log.isInfoEnabled())
                log.info(message(url, new HttpGetMessage(), response));
        }
    }

    @Override
    public HttpResponse get(URL url, Headers headers) throws HttpException {
        HttpResponse response = null;
        try {
            response = delegate.get(url, headers);
            return response;
        } finally {
            if (log.isInfoEnabled())
                log.info(message(url, new HttpGetMessage(headers), response));
        }
    }

    @Override
    public HttpResponse post(URL url, HttpPost message) throws HttpException {
        HttpResponse response = null;
        try {
            response = delegate.post(url, message);
            return response;
        } finally {
            if (log.isInfoEnabled())
                log.info(message(url, message, response));
        }
    }

    @Override
    public HttpResponse put(URL url, HttpPut message) throws HttpException {
        HttpResponse response = null;
        try {
            response = delegate.put(url, message);
            return response;
        } finally {
            if (log.isInfoEnabled())
                log.info(message(url, message, response));
        }
    }

    @Override
    public HttpResponse delete(URL url) throws HttpException {
        HttpResponse response = null;
        try {
            response = delegate.delete(url);
            return response;
        } finally {
            if (log.isInfoEnabled())
                log.info(message(url, new HttpDeleteMessage(), response));
        }
    }

    @Override
    public HttpResponse options(URL url) throws HttpException {
        throw new UnsupportedOperationException();
    }

    @Override
    public void shutdown() {
        delegate.shutdown();
    }

    private String message(URL url, HttpRequest request, HttpResponse response) {
        StringBuilder builder = new StringBuilder().append(request(url, request)).append(lineSeparator);
        if (response != null)
            builder.append(response(response));
        return builder.toString();
    }

    private String request(URL url, final HttpRequest message) {
        RawHttpRequest rawRequest = new RawHttpRequest(url);
        message.accept(rawRequest);
        return rawRequest.asString();
    }
    
    private String response(HttpResponse response) {
        return new StringBuilder()
            .append("HTTP/1.1 ")
            .append(response.getStatusCode())
            .append(" ")
            .append(response.getStatusMessage())
            .append(lineSeparator)
            .append(headers(response.getHeaders()))
            .append(lineSeparator)
            .append(response.getContent().asString())
            .toString();
    }
    
    private static String headers(Headers headers) {
        StringBuilder builder = new StringBuilder();
        for (Header header : headers)
            builder.append(header.name()).append(": ").append(header.value()).append(lineSeparator);
        return builder.toString();
    }

    private static class RawHttpRequest implements HttpRequestVisitor {

        private final URL url;
        private final StringBuilder builder;

        public RawHttpRequest(URL url) {
            this.url = url;
            this.builder = new StringBuilder();
        }

        @Override
        public void visit(HttpGet message) {
            asHttpString(message, "GET");
        }

        @Override
        public void visit(HttpDelete message) {
            asHttpString(message, "DELETE");
        }

        @Override
        public void visit(FormUrlEncodedMessage message) {
            asHttpString(message, "POST");
        }

        @Override
        public void visit(UnencodedStringMessage message) {
            asHttpString(message, "POST");
        }

        @Override
        public void visit(Multipart multipart) {
            asHttpString(multipart, "POST");
        }

        private void asHttpString(HttpMessage message, String method) {
            builder
                .append(method)
                .append(" ")
                .append(url.toExternalForm())
                .append(" HTTP/1.1")
                .append(lineSeparator)
                .append(headers(message.getHeaders()))
                .append(lineSeparator)
                .append(message.getContent().asString());
        }

        public String asString() {
            return builder.toString();
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy