【发布时间】: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