package com.grendelscan.proxy; import java.security.KeyManagementException; import java.security.NoSuchAlgorithmException; import org.apache.http.HttpVersion; import org.apache.http.client.params.ClientPNames; import org.apache.http.conn.ClientConnectionManager; import org.apache.http.conn.scheme.PlainSocketFactory; import org.apache.http.conn.scheme.Scheme; import org.apache.http.conn.scheme.SchemeRegistry; import org.apache.http.conn.scheme.SchemeSocketFactory; import org.apache.http.impl.DefaultConnectionReuseStrategy; import org.apache.http.impl.DefaultHttpResponseFactory; import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager; import org.apache.http.params.BasicHttpParams; import org.apache.http.params.CoreConnectionPNames; import org.apache.http.params.CoreProtocolPNames; import org.apache.http.params.HttpParams; import org.apache.http.protocol.BasicHttpContext; import org.apache.http.protocol.BasicHttpProcessor; import org.apache.http.protocol.HttpContext; import org.apache.http.protocol.HttpRequestHandlerRegistry; import org.apache.http.protocol.HttpService; import org.apache.http.protocol.ResponseConnControl; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.grendelscan.commons.http.ssl.CustomSSLSocketFactory; public class MiscHttpFactory { private static final Logger LOGGER = LoggerFactory.getLogger(MiscHttpFactory.class); public static HttpParams createDefaultHttpProxyParams() { LOGGER.trace("MiscHttpFactory.createDefaultHttpProxyParams"); HttpParams params = new BasicHttpParams(); params.setIntParameter(CoreConnectionPNames.SOCKET_BUFFER_SIZE, 8 * 1024); params.setBooleanParameter(CoreConnectionPNames.STALE_CONNECTION_CHECK, false); params.setBooleanParameter(CoreConnectionPNames.TCP_NODELAY, true); params.setParameter(CoreProtocolPNames.ORIGIN_SERVER, GrendelScan.versionHttpText); // ConnPerRouteBean maxConnectionsPerRoute = new ConnPerRouteBean(); // params.setParameter(ConnManagerPNames.MAX_CONNECTIONS_PER_ROUTE, maxConnectionsPerRoute); // params.setIntParameter(ConnManagerPNames.MAX_TOTAL_CONNECTIONS, 5); params.setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1); params.setParameter(CoreProtocolPNames.HTTP_CONTENT_CHARSET, "UTF-8"); params.setBooleanParameter(ClientPNames.HANDLE_REDIRECTS, false); params.setIntParameter(CoreConnectionPNames.SO_TIMEOUT, 500); params.setIntParameter(CoreConnectionPNames.SO_LINGER, 10000); params.setBooleanParameter(CoreProtocolPNames.USE_EXPECT_CONTINUE, false); return params; } public static HttpContext createHttpProxyContext() { LOGGER.trace("MiscHttpFactory.createHttpProxyContext"); HttpContext context = new BasicHttpContext(null); return context; } public static HttpService createHttpServiceProxy(final AbstractProxyRequestHandler requestHandler) { LOGGER.trace("MiscHttpFactory.createHttpServiceProxy"); HttpParams proxyParams = createDefaultHttpProxyParams(); // Set up the HTTP protocol processor BasicHttpProcessor httpproc = new BasicHttpProcessor(); httpproc.addInterceptor(new ResponseConnControl()); // Set up request handlers HttpRequestHandlerRegistry registry = new HttpRequestHandlerRegistry(); registry.register("*", requestHandler); // Set up the HTTP service HttpService httpService = new HttpService(httpproc, new DefaultConnectionReuseStrategy(), new DefaultHttpResponseFactory(), registry, proxyParams); return httpService; } public static ClientConnectionManager createProxyClientConnectionManager() { LOGGER.trace("MiscHttpFactory.createProxyClientConnectionManager"); SchemeRegistry supportedSchemes; supportedSchemes = new SchemeRegistry(); // Register the "http" and "https" protocol schemes, they are // required by the default operator to look up socket factories. SchemeSocketFactory sf = PlainSocketFactory.getSocketFactory(); supportedSchemes.register(new Scheme("http", 80, sf)); CustomSSLSocketFactory sslsf; try { sslsf = new CustomSSLSocketFactory(); supportedSchemes.register(new Scheme("https", 443, sslsf)); } catch (KeyManagementException e) { LOGGER.error("Problem creating SSLSocketFactory: " + e.toString(), e); System.exit(0); } catch (NoSuchAlgorithmException e) { LOGGER.error("Problem creating SSLSocketFactory: " + e.toString(), e); System.exit(0); } return new ThreadSafeClientConnManager(supportedSchemes); } }