Тайм-аут для прокси Apache HttpClient 5, зависающего на этапе CONNECT
Задайте тайм-аут socket I/O менеджера соединений для установки туннеля вместе с отдельным тайм-аутом TCP-соединения.
Прокси принял TCP, но так и не завершил ответ CONNECT. Ответ сайта ещё не начался; тайм-аут, нацеленный только на этот более поздний ответ, может оставить эту установку в бесконечном ожидании.
Для Apache HttpClient 5.3.1 задайте значения по умолчанию менеджера соединений:
var connection = ConnectionConfig.custom()
.setConnectTimeout(Timeout.ofSeconds(5))
.setSocketTimeout(Timeout.ofSeconds(10))
.build();
var manager = PoolingHttpClientConnectionManagerBuilder.create()
.setDefaultConnectionConfig(connection)
.build();
var client = HttpClients.custom()
.setConnectionManager(manager)
.setProxy(new HttpHost("http", "proxy.example", 8080))
.build();Используйте классы Apache HttpComponents 5 в org.apache.hc, с Timeout во вспомогательном пакете core5. Сохраняйте клиент для его работы и закрывайте его. Для изолированного публичного HTTP-теста кандидат из списка HTTP-прокси предоставляет конечную точку; держите пункт назначения неизменным при сравнении тайм-аутов.
| Предел | Учитываемое ожидание |
|---|---|
| Тайм-аут соединения | Установка соединения |
| Тайм-аут сокета | Бездействие I/O по умолчанию, включая обмен CONNECT |
| Получение из пула / ответ приложения | Другие отдельно настраиваемые этапы |
После CONNECT протоколу TLS может потребоваться собственный предел установки через конфигурацию TLS в HttpClient 5. Также отличайте бездействие от общего срока: прерывистые байты или повторяющиеся обмены аутентификацией могут увеличить общее время. Используйте поддерживаемую приложением политику срока или отмены для одного бюджета на всю операцию.