Autenticación básica de proxy en OkHttp: detenga los reintentos rechazados
Use proxyAuthenticator de OkHttp para los desafíos del proxy y deje de repetir un intento de autorización sin cambios.
Para un proxy HTTP que ofrece autenticación básica, proxyAuthenticator de OkHttp puede devolver una solicitud con credenciales. Devuelva null después de que un intento de autorización ya haya sido rechazado, en lugar de enviar de nuevo la misma respuesta:
.proxyAuthenticator { _, response ->
if (response.request.header("Proxy-Authorization") != null) {
null
} else {
response.request.newBuilder()
.header("Proxy-Authorization",
Credentials.basic(proxyUser, proxyPassword))
.build()
}
}
Este esquema utiliza valores de cuenta de la configuración secreta de la aplicación. La guarda permite un intento inicial y detiene uno repetido. Implementa Basic, no todos los esquemas que un proxy pueda anunciar; inspeccione el desafío antes de elegir esa respuesta.
Si el resultado final sigue siendo 407, compare el proxy seleccionado, el esquema anunciado y la identidad de cuenta documentada. Una contraseña rechazada, un método no admitido y una forma incorrecta de nombre de usuario necesitan correcciones distintas. Conserve esas observaciones y el estado final en diagnósticos redactados.
CONNECT tiene otro contexto de devolución de llamada: OkHttp documenta un desafío sintético de autenticación previa del proxy antes de abrir el túnel. Trate ese contexto según la API en lugar de suponer que cada devolución representa una respuesta de destino ordinaria.
El authenticator separado es para la autenticación del servidor de destino. Mantenga sus credenciales separadas del inicio de sesión del proxy; un interceptor genérico que coloca una contraseña de proxy en cada solicitud saliente puede enviarla en el ámbito equivocado.
Los informes históricos también describen errores de implementación, incluido el manejo del cuerpo de una respuesta de proxy rechazada. Registre la versión de OkHttp y el intercambio final antes de atribuir un fallo actual a un informe antiguo. La decisión de reintento debería seguir deteniendo un intento de credenciales sin cambios que no tiene una respuesta nueva útil.