summaryrefslogtreecommitdiffstats
path: root/mobile/android/thirdparty/ch/boye/httpclientandroidlib/impl/client/ProxyClient.java
diff options
context:
space:
mode:
Diffstat (limited to 'mobile/android/thirdparty/ch/boye/httpclientandroidlib/impl/client/ProxyClient.java')
-rw-r--r--mobile/android/thirdparty/ch/boye/httpclientandroidlib/impl/client/ProxyClient.java254
1 files changed, 254 insertions, 0 deletions
diff --git a/mobile/android/thirdparty/ch/boye/httpclientandroidlib/impl/client/ProxyClient.java b/mobile/android/thirdparty/ch/boye/httpclientandroidlib/impl/client/ProxyClient.java
new file mode 100644
index 000000000..e1211bc4b
--- /dev/null
+++ b/mobile/android/thirdparty/ch/boye/httpclientandroidlib/impl/client/ProxyClient.java
@@ -0,0 +1,254 @@
+/*
+ * ====================================================================
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ *
+ */
+
+package ch.boye.httpclientandroidlib.impl.client;
+
+import java.io.IOException;
+import java.net.Socket;
+
+import ch.boye.httpclientandroidlib.ConnectionReuseStrategy;
+import ch.boye.httpclientandroidlib.HttpEntity;
+import ch.boye.httpclientandroidlib.HttpException;
+import ch.boye.httpclientandroidlib.HttpHost;
+import ch.boye.httpclientandroidlib.HttpRequest;
+import ch.boye.httpclientandroidlib.HttpResponse;
+import ch.boye.httpclientandroidlib.HttpVersion;
+import ch.boye.httpclientandroidlib.auth.AUTH;
+import ch.boye.httpclientandroidlib.auth.AuthSchemeRegistry;
+import ch.boye.httpclientandroidlib.auth.AuthScope;
+import ch.boye.httpclientandroidlib.auth.AuthState;
+import ch.boye.httpclientandroidlib.auth.Credentials;
+import ch.boye.httpclientandroidlib.client.config.AuthSchemes;
+import ch.boye.httpclientandroidlib.client.config.RequestConfig;
+import ch.boye.httpclientandroidlib.client.params.HttpClientParamConfig;
+import ch.boye.httpclientandroidlib.client.protocol.HttpClientContext;
+import ch.boye.httpclientandroidlib.client.protocol.RequestClientConnControl;
+import ch.boye.httpclientandroidlib.config.ConnectionConfig;
+import ch.boye.httpclientandroidlib.conn.HttpConnectionFactory;
+import ch.boye.httpclientandroidlib.conn.ManagedHttpClientConnection;
+import ch.boye.httpclientandroidlib.conn.routing.HttpRoute;
+import ch.boye.httpclientandroidlib.conn.routing.RouteInfo.LayerType;
+import ch.boye.httpclientandroidlib.conn.routing.RouteInfo.TunnelType;
+import ch.boye.httpclientandroidlib.entity.BufferedHttpEntity;
+import ch.boye.httpclientandroidlib.impl.DefaultConnectionReuseStrategy;
+import ch.boye.httpclientandroidlib.impl.auth.BasicSchemeFactory;
+import ch.boye.httpclientandroidlib.impl.auth.DigestSchemeFactory;
+import ch.boye.httpclientandroidlib.impl.auth.HttpAuthenticator;
+/* KerberosSchemeFactory removed by HttpClient for Android script. */
+import ch.boye.httpclientandroidlib.impl.auth.NTLMSchemeFactory;
+/* SPNegoSchemeFactory removed by HttpClient for Android script. */
+import ch.boye.httpclientandroidlib.impl.conn.ManagedHttpClientConnectionFactory;
+import ch.boye.httpclientandroidlib.impl.execchain.TunnelRefusedException;
+import ch.boye.httpclientandroidlib.message.BasicHttpRequest;
+import ch.boye.httpclientandroidlib.params.BasicHttpParams;
+import ch.boye.httpclientandroidlib.params.HttpParamConfig;
+import ch.boye.httpclientandroidlib.params.HttpParams;
+import ch.boye.httpclientandroidlib.protocol.BasicHttpContext;
+import ch.boye.httpclientandroidlib.protocol.HttpContext;
+import ch.boye.httpclientandroidlib.protocol.HttpCoreContext;
+import ch.boye.httpclientandroidlib.protocol.HttpProcessor;
+import ch.boye.httpclientandroidlib.protocol.HttpRequestExecutor;
+import ch.boye.httpclientandroidlib.protocol.ImmutableHttpProcessor;
+import ch.boye.httpclientandroidlib.protocol.RequestTargetHost;
+import ch.boye.httpclientandroidlib.protocol.RequestUserAgent;
+import ch.boye.httpclientandroidlib.util.Args;
+import ch.boye.httpclientandroidlib.util.EntityUtils;
+
+/**
+ * ProxyClient can be used to establish a tunnel via an HTTP proxy.
+ */
+@SuppressWarnings("deprecation")
+public class ProxyClient {
+
+ private final HttpConnectionFactory<HttpRoute, ManagedHttpClientConnection> connFactory;
+ private final ConnectionConfig connectionConfig;
+ private final RequestConfig requestConfig;
+ private final HttpProcessor httpProcessor;
+ private final HttpRequestExecutor requestExec;
+ private final ProxyAuthenticationStrategy proxyAuthStrategy;
+ private final HttpAuthenticator authenticator;
+ private final AuthState proxyAuthState;
+ private final AuthSchemeRegistry authSchemeRegistry;
+ private final ConnectionReuseStrategy reuseStrategy;
+
+ /**
+ * @since 4.3
+ */
+ public ProxyClient(
+ final HttpConnectionFactory<HttpRoute, ManagedHttpClientConnection> connFactory,
+ final ConnectionConfig connectionConfig,
+ final RequestConfig requestConfig) {
+ super();
+ this.connFactory = connFactory != null ? connFactory : ManagedHttpClientConnectionFactory.INSTANCE;
+ this.connectionConfig = connectionConfig != null ? connectionConfig : ConnectionConfig.DEFAULT;
+ this.requestConfig = requestConfig != null ? requestConfig : RequestConfig.DEFAULT;
+ this.httpProcessor = new ImmutableHttpProcessor(
+ new RequestTargetHost(), new RequestClientConnControl(), new RequestUserAgent());
+ this.requestExec = new HttpRequestExecutor();
+ this.proxyAuthStrategy = new ProxyAuthenticationStrategy();
+ this.authenticator = new HttpAuthenticator();
+ this.proxyAuthState = new AuthState();
+ this.authSchemeRegistry = new AuthSchemeRegistry();
+ this.authSchemeRegistry.register(AuthSchemes.BASIC, new BasicSchemeFactory());
+ this.authSchemeRegistry.register(AuthSchemes.DIGEST, new DigestSchemeFactory());
+ this.authSchemeRegistry.register(AuthSchemes.NTLM, new NTLMSchemeFactory());
+ /* SPNegoSchemeFactory removed by HttpClient for Android script. */
+ /* KerberosSchemeFactory removed by HttpClient for Android script. */
+ this.reuseStrategy = new DefaultConnectionReuseStrategy();
+ }
+
+ /**
+ * @deprecated (4.3) use {@link ProxyClient#ProxyClient(HttpConnectionFactory, ConnectionConfig, RequestConfig)}
+ */
+ @Deprecated
+ public ProxyClient(final HttpParams params) {
+ this(null,
+ HttpParamConfig.getConnectionConfig(params),
+ HttpClientParamConfig.getRequestConfig(params));
+ }
+
+ /**
+ * @since 4.3
+ */
+ public ProxyClient(final RequestConfig requestConfig) {
+ this(null, null, requestConfig);
+ }
+
+ public ProxyClient() {
+ this(null, null, null);
+ }
+
+ /**
+ * @deprecated (4.3) do not use.
+ */
+ @Deprecated
+ public HttpParams getParams() {
+ return new BasicHttpParams();
+ }
+
+ /**
+ * @deprecated (4.3) do not use.
+ */
+ @Deprecated
+ public AuthSchemeRegistry getAuthSchemeRegistry() {
+ return this.authSchemeRegistry;
+ }
+
+ public Socket tunnel(
+ final HttpHost proxy,
+ final HttpHost target,
+ final Credentials credentials) throws IOException, HttpException {
+ Args.notNull(proxy, "Proxy host");
+ Args.notNull(target, "Target host");
+ Args.notNull(credentials, "Credentials");
+ HttpHost host = target;
+ if (host.getPort() <= 0) {
+ host = new HttpHost(host.getHostName(), 80, host.getSchemeName());
+ }
+ final HttpRoute route = new HttpRoute(
+ host,
+ this.requestConfig.getLocalAddress(),
+ proxy, false, TunnelType.TUNNELLED, LayerType.PLAIN);
+
+ final ManagedHttpClientConnection conn = this.connFactory.create(
+ route, this.connectionConfig);
+ final HttpContext context = new BasicHttpContext();
+ HttpResponse response;
+
+ final HttpRequest connect = new BasicHttpRequest(
+ "CONNECT", host.toHostString(), HttpVersion.HTTP_1_1);
+
+ final BasicCredentialsProvider credsProvider = new BasicCredentialsProvider();
+ credsProvider.setCredentials(new AuthScope(proxy), credentials);
+
+ // Populate the execution context
+ context.setAttribute(HttpCoreContext.HTTP_TARGET_HOST, target);
+ context.setAttribute(HttpCoreContext.HTTP_CONNECTION, conn);
+ context.setAttribute(HttpCoreContext.HTTP_REQUEST, connect);
+ context.setAttribute(HttpClientContext.HTTP_ROUTE, route);
+ context.setAttribute(HttpClientContext.PROXY_AUTH_STATE, this.proxyAuthState);
+ context.setAttribute(HttpClientContext.CREDS_PROVIDER, credsProvider);
+ context.setAttribute(HttpClientContext.AUTHSCHEME_REGISTRY, this.authSchemeRegistry);
+ context.setAttribute(HttpClientContext.REQUEST_CONFIG, this.requestConfig);
+
+ this.requestExec.preProcess(connect, this.httpProcessor, context);
+
+ for (;;) {
+ if (!conn.isOpen()) {
+ final Socket socket = new Socket(proxy.getHostName(), proxy.getPort());
+ conn.bind(socket);
+ }
+
+ this.authenticator.generateAuthResponse(connect, this.proxyAuthState, context);
+
+ response = this.requestExec.execute(connect, conn, context);
+
+ final int status = response.getStatusLine().getStatusCode();
+ if (status < 200) {
+ throw new HttpException("Unexpected response to CONNECT request: " +
+ response.getStatusLine());
+ }
+ if (this.authenticator.isAuthenticationRequested(proxy, response,
+ this.proxyAuthStrategy, this.proxyAuthState, context)) {
+ if (this.authenticator.handleAuthChallenge(proxy, response,
+ this.proxyAuthStrategy, this.proxyAuthState, context)) {
+ // Retry request
+ if (this.reuseStrategy.keepAlive(response, context)) {
+ // Consume response content
+ final HttpEntity entity = response.getEntity();
+ EntityUtils.consume(entity);
+ } else {
+ conn.close();
+ }
+ // discard previous auth header
+ connect.removeHeaders(AUTH.PROXY_AUTH_RESP);
+ } else {
+ break;
+ }
+ } else {
+ break;
+ }
+ }
+
+ final int status = response.getStatusLine().getStatusCode();
+
+ if (status > 299) {
+
+ // Buffer response content
+ final HttpEntity entity = response.getEntity();
+ if (entity != null) {
+ response.setEntity(new BufferedHttpEntity(entity));
+ }
+
+ conn.close();
+ throw new TunnelRefusedException("CONNECT refused by proxy: " +
+ response.getStatusLine(), response);
+ }
+ return conn.getSocket();
+ }
+
+}