Заставить OkHttp3 передать полный URI (включая путь) в ProxySelector - PullRequest
1 голос
/ 02 июня 2019

Я работаю над приложением, которое должно переключать прокси на основе пути URI для ограничения скорости.Различные пути API имеют разные веса вызовов.Мы используем ProxySelector и передаем его экземпляру OkHttpClient через компоновщик.Проблема в том, что когда OkHttpClient вызывает ProxySelector#select(URI), URI не содержит пути, только хост.

    @Override
    public List<Proxy> select(URI uri) {
        final String path = uri.getPath();
        final Proxy proxy = //proxy selection code based on URI path
        return List.of(proxy);
    }

Например, если полный URI равен https://example.com/some/path, при вызове uri.getPath() в приведенном вышепример возвращает только /.Похоже, OkHttpClient внутренне обрезает путь перед передачей его на ProxySelector#select(URI).

Можно ли настроить / принудительно OkHttpClient передать полный URI запроса - включая путь - при вызове ProxySelector?

1 Ответ

0 голосов
/ 02 июня 2019

Это невозможно без улучшения OkHttp.Здесь обычно есть две проблемы.

1) OkHttp не использует исходный URL, вместо этого перестраивает его по адресу

this.url = new HttpUrl.Builder()
    .scheme(sslSocketFactory != null ? "https" : "http")
    .host(uriHost)
    .port(uriPort)
    .build();

2) Даже если мы не делали этого здесь, OkHttp следуетправила объединения соединений (такие как Firefox, Chrome, Safari), особенно для обеспечения эффективного мультиплексирования по HTTP / 2.Таким образом, это будет означать, что даже если исходный запрос использовал его, второй запрос к другому пути повторно использовал бы существующее соединение.

Существует открытая проблема для балансировки нагрузки на стороне клиента, поэтому, возможно, объясните свои требования там https://github.com/square/okhttp/issues/4530

При существующем коде лучше всего иметь двух разных клиентов и переключаться между ними внешне.Вы должны быть в состоянии использовать Retrofit CallFactory для переключения трека.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...