Загрузка, повторяемая после запроса прокси, снова нуждается в своём теле. Для коннектора Apache в Jersey 2 выберите обработку буферизованного тела в конфигурации, из которой создаётся этот клиент:

ClientConfig config = new ClientConfig();
config.connectorProvider(new ApacheConnectorProvider());
config.property(ClientProperties.PROXY_URI,
                "http://proxy.example.net:8080");
config.property(ClientProperties.REQUEST_ENTITY_PROCESSING,
                RequestEntityProcessing.BUFFERED);

Выполните загрузку через полученный клиент. Эти типы происходят из пакетов Jersey client и Apache-connector; настройка неиспользуемой конфигурации не повлияла бы на запрос.

Коннектор оборачивает буферизованное тело в BufferedHttpEntity от Apache. Его небуферизованное потоковое тело не повторяемо. Буферизация даёт потоку аутентификации байты, которые он может отправить снова, вместо повторного чтения израсходованного источника.

Это не гарантирует, что аутентификация закончится после одного 407. Некоторые схемы законно требуют нескольких обменов, поэтому проверьте всё согласование, прежде чем считать очередной вызов потерей состояния.

Держите размер тела в пределах бюджета памяти. Большая потоковая загрузка требует стратегии повторной отправки, подходящей для такой нагрузки; включение буферизации для каждого запроса может обменять сбой согласования на исчерпание памяти.

Похожие статьи