Volley behind a proxy server

倖福魔咒の 提交于 2019-12-05 07:32:17

Volley doesn't offer any direct methods to set proxy but there is a way.

Create a custom class extending HurlStack, say ProxiedHurlStack

import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.InetSocketAddress;
import java.net.Proxy;
import java.net.URL;

import com.android.volley.toolbox.HurlStack;

public class ProxiedHurlStack extends HurlStack {

    @Override
    protected HttpURLConnection createConnection(URL url) throws IOException {

        // Start the connection by specifying a proxy server
        Proxy proxy = new Proxy(Proxy.Type.HTTP,
                InetSocketAddress.createUnresolved("192.168.1.11", 8118));//the proxy server(Can be your laptop ip or company proxy)
        HttpURLConnection returnThis = (HttpURLConnection) url
                .openConnection(proxy);

        return returnThis;
    }
}

Now initialize your queue using:

mRequestQueue = Volley.newRequestQueue(context, new ProxiedHurlStack());

Courtesy: http://d.hatena.ne.jp/esmasui/20130613/1371126800

If users set up a proxy at the system level (e.g. proxy host for a wifi connection), then you won't explicitly know that inside your app. To get around this, I also extended HurlStack to use the first provisioned proxy:

public class ProxyHurlStack extends HurlStack {

    @Override
    protected HttpURLConnection createConnection(URL url) throws IOException {
        final HttpURLConnection urlConnection;
        Proxy proxy = null;
        try {
            proxy = ProxySelector.getDefault().select(url.toURI()).get(0);
        } catch (Exception e) {
            Ln.e(e, e.getMessage());
        }
        if (proxy == null) {
            urlConnection = (HttpURLConnection) url.openConnection();
        } else {
            urlConnection = (HttpURLConnection) url.openConnection(proxy);
        }
        return urlConnection;
    }
}

Justin Lee has the best Answer for that question. Firstly I was afraid about ProxySelector returning more than one Proxy definition, but, actually, it returns only one, even though the return type is a List.

@Override public List<Proxy> select(URI uri) {
    return Collections.singletonList(selectOneProxy(uri));
}

private Proxy selectOneProxy(URI uri) {[...]

Secondly I think that using the user system wild set up would be a good practice. For the sake of usability and dynamic proxy configuration. See here for more information about the select(java.net.URI) method.

Oh, by the way, if I was you, I would see HurlStack implementation of the createConnection(java.net.Url) first. Here it is:

/**
 * Create an {@link HttpURLConnection} for the specified {@code url}.
 */
protected HttpURLConnection createConnection(URL url) throws IOException {
    HttpURLConnection connection = (HttpURLConnection) url.openConnection();

    // Workaround for the M release HttpURLConnection not observing the
    // HttpURLConnection.setFollowRedirects() property.
    // https://code.google.com/p/android/issues/detail?id=194495
    connection.setInstanceFollowRedirects(HttpURLConnection.getFollowRedirects());

    return connection;
}

Look those comments...

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!