/***********************************************************************
*
* $CVSHeader$
*
* This file is part of WebScarab, an Open Web Application Security
* Project utility. For details, please see http://www.owasp.org/
*
* Copyright (c) 2002 - 2004 Rogan Dawes
*
* 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* Getting Source
* ==============
*
* Source for this application is maintained at Sourceforge.net, a
* repository for free software projects.
*
* For details, please see http://www.sourceforge.net/projects/owasp
*
*/
/*
* HttpClientFactory.java
*
* Created on August 19, 2004, 11:22 PM
*/
package org.owasp.webscarab.httpclient;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Logger;
import org.owasp.webscarab.model.Request;
import org.owasp.webscarab.model.Response;
/**
*
* @author rdawes
*/
public class HTTPClientFactory {
private static HTTPClientFactory _instance = new HTTPClientFactory();
private Logger _logger = Logger.getLogger(getClass().getName());
private String _httpProxy = "";
private int _httpProxyPort = 80;
private String _httpsProxy = "";
private int _httpsProxyPort = 80;
private String[] _noProxy = new String[0];
private int _connectTimeout = 30000;
private int _readTimeout = 0;
private SSLContextManager _sslContextManager = null;
private Authenticator _authenticator = null;
private List<HTTPClient> _clientList = new ArrayList<HTTPClient>();
private List<HTTPClient> _availableClients = new ArrayList<HTTPClient>();
/** Creates a new instance of HttpClientFactory */
protected HTTPClientFactory() {
_sslContextManager = new SSLContextManager();
}
public static HTTPClientFactory getInstance() {
return _instance;
}
public SSLContextManager getSSLContextManager() {
return _sslContextManager;
}
public void setHttpProxy(String proxy, int port) {
if (proxy == null) proxy = "";
_httpProxy = proxy;
if (port<1 || port > 65535) throw new IllegalArgumentException("Port is out of range: " + port);
_httpProxyPort = port;
}
public String getHttpProxy() {
return _httpProxy;
}
public int getHttpProxyPort() {
return _httpProxyPort;
}
public void setHttpsProxy(String proxy, int port) {
if (proxy == null) proxy = "";
_httpsProxy = proxy;
if (port<1 || port > 65535) throw new IllegalArgumentException("Port is out of range: " + port);
_httpsProxyPort = port;
}
public String getHttpsProxy() {
return _httpsProxy;
}
public int getHttpsProxyPort() {
return _httpsProxyPort;
}
public void setNoProxy(String[] noProxy) {
_noProxy = noProxy;
if (_noProxy == null) _noProxy = new String[0];
}
public String[] getNoProxy() {
return _noProxy;
}
public void setTimeouts(int connectTimeout, int readTimeout) {
_connectTimeout = connectTimeout;
_readTimeout = readTimeout;
}
public void setAuthenticator(Authenticator authenticator) {
_authenticator = authenticator;
}
public Authenticator getAuthenticator() {
return _authenticator;
}
public HTTPClient getHTTPClient() {
URLFetcher uf = new URLFetcher();
uf.setHttpProxy(_httpProxy, _httpProxyPort);
uf.setHttpsProxy(_httpsProxy, _httpsProxyPort);
uf.setNoProxy(_noProxy);
uf.setSSLContextManager(_sslContextManager);
uf.setTimeouts(_connectTimeout, _readTimeout);
uf.setAuthenticator(_authenticator);
return uf;
}
public Response fetchResponse(Request request) throws IOException {
HTTPClient hc = null;
synchronized (_availableClients) {
if (_availableClients.size()>0) {
hc = _availableClients.remove(0);
} else {
_logger.info("Creating a new Fetcher");
hc = getHTTPClient();
_clientList.add(hc);
}
}
Response response = null;
IOException ioe = null;
try {
response = hc.fetchResponse(request);
} catch (IOException e) {
ioe = e;
}
synchronized (_availableClients) {
_availableClients.add(hc);
}
if (ioe != null) throw ioe;
return response;
}
}