Eu tenho um aplicativo Java que precisa fazer ping em sites de terceiros. Para torná-lo mais seguro, eu uso o Squid como proxy:
+-----------+ +-------------+ +--------------------+
| Java App. |---->| Squid Proxy |---->| Third party server |
+-----------+ +-------------+ +--------------------+
O sistema parece funcionar conforme o esperado, mas quando olho os logs do Squid Proxy, vejo uma tonelada de erros 407. Isso é normal? Parece ser uma proporção próxima de 50/50 (um pouco mais de 200 que 407). Estou me perguntando se o código proxy Java nem sempre envia as credenciais, o que explicaria tantos erros 407.
O código Java usa algo RequestBuilder
assim:
import org.asynchttpclient.AsyncHttpClient;
import org.asynchttpclient.Realm;
import org.asynchttpclient.Request;
import org.asynchttpclient.RequestBuilder;
import org.asynchttpclient.proxy.ProxyServer;
import org.asynchttpclient.proxy.ProxyType;
[...]
private final AsyncHttpClient asyncHttpClient;
[...]
var reqBuilder = new RequestBuilder(GET);
reqBuilder.setUrl(url);
var realm = new Realm.Builder(proxyUser, proxySecret)
.setScheme(Realm.AuthScheme.BASIC);
var proxy = new ProxyServer.Builder(proxyHost, proxyPort)
.setSecuredPort(proxyPort)
.setProxyType(ProxyType.HTTP)
.setRealm(realm));
reqBuilder.setProxyServer(proxy);
Request request = reqBuilder.build();
return asyncHttpClient
.executeRequest(request)
.toCompletableFuture()
.handle(
(r, t) -> {
return (Response) Response.ok();
});
_ Observação: removi o tratamento de erros para fazer o código parecer simples._
Finalmente, a configuração do Squid possui estas linhas sobre autenticação básica:
auth_param basic program /usr/lib/squid/basic_ncsa_auth /etc/squid/squid.htpasswd
auth_param basic realm proxy
acl authenticated proxy_auth REQUIRED
http_access allow authenticated
Você vê algo errado com minha configuração?
Na verdade, descobri que a implementação Java do Realm chama isso de não-preemptivo versus preemptivo. O primeiro não envia nenhuma credencial por muita precaução.
O que eu quero, para evitar todas essas solicitações 407 e GET duplas, é usar preemptivo. Como está em uma LAN, é seguro. Aqui está uma linha extra:
Não precisei alterar nada no arquivo de configuração do Squid. Os padrões funcionaram nesse sentido.