Запретить OkHttp/Retrofit обходить прокси

Когда OkHttp пытается использовать прокси-сервер, и этот маршрут завершается ошибкой один раз, каждый запрос после этого запроса будет полностью обходить системный прокси-сервер Android. Поэтому трудно отлаживать с помощью Charles.

В настоящее время у меня есть код ниже, но он настроен только для сборок отладки. Он отлично работает, но это хак, и мы хотим выпустить его для всех пользователей.

Есть ли какая-то скрытая настройка 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));
    }

person Mike Odie    schedule 20.04.2016    source источник
comment
Просто любопытно: это проблема только при наличии двух прокси?   -  person Jesse Wilson    schedule 21.04.2016
comment
Это всего лишь один прокси. Я даже не знаю, как добавить два прокси в Android. Вот почему взлом должен захватить первый прокси, который он увидит.   -  person Mike Odie    schedule 22.04.2016
comment
Не могли бы вы выделить это в неудачный тестовый пример? Вот пример: gist.github.com/swankjesse/981fcae102f513eb13ed   -  person Jesse Wilson    schedule 24.04.2016
comment
Конечно, вот тестовый пример. testForceProxy использует мой принудительный взлом прокси-сервера, поэтому он проходит, потому что прокси-сервер не обходит. В то время как testBypassProxy использует селектор прокси. Таким образом, он не прошел тест, потому что прокси-сервер обойден, и соединение установлено успешно. В testBypassProxy я хотел бы указать клиенту использовать прокси, если он существует, и не пробовать другие маршруты. pastebin.com/iSCYwXmQ   -  person Mike Odie    schedule 25.04.2016
comment
У меня такая же проблема. Каждая вторая попытка одного и того же запроса обходит прокси. Я на v3.2.0   -  person sat    schedule 25.04.2016
comment
@MikeOdie, это работает так, как задумано, хотя, возможно, мы могли бы изменить дизайн. Поведение ProxySelector унаследовано от HttpURLConnection, что вы можете проверить с помощью этого теста: /240132f0d750a05d0380f32f7f822531 Если вы хотите начать обсуждение системы отслеживания ошибок OkHttp, сделайте это.   -  person Jesse Wilson    schedule 26.04.2016
comment
Хорошо, отлично, спасибо. Я вижу, что делает HttpURLConnection. Я подам запрос функции. А пока, как вы думаете, мой хак выглядит нормально? Он отлично работает дома, но я не уверен, что он готов к работе. https://github.com/square/okhttp/issues/2525   -  person Mike Odie    schedule 29.04.2016


Ответы (1)


Это было исправлено в OkHttp 3.5.0.

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

OkHttp больше не пытается установить прямое соединение в случае сбоя системного HTTP-прокси. Такое поведение было неожиданным, поскольку OkHttp игнорировал указанную пользователем конфигурацию. Если вам нужно настроить резервное поведение прокси-сервера, реализуйте собственный java.net.ProxySelector.

person Yuri Schimke    schedule 08.12.2019