【问题标题】:Prevent OkHttp/Retrofit from bypassing proxy防止 OkHttp/Retrofit 绕过代理
【发布时间】:2019-12-08 18:25:57
【问题描述】:

当 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));
    }

【问题讨论】:

  • 只是好奇:只有当您有两个代理时才会出现这种问题?
  • 这只是一个代理。我什至不知道如何在 Android 中添加两个代理。所以这就是为什么黑客要抓住它看到的第一个代理。
  • 你能把它隔离成一个失败的测试用例吗?这是一个示例:gist.github.com/swankjesse/981fcae102f513eb13ed
  • @MikeOdie 这是按设计工作的,尽管我们可以更改设计。 ProxySelector 的行为继承自 HttpURLConnection,你可以通过这个测试来验证:gist.github.com/swankjesse/240132f0d750a05d0380f32f7f822531 如果你想开始讨论 OkHttp 的问题跟踪器,请这样做。
  • 好的,太好了,谢谢。我看到 HttpURLConnection 在做什么。我将提交功能请求。与此同时,您认为我的 hack 看起来还不错吗?它在内部运行良好,但我不确定它是否准备好上线。 github.com/square/okhttp/issues/2525

标签: android retrofit okhttp retrofit2 okhttp3


【解决方案1】:

这已在 OkHttp 3.5.0 中修复

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

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

【讨论】:

    猜你喜欢
    • 2013-11-18
    • 1970-01-01
    • 2011-06-04
    • 1970-01-01
    • 2021-08-25
    • 1970-01-01
    • 2013-05-08
    • 2016-06-21
    • 1970-01-01
    相关资源
    最近更新 更多