HttpClient 4: Proxy-Fehler „http protocol is not supported"
Behalten Sie die einfache HTTP-Factory in einer eigenen Apache-HttpClient-4-Registry, wenn eine HTTPS-Route zuerst einen HTTP-Proxy erreicht.
In einer Anwendung mit Apache HttpClient 4 bedeutet ein HTTPS-Ziel nicht, dass jede Verbindung mit TLS beginnt. Ein gewöhnlicher HTTP-Proxy wird über eine unverschlüsselte Verbindung erreicht, bevor CONNECT den Tunnel öffnet und TLS in Richtung Ziel geschichtet wird.
Wenn ein eigener Connection-Manager nur https registriert, kann der erste Proxy-Hop mit UnsupportedSchemeException: http protocol is not supported fehlschlagen.
Für die 4.5-API müssen beim Aufbau dieses Managers beide Factories eingetragen werden:
var registry = RegistryBuilder.<ConnectionSocketFactory>create()
.register("http", PlainConnectionSocketFactory.getSocketFactory())
.register("https", tlsFactory)
.build();
var manager = new PoolingHttpClientConnectionManager(registry);
var client = HttpClients.custom()
.setConnectionManager(manager)
.setProxy(new HttpHost("proxy.example.net", 8080, "http"))
.build();
tlsFactory ist die vorhandene SSLConnectionSocketFactory der Anwendung mit ihrer beabsichtigten Vertrauens- und Hostnamenprüfung. Die gezeigten Typen gehören zu den org.apache.http-Paketen von Apache 4. Das Fragment setzt die lokale Variableninferenz von Java voraus; älterer Java-Quellcode kann explizite Typen verwenden.
Hängen Sie den korrigierten Manager an den Client, der für die Anfrage tatsächlich verwendet wird. Für eine erlaubte öffentliche HTTPS-Anfrage ohne Proxy-Authentifizierung kann ein HTTP-Eintrag aus der HTTP-Proxy-Liste die Proxy-Adresse von HttpHost füllen. Ein anderer Builder aktualisiert einen bereits erstellten Client nicht.
Prüfen Sie außerdem die Eigentümerschaft des Builders: Laut HttpClientBuilder kann ein ausdrücklich übergebener Connection-Manager die separaten SSL-Konfigurationseingaben überschreiben. Legen Sie die benötigten Factories in der Registry des Managers ab, statt anzunehmen, ein späterer setSSLContext-Aufruf ersetze dessen Interna.
Diese Diagnose betrifft die lokale Scheme-Registry. Eine Proxy-Authentifizierungsaufforderung oder ein abgelehntes Ziel ist ein späteres, anderes Ergebnis. Behalten Sie beide Factory-Registrierungen bei, während Sie diese Antworten untersuchen.