package org.cloudsmith.geppetto.injectable.eclipse.impl;
import java.net.InetAddress;
import java.net.URI;
import org.apache.http.HttpException;
import org.apache.http.HttpHost;
import org.apache.http.HttpRequest;
import org.apache.http.conn.params.ConnRouteParams;
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.conn.scheme.SchemeRegistry;
import org.apache.http.protocol.HttpContext;
import org.cloudsmith.geppetto.injectable.eclipse.Activator;
import org.eclipse.core.net.proxy.IProxyData;
public class ProxiedRoutePlanner implements HttpRoutePlanner {
private final SchemeRegistry schemeRegistry;
public ProxiedRoutePlanner(SchemeRegistry schemeRegistry) {
this.schemeRegistry = schemeRegistry;
}
@Override
public HttpRoute determineRoute(HttpHost target, HttpRequest request, HttpContext context) throws HttpException {
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 = ConnRouteParams.getForcedRoute(request.getParams());
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 = ConnRouteParams.getLocalAddress(request.getParams());
final HttpHost proxy = ConnRouteParams.getDefaultProxy(request.getParams());
final Scheme schm;
try {
schm = schemeRegistry.getScheme(target.getSchemeName());
}
catch(IllegalStateException ex) {
throw new HttpException(ex.getMessage());
}
// 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)
return new HttpRoute(target, local, proxy, secure);
IProxyData[] select = Activator.getInstance().getProxyService().select(URI.create(target.toURI()));
for(IProxyData proxyData : select)
if(proxyData.getType().equals(IProxyData.HTTP_PROXY_TYPE)) {
HttpHost proxyHost = new HttpHost(proxyData.getHost(), proxyData.getPort());
return new HttpRoute(target, null, proxyHost, secure);
}
return new HttpRoute(target, local, secure);
}
}