package com.grendelscan.commons.http.apache_overrides.client; import java.net.InetAddress; import org.apache.http.HttpHost; import org.apache.http.HttpRequest; import org.apache.http.conn.ClientConnectionManager; import org.apache.http.conn.params.ConnRoutePNames; import org.apache.http.conn.routing.HttpRoute; import org.apache.http.conn.routing.HttpRoutePlanner; import org.apache.http.conn.scheme.Scheme; import org.apache.http.protocol.HttpContext; /** * Based on DefaultHttpRoutePlanner from Apache */ public class CustomHttpRoutePlanner implements HttpRoutePlanner { private ClientConnectionManager connectionManager; public CustomHttpRoutePlanner(final ClientConnectionManager aConnManager) { setConnectionManager(aConnManager); } // default constructor // non-javadoc, see interface HttpRoutePlanner @Override public HttpRoute determineRoute(final HttpHost target, final HttpRequest request, final HttpContext context) { if (request == null) { throw new IllegalStateException("Request must not be null."); } // If we have a forced route, we can do without a target. HttpRoute route = (HttpRoute) request.getParams().getParameter(ConnRoutePNames.FORCED_ROUTE); if (route != null) { return route; } // If we get here, there is no forced route. // So we need a target to compute a route. if (target == null) { throw new IllegalStateException("Target host must not be null."); } final InetAddress local = (InetAddress) request.getParams().getParameter(ConnRoutePNames.LOCAL_ADDRESS); final HttpHost proxy = (HttpHost) request.getParams().getParameter(ConnRoutePNames.DEFAULT_PROXY); final Scheme schm = connectionManager.getSchemeRegistry().getScheme(target.getSchemeName()); // as it is typically used for TLS/SSL, we assume that // a layered scheme implies a secure connection final boolean secure = schm.isLayered(); if (proxy == null) { route = new HttpRoute(target, local, secure); } else { route = new HttpRoute(target, local, proxy, secure); } // Map<HttpRoute, Integer> maxConnectionsPerHost = (Map<HttpRoute, Integer>) request.getParams().getParameter(ConnManagerPNames.MAX_HOST_CONNECTIONS); // if (maxConnectionsPerHost == null) // { // maxConnectionsPerHost = new HashMap<HttpRoute, Integer>(1); // request.getParams().setParameter(ConnManagerPNames.MAX_HOST_CONNECTIONS, maxConnectionsPerHost); // } // if (!maxConnectionsPerHost.containsKey(route)) // { // // maxConnectionsPerHost.put(route, scan.getScanSettings().getMaxConnectionsPerServer()); // maxConnectionsPerHost.put(route, 100); // } return route; } public void setConnectionManager(final ClientConnectionManager aConnManager) { connectionManager = aConnManager; } }