Tunely Java Socket HTTP CONNECT v OpenJDK 25
Použijte cestu socketu přes HTTP proxy v OpenJDK 25 k dosažení povolené služby TCP a přitom držte adresu proxy a cíl oddělené.
Vlastní protokol TCP může procházet přes HTTP proxy, pokud tato proxy povoluje CONNECT k cíli. Protokol aplikace se nemusí stát HTTP: HTTP vytvoří tunel a poté aplikace vyměňuje své vlastní bajty uvnitř něj.
OpenJDK 25 poskytuje cestu přes HTTP proxy v Socket(Proxy). Jeho implementace provádí výměnu CONNECT a vrací připojený socket, který aplikace použije.
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();
}Tento fragment používá třídy z java.net a java.io. Nahraďte oba koncové body a proveďte výměnu protokolu před opuštěním bloku try. Pro povolený veřejný cíl TCP vybírejte HTTP kandidáty ze seznamu HTTP proxy až po ověření povolení CONNECT pro port daného cíle. Adresa proxy je místo, kam se Java připojuje nejprve; adresa předaná do connect určuje službu, kterou má proxy dosáhnout.
Nevyřešený cíl si pro požadavek CONNECT této implementace zachovává své jméno hostitele. Vyřešený InetSocketAddress naopak tomuto požadavku dodá svou vyřešenou IP adresu. Tento rozdíl je důležitý, když proxy musí přeložit název služby nebo uplatnit zásadu založenou na jménu hostitele.
Co vám úspěšné připojení ponechá
Výsledné proudy přenášejí data tunelované služby. Nevystavují samostatnou odpověď HTTP, kterou by vaše aplikace měla přečíst a zahodit. Přidání druhé výměny CONNECT by po tom, co JDK již tunel vytvořil, poslalo službě text HTTP.
Příklad nastavuje časový limit připojení a časový limit čtení ze socketu; jde o samostatné ovládací prvky, nikoli o jeden společný termín pro relaci aplikace.
Povolení CONNECT stále náleží proxy. Koncový bod, který předává běžné webové požadavky, může port služby odmítnout nebo před otevřením tunelu vyžadovat ověření. Tyto chyby držte odděleně od serveru, který tunel přijme, ale později odmítne váš aplikační protokol.
Pokud tento protokol potřebuje TLS, vyjednejte TLS přes připojený socket s zamýšleným jménem hostitele služby a běžnými kontrolami certifikátu. Samotné CONNECT proud nešifruje. Pro skutečné HTTP API zůstává HTTP klient pohodlnějším rozhraním, protože zpracovává i zprávy HTTP.