防止OkHttp/Retrofit绕过代理

11

当OkHttp尝试代理,并且该路由失败一次后,每个请求之后都将完全绕过Android系统代理。因此,使用Charles进行调试很困难。

我目前拥有下面的代码,但它仅设置为调试版本。它运作得很好,但这是一个hack,我们希望将其发布给所有用户。

是否有一些隐藏的OkHttpClient.dontBypassProxy设置我找不到?或者,下面的代码看起来像是一个好的解决方案吗?

    OkHttpClient.Builder baseClientBuilder = new OkHttpClient.Builder().retryOnConnectionFailure(false).connectionPool(new ConnectionPool(5, 20, TimeUnit.SECONDS));

    //Ask OkHttp what proxies we have setup
    List<Proxy> proxies = ProxySelector.getDefault().select(URI.create("http://www.somesite.com"));

    if (proxies.size() > 0 && proxies.get(0) != Proxy.NO_PROXY) {
        //Force OkHttp to always use this proxy
        baseClientBuilder.proxy(proxies.get(0));
    }

只是好奇:当您有两个代理时,这只是一个问题吗? - Jesse Wilson
这只是一个代理。我甚至不知道如何在Android中添加两个代理。所以这就是为什么黑客要抓取它看到的第一个代理的原因。 - Mike Odie
你能把这个问题隔离成一个失败的测试用例吗?这里有一个示例:https://gist.github.com/swankjesse/981fcae102f513eb13ed - Jesse Wilson
1
@MikeOdie 这是按设计工作的,尽管我们可以改变设计。ProxySelector的行为是从HttpURLConnection继承而来的,您可以通过此测试进行验证: https://gist.github.com/swankjesse/240132f0d750a05d0380f32f7f822531 如果您想在OkHttp的问题跟踪器上开始讨论,请随意。 - Jesse Wilson
2
好的,非常感谢。我知道HttpURLConnection在做什么了。我会提交一个功能请求。与此同时,请问您认为我的hack看起来是否可以接受?它在我们内部的测试中运行得很好,但我不确定它准备好上线了没有。https://github.com/square/okhttp/issues/2525 - Mike Odie
显示剩余2条评论
1个回答

1
这在 OkHttp 3.5.0 中已修复。

https://square.github.io/okhttp/changelog_3x/

如果系统的HTTP代理失败,OkHttp将不再尝试直接连接。这种行为令人惊讶,因为OkHttp忽略了用户指定的配置。如果您需要自定义代理回退行为,请实现自己的java.net.ProxySelector。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接