Skip to content

Refactor non proxy hosts handling, fix #202 in 1.7.x #250

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Mar 12, 2013
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -340,9 +340,8 @@ private HttpMethodBase createMethod(HttpClient client, Request request) throws I
throw new IllegalStateException(String.format("Invalid Method", methodName));
}

ProxyServer proxyServer = request.getProxyServer() != null ? request.getProxyServer() : config.getProxyServer();
boolean avoidProxy = ProxyUtils.avoidProxy(proxyServer, request);
if (!avoidProxy) {
ProxyServer proxyServer = ProxyUtils.getProxyServer(config, request);
if (proxyServer != null) {

if (proxyServer.getPrincipal() != null) {
Credentials defaultcreds = new UsernamePasswordCredentials(proxyServer.getPrincipal(), proxyServer.getPassword());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -200,8 +200,8 @@ public GrizzlyAsyncHttpProvider(final AsyncHttpClientConfig clientConfig) {
public <T> ListenableFuture<T> execute(final Request request,
final AsyncHandler<T> handler) throws IOException {

final GrizzlyResponseFuture<T> future =
new GrizzlyResponseFuture<T>(this, request, handler);
final ProxyServer proxy = ProxyUtils.getProxyServer(clientConfig, request);
final GrizzlyResponseFuture<T> future = new GrizzlyResponseFuture<T>(this, request, handler, proxy);
future.setDelegate(SafeFutureImpl.<T>create());
final CompletionHandler<Connection> connectHandler = new CompletionHandler<Connection>() {
@Override
Expand Down Expand Up @@ -816,24 +816,6 @@ public NextAction handleEvent(final FilterChainContext ctx,

}

// @Override
// public NextAction handleRead(FilterChainContext ctx) throws IOException {
// Object message = ctx.getMessage();
// if (HttpPacket.isHttp(message)) {
// final HttpPacket packet = (HttpPacket) message;
// HttpResponsePacket responsePacket;
// if (HttpContent.isContent(packet)) {
// responsePacket = (HttpResponsePacket) ((HttpContent) packet).getHttpHeader();
// } else {
// responsePacket = (HttpResponsePacket) packet;
// }
// if (HttpStatus.SWITCHING_PROTOCOLS_101.statusMatches(responsePacket.getStatus())) {
// return ctx.getStopAction();
// }
// }
// return super.handleRead(ctx);
// }

// ----------------------------------------------------- Private Methods


Expand Down Expand Up @@ -861,9 +843,8 @@ private boolean sendAsGrizzlyRequest(final Request request,
builder.header(Header.Host, uri.getHost() + ':' + uri.getPort());
}
}
final ProxyServer proxy = getProxyServer(request);
boolean avoidProxy = ProxyUtils.avoidProxy(proxy, request);
final boolean useProxy = !(avoidProxy || proxy == null);
final ProxyServer proxy = ProxyUtils.getProxyServer(config, request);
final boolean useProxy = proxy != null;
if (useProxy) {
if ((secure || httpCtx.isWSRequest) && !httpCtx.isTunnelEstablished(ctx.getConnection())) {
secure = false;
Expand Down Expand Up @@ -956,18 +937,6 @@ private void convertToUpgradeRequest(final HttpTransactionContext ctx) {
ctx.requestUrl = sb.toString();
}


private ProxyServer getProxyServer(Request request) {

ProxyServer proxyServer = request.getProxyServer();
if (proxyServer == null) {
proxyServer = config.getProxyServer();
}
return proxyServer;

}


private void addHeaders(final Request request,
final HttpRequestPacket requestPacket) {

Expand Down Expand Up @@ -2329,8 +2298,7 @@ Connection obtainConnection(final Request request,
final GrizzlyResponseFuture requestFuture)
throws IOException, ExecutionException, InterruptedException, TimeoutException {

final Connection c = (obtainConnection0(request,
requestFuture));
final Connection c = obtainConnection0(request, requestFuture);
DO_NOT_CACHE.set(c, Boolean.TRUE);
return c;

Expand All @@ -2341,10 +2309,7 @@ void doAsyncConnect(final Request request,
final CompletionHandler<Connection> connectHandler)
throws IOException, ExecutionException, InterruptedException {

ProxyServer proxy = getProxyServer(request);
if (ProxyUtils.avoidProxy(proxy, request)) {
proxy = null;
}
ProxyServer proxy = requestFuture.getProxy();
final URI uri = request.getURI();
String host = ((proxy != null) ? proxy.getHost() : uri.getHost());
int port = ((proxy != null) ? proxy.getPort() : uri.getPort());
Expand All @@ -2363,10 +2328,7 @@ private Connection obtainConnection0(final Request request,
throws IOException, ExecutionException, InterruptedException, TimeoutException {

final URI uri = request.getURI();
ProxyServer proxy = getProxyServer(request);
if (ProxyUtils.avoidProxy(proxy, request)) {
proxy = null;
}
final ProxyServer proxy = requestFuture.getProxy();
String host = ((proxy != null) ? proxy.getHost() : uri.getHost());
int port = ((proxy != null) ? proxy.getPort() : uri.getPort());
int cTimeout = provider.clientConfig.getConnectionTimeoutInMs();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
package com.ning.http.client.providers.grizzly;

import com.ning.http.client.AsyncHandler;
import com.ning.http.client.ProxyServer;
import com.ning.http.client.Request;
import com.ning.http.client.listenable.AbstractListenableFuture;

Expand Down Expand Up @@ -42,7 +43,7 @@ public class GrizzlyResponseFuture<V> extends AbstractListenableFuture<V> {
private final AsyncHandler handler;
private final GrizzlyAsyncHttpProvider provider;
private final Request request;

private final ProxyServer proxy;
private Connection connection;

FutureImpl<V> delegate;
Expand All @@ -53,12 +54,13 @@ public class GrizzlyResponseFuture<V> extends AbstractListenableFuture<V> {

GrizzlyResponseFuture(final GrizzlyAsyncHttpProvider provider,
final Request request,
final AsyncHandler handler) {
final AsyncHandler handler,
final ProxyServer proxy) {

this.provider = provider;
this.request = request;
this.handler = handler;

this.proxy = proxy;
}


Expand Down Expand Up @@ -208,4 +210,7 @@ private void closeConnection() {

}

public ProxyServer getProxy() {
return proxy;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -131,11 +131,10 @@ public <T> ListenableFuture<T> execute(Request request, AsyncHandler<T> handler,
throw new IOException(String.format("Too many connections %s", config.getMaxTotalConnections()));
}

ProxyServer proxyServer = request.getProxyServer() != null ? request.getProxyServer() : config.getProxyServer();
ProxyServer proxyServer = ProxyUtils.getProxyServer(config, request);
Realm realm = request.getRealm() != null ? request.getRealm() : config.getRealm();
boolean avoidProxy = ProxyUtils.avoidProxy(proxyServer, request);
Proxy proxy = null;
if (!avoidProxy && (proxyServer != null || realm != null)) {
if (proxyServer != null || realm != null) {
try {
proxy = configureProxyAndAuth(proxyServer, realm);
} catch (AuthenticationException e) {
Expand Down Expand Up @@ -497,7 +496,7 @@ private void configure(URI uri, HttpURLConnection urlConnection, Request request

String ka = config.getAllowPoolingConnection() ? "keep-alive" : "close";
urlConnection.setRequestProperty("Connection", ka);
ProxyServer proxyServer = request.getProxyServer() != null ? request.getProxyServer() : config.getProxyServer();
ProxyServer proxyServer = ProxyUtils.getProxyServer(config, request);
boolean avoidProxy = ProxyUtils.avoidProxy(proxyServer, uri.getHost());
if (!avoidProxy) {
urlConnection.setRequestProperty("Proxy-Connection", ka);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -595,26 +595,14 @@ public void operationComplete(ChannelFuture cf) {

}

private static boolean isProxyServer(AsyncHttpClientConfig config, Request request) {
ProxyServer proxyServer = request.getProxyServer();
if (proxyServer == null) {
proxyServer = config.getProxyServer();
}
if (proxyServer == null) {
return false;
} else {
return !ProxyUtils.avoidProxy(proxyServer, request);
}
}

protected final static HttpRequest buildRequest(AsyncHttpClientConfig config, Request request, URI uri,
boolean allowConnect, ChannelBuffer buffer) throws IOException {
boolean allowConnect, ChannelBuffer buffer, ProxyServer proxyServer) throws IOException {

String method = request.getMethod();
if (allowConnect && (isProxyServer(config, request) && isSecure(uri))) {
if (allowConnect && proxyServer != null && isSecure(uri)) {
method = HttpMethod.CONNECT.toString();
}
return construct(config, request, new HttpMethod(method), uri, buffer);
return construct(config, request, new HttpMethod(method), uri, buffer, proxyServer);
}

private static SpnegoEngine getSpnegoEngine() {
Expand All @@ -627,7 +615,8 @@ private static HttpRequest construct(AsyncHttpClientConfig config,
Request request,
HttpMethod m,
URI uri,
ChannelBuffer buffer) throws IOException {
ChannelBuffer buffer,
ProxyServer proxyServer) throws IOException {

String host = AsyncHttpProviderUtils.getHost(uri);

Expand All @@ -640,7 +629,7 @@ private static HttpRequest construct(AsyncHttpClientConfig config,
nettyRequest = new DefaultHttpRequest(HttpVersion.HTTP_1_0, m, AsyncHttpProviderUtils.getAuthority(uri));
} else {
String path = null;
if (isProxyServer(config, request))
if (proxyServer != null)
path = uri.toString();
else if (uri.getRawQuery() != null)
path = uri.getRawPath() + "?" + uri.getRawQuery();
Expand Down Expand Up @@ -690,7 +679,6 @@ else if (uri.getRawQuery() != null)
nettyRequest.addHeader(HttpHeaders.Names.PROXY_AUTHORIZATION, auth.get(0));
}
}
ProxyServer proxyServer = request.getProxyServer() != null ? request.getProxyServer() : config.getProxyServer();
Realm realm = request.getRealm() != null ? request.getRealm() : config.getRealm();

if (realm != null && realm.getUsePreemptiveAuth()) {
Expand Down Expand Up @@ -754,8 +742,7 @@ else if (uri.getRawQuery() != null)
nettyRequest.setHeader(HttpHeaders.Names.CONNECTION, "keep-alive");
}

boolean avoidProxy = ProxyUtils.avoidProxy(proxyServer, request);
if (!avoidProxy) {
if (proxyServer != null) {
if (!request.getHeaders().containsKey("Proxy-Connection")) {
nettyRequest.setHeader("Proxy-Connection", "keep-alive");
}
Expand Down Expand Up @@ -958,7 +945,9 @@ private <T> ListenableFuture<T> doConnect(final Request request, final AsyncHand
throw new IOException("WebSocket method must be a GET");
}

ProxyServer proxyServer = request.getProxyServer() != null ? request.getProxyServer() : config.getProxyServer();
ProxyServer proxyServer = ProxyUtils.getProxyServer(config, request);
boolean useProxy = proxyServer != null;

URI uri;
if (useRawUrl) {
uri = request.getRawURI();
Expand All @@ -981,17 +970,14 @@ private <T> ListenableFuture<T> doConnect(final Request request, final AsyncHand
bufferedBytes = f.getNettyRequest().getContent();
}

boolean avoidProxy = ProxyUtils.avoidProxy(proxyServer, uri.getHost());
boolean useProxy = !(avoidProxy || proxyServer == null);

boolean useSSl = isSecure(uri) && !useProxy;
if (channel != null && channel.isOpen() && channel.isConnected()) {
HttpRequest nettyRequest = buildRequest(config, request, uri, f == null ? false : f.isConnectAllowed(), bufferedBytes);
HttpRequest nettyRequest = buildRequest(config, request, uri, f == null ? false : f.isConnectAllowed(), bufferedBytes, proxyServer);

if (f == null) {
f = newFuture(uri, request, asyncHandler, nettyRequest, config, this);
f = newFuture(uri, request, asyncHandler, nettyRequest, config, this, proxyServer);
} else {
nettyRequest = buildRequest(config, request, uri, f.isConnectAllowed(), bufferedBytes);
nettyRequest = buildRequest(config, request, uri, f.isConnectAllowed(), bufferedBytes, proxyServer);
f.setNettyRequest(nettyRequest);
}
f.setState(NettyResponseFuture.STATE.POOLED);
Expand Down Expand Up @@ -1729,10 +1715,11 @@ public static <T> NettyResponseFuture<T> newFuture(URI uri,
AsyncHandler<T> asyncHandler,
HttpRequest nettyRequest,
AsyncHttpClientConfig config,
NettyAsyncHttpProvider provider) {
NettyAsyncHttpProvider provider,
ProxyServer proxyServer) {

NettyResponseFuture<T> f = new NettyResponseFuture<T>(uri, request, asyncHandler, nettyRequest,
requestTimeout(config, request.getPerRequestConfig()), config.getIdleConnectionTimeoutInMs(), provider, request.getConnectionPoolKeyStrategy());
requestTimeout(config, request.getPerRequestConfig()), config.getIdleConnectionTimeoutInMs(), provider, request.getConnectionPoolKeyStrategy(), proxyServer);

if (request.getHeaders().getFirstValue("Expect") != null
&& request.getHeaders().getFirstValue("Expect").equalsIgnoreCase("100-Continue")) {
Expand Down Expand Up @@ -2145,6 +2132,7 @@ public void handle(final ChannelHandlerContext ctx, final MessageEvent e) throws
HttpRequest nettyRequest = future.getNettyRequest();
AsyncHandler handler = future.getAsyncHandler();
Request request = future.getRequest();
ProxyServer proxyServer = future.getProxyServer();
HttpResponse response = null;
try {
if (e.getMessage() instanceof HttpResponse) {
Expand Down Expand Up @@ -2194,7 +2182,6 @@ public void handle(final ChannelHandlerContext ctx, final MessageEvent e) throws
}

Realm newRealm = null;
ProxyServer proxyServer = request.getProxyServer() != null ? request.getProxyServer() : config.getProxyServer();
final FluentCaseInsensitiveStringsMap headers = request.getHeaders();
final RequestBuilder builder = new RequestBuilder(future.getRequest());

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,11 @@

import com.ning.http.client.AsyncHandler;
import com.ning.http.client.AsyncHttpClientConfig;
import com.ning.http.client.ProxyServer;
import com.ning.http.client.Request;
import com.ning.http.util.AllowAllHostnameVerifier;
import com.ning.http.util.ProxyUtils;

import org.jboss.netty.buffer.ChannelBuffer;
import org.jboss.netty.channel.Channel;
import org.jboss.netty.channel.ChannelFuture;
Expand Down Expand Up @@ -137,9 +140,10 @@ public Builder(AsyncHttpClientConfig config, Request request, AsyncHandler<T> as
}

public NettyConnectListener<T> build(final URI uri) throws IOException {
HttpRequest nettyRequest = NettyAsyncHttpProvider.buildRequest(config, request, uri, true, buffer);
ProxyServer proxyServer = ProxyUtils.getProxyServer(config, request);
HttpRequest nettyRequest = NettyAsyncHttpProvider.buildRequest(config, request, uri, true, buffer, proxyServer);
if (future == null) {
future = NettyAsyncHttpProvider.newFuture(uri, request, asyncHandler, nettyRequest, config, provider);
future = NettyAsyncHttpProvider.newFuture(uri, request, asyncHandler, nettyRequest, config, provider, proxyServer);
} else {
future.setNettyRequest(nettyRequest);
future.setRequest(request);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@

import com.ning.http.client.AsyncHandler;
import com.ning.http.client.ConnectionPoolKeyStrategy;
import com.ning.http.client.ProxyServer;
import com.ning.http.client.Request;
import com.ning.http.client.listenable.AbstractListenableFuture;
import org.jboss.netty.channel.Channel;
Expand Down Expand Up @@ -87,6 +88,7 @@ enum STATE {
private final AtomicBoolean throwableCalled = new AtomicBoolean(false);
private boolean allowConnect = false;
private final ConnectionPoolKeyStrategy connectionPoolKeyStrategy;
private final ProxyServer proxyServer;

public NettyResponseFuture(URI uri,
Request request,
Expand All @@ -95,7 +97,8 @@ public NettyResponseFuture(URI uri,
int responseTimeoutInMs,
int idleConnectionTimeoutInMs,
NettyAsyncHttpProvider asyncHttpProvider,
ConnectionPoolKeyStrategy connectionPoolKeyStrategy) {
ConnectionPoolKeyStrategy connectionPoolKeyStrategy,
ProxyServer proxyServer) {

this.asyncHandler = asyncHandler;
this.responseTimeoutInMs = responseTimeoutInMs;
Expand All @@ -105,6 +108,7 @@ public NettyResponseFuture(URI uri,
this.uri = uri;
this.asyncHttpProvider = asyncHttpProvider;
this.connectionPoolKeyStrategy = connectionPoolKeyStrategy;
this.proxyServer = proxyServer;

if (System.getProperty(MAX_RETRY) != null) {
maxRetry = Integer.valueOf(System.getProperty(MAX_RETRY));
Expand All @@ -127,6 +131,10 @@ public ConnectionPoolKeyStrategy getConnectionPoolKeyStrategy() {
return connectionPoolKeyStrategy;
}

public ProxyServer getProxyServer() {
return proxyServer;
}

/**
* {@inheritDoc}
*/
Expand Down
Loading