
com.googlecode.fascinator.common.BasicHttpClient Maven / Gradle / Ivy
/*
* The Fascinator - Common Library
* Copyright (C) 2008-2009 University of Southern Queensland
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
package com.googlecode.fascinator.common;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.Proxy;
import java.net.ProxySelector;
import java.net.URL;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpMethodBase;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.UsernamePasswordCredentials;
import org.apache.commons.httpclient.auth.AuthScope;
import org.apache.commons.httpclient.methods.GetMethod;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Commons HttpClient wrapper that makes it easier to work with proxies and
* authentication
*
* @author Oliver Lucido
*/
public class BasicHttpClient {
/** Logging */
private Logger log = LoggerFactory.getLogger(BasicHttpClient.class);
/** Base URL for all requests */
private String baseUrl;
/** Authentication credentials */
private UsernamePasswordCredentials credentials;
/**
* Creates an HTTP client for the specified base URL. The base URL is used
* in determining proxy usage.
*
* @param baseUrl the base URL
*/
public BasicHttpClient(String baseUrl) {
if (baseUrl.endsWith("/")) {
baseUrl = baseUrl.substring(0, baseUrl.length() - 1);
}
this.baseUrl = baseUrl;
}
/**
* Sets the authentication credentials for authenticated requests
*
* @param username a username
* @param password a password
*/
public void authenticate(String username, String password) {
credentials = new UsernamePasswordCredentials(username, password);
}
/**
* Gets an HTTP client. If authentication is required, the authenticate()
* method must be called prior to this method.
*
* @param auth set true to use authentication, false to skip authentication
* @return an HTTP client
*/
public HttpClient getHttpClient(boolean auth) {
HttpClient client = new HttpClient();
try {
URL url = new URL(baseUrl);
Proxy proxy = ProxySelector.getDefault().select(url.toURI()).get(0);
if (!proxy.type().equals(Proxy.Type.DIRECT)) {
InetSocketAddress address = (InetSocketAddress) proxy.address();
String proxyHost = address.getHostName();
int proxyPort = address.getPort();
client.getHostConfiguration().setProxy(proxyHost, proxyPort);
log.trace("Using proxy {}:{}", proxyHost, proxyPort);
}
} catch (Exception e) {
log.warn("Failed to get proxy settings: " + e.getMessage());
}
if (auth && credentials != null) {
client.getParams().setAuthenticationPreemptive(true);
client.getState().setCredentials(AuthScope.ANY, credentials);
log.trace("Credentials: username={}", credentials.getUserName());
}
return client;
}
/**
* Gets the base URL
*
* @return the base URL
*/
public String getBaseUrl() {
return baseUrl;
}
/**
* Sends an HTTP request. This method uses authentication for all requests
* except GET.
*
* @param method an HTTP method
* @return HTTP status code
* @throws IOException if an error occurred during the HTTP request
*/
public int executeMethod(HttpMethodBase method) throws IOException {
boolean auth = !(method instanceof GetMethod);
return executeMethod(method, auth);
}
/**
* Sends an HTTP request
*
* @param method an HTTP method
* @param auth true to request with authentication, false to request without
* @return HTTP status code
* @throws IOException if an error occurred during the HTTP request
*/
public int executeMethod(HttpMethodBase method, boolean auth)
throws IOException {
log.trace("{} {}", method.getName(), method.getURI());
int status = getHttpClient(auth).executeMethod(method);
log.trace("{} {}", status, HttpStatus.getStatusText(status));
return status;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy