Базовая прокси-аутентификация в OkHttp: остановите отклонённые повторы
Используйте proxyAuthenticator в OkHttp для прокси-вызовов и прекратите повторять неизменную попытку авторизации.
Для HTTP-прокси с базовой аутентификацией proxyAuthenticator в OkHttp может вернуть запрос с учётными данными. Возвращайте null после того, как попытка авторизации уже отклонена, вместо повторной отправки того же ответа:
.proxyAuthenticator { _, response ->
if (response.request.header("Proxy-Authorization") != null) {
null
} else {
response.request.newBuilder()
.header("Proxy-Authorization",
Credentials.basic(proxyUser, proxyPassword))
.build()
}
}
Этот набросок использует значения учётной записи из секретной конфигурации приложения. Защита разрешает первую попытку и останавливает повторную. Он реализует Basic, а не каждую схему, которую прокси может объявить; изучите вызов, прежде чем выбирать этот ответ.
Если итоговый результат остаётся 407, сравните выбранный прокси, объявленную схему и задокументированную личность учётной записи. Отклонённый пароль, неподдерживаемый метод и неверная форма имени пользователя требуют разных исправлений. Сохраняйте эти наблюдения и итоговый статус в отредактированной диагностике.
У CONNECT другой контекст обратного вызова: OkHttp документирует синтетический упреждающий вызов прокси-аутентификации перед открытием туннеля. Обрабатывайте этот контекст согласно API, а не предполагайте, что каждый обратный вызов — обычный ответ назначения.
Отдельный authenticator предназначен для аутентификации на сервере назначения. Держите его учётные данные отдельно от входа на прокси; общий перехватчик, помещающий пароль прокси в каждый исходящий запрос, может отправить его в неверной области.
Исторические отчёты также описывают ошибки реализации, включая обработку тела отклонённого ответа прокси. Записывайте версию OkHttp и финальный обмен, прежде чем относить текущий сбой к старому отчёту. Решение о повторе всё равно должно останавливать неизменную попытку с учётными данными, у которой нет полезного нового ответа.