Java Socket HTTP CONNECT-tuneloj en OpenJDK 25
Uzu la HTTP-prokuran soketan vojon en OpenJDK 25 por atingi permesitan TCP-servon, tenante la prokuran finpunkton kaj la celon apartaj.
Propra TCP-protokolo povas vojaĝi tra HTTP-prokuro kiam tiu prokuro permesas CONNECT al la celo. La aplikaĵa protokolo ne devas fariĝi HTTP: HTTP starigas la tunelon, poste la aplikaĵo interŝanĝas siajn proprajn bajtojn ene de ĝi.
OpenJDK 25 provizas HTTP-prokuran vojon en Socket(Proxy). Ĝia efektivigo faras la CONNECT-interŝanĝon kaj redonas konektitan soketon por uzo de la aplikaĵo.
Proxy route = new Proxy(
Proxy.Type.HTTP,
new InetSocketAddress("proxy.example", 8080));
try (Socket socket = new Socket(route)) {
socket.setSoTimeout(10000);
socket.connect(
InetSocketAddress.createUnresolved("tcp-service.example", 8443),
5000);
InputStream input = socket.getInputStream();
OutputStream output = socket.getOutputStream();
}Ĉi tiu fragmento uzas klasojn el java.net kaj java.io. Anstataŭigu la du finpunktojn kaj faru la protokolan interŝanĝon antaŭ ol forlasi la try-blokon. Por permesita publika TCP-celo, elektu HTTP-kandidatojn el la HTTP-prokura listo nur post kontrolo de CONNECT-permeso por la pordo de tiu celo. La prokura adreso estas kie Java konektiĝas unue; la adreso transdonita al connect identigas la servon, kiun la prokuro devas atingi.
La nesolvita celo konservas sian gastignomon por la CONNECT-peto de ĉi tiu efektivigo. Solvita InetSocketAddress anstataŭe donas sian solvitan IP-adreson al tiu peto. Tiu distingo gravas kiam la prokuro devas solvi la servan nomon aŭ apliki gastignom-bazitan politikon.
Kion sukcesa konekto lasas al vi
La rezultaj fluoj portas la datumojn de la tunelita servo. Ili ne elmetas apartan HTTP-respondon, kiun via aplikaĵo devus legi kaj forĵeti. Aldoni duan CONNECT-interŝanĝon sendus HTTP-tekston al la servo post kiam la JDK jam starigis la tunelon.
La ekzemplo provizas konektan tempolimon kaj soketan legan tempolimon; tiuj estas apartaj regiloj, ne unu ĝenerala limdato por la aplikaĵa seanco.
CONNECT-permeso ankoraŭ apartenas al la prokuro. Finpunkto, kiu plusendas ordinarajn retpetojn, povas rifuzi la pordon de la servo aŭ postuli aŭtentikigon antaŭ ol malfermi tunelon. Tenu tiujn malsukcesojn apartaj de servilo, kiu akceptas la tunelon sed poste rifuzas vian aplikaĵan protokolon.
Se tiu protokolo bezonas TLS, intertraktu TLS tra la konektita soketo kun la celata gastignomo de la servo kaj normalaj atestilaj kontroloj. CONNECT sola ne ĉifras la fluon. Por vera HTTP-API, HTTP-kliento restas la pli oportuna interfaco, ĉar ĝi ankaŭ traktas HTTP-mesaĝojn.