Vlastný protokol TCP môže prechádzať cez HTTP proxy, ak táto proxy povoľuje CONNECT k cieľu. Protokol aplikácie nemusí byť HTTP: HTTP vytvorí tunel a potom aplikácia vymieňa svoje vlastné bajty v jeho vnútri.

OpenJDK 25 poskytuje cestu cez HTTP proxy v Socket(Proxy). Jeho implementácia vykonáva výmenu CONNECT a vracia pripojený socket, ktorý aplikácia 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žíva triedy z java.net a java.io. Nahraďte oba koncové body a vykonajte výmenu protokolu pred opustením bloku try. Pre povolený verejný cieľ TCP vyberajte HTTP kandidátov zo zoznamu HTTP proxy až po overení povolenia CONNECT pre port daného cieľa. Adresa proxy je miesto, kam sa Java pripája najskôr; adresa odovzdaná do connect určuje službu, ktorú má proxy dosiahnuť.

Nevyriešený cieľ si pre požiadavku CONNECT tejto implementácie zachováva svoje meno hostiteľa. Vyriešený InetSocketAddress naopak tejto požiadavke dodá svoju vyriešenú IP adresu. Tento rozdiel je dôležitý, keď proxy musí preložiť názov služby alebo uplatniť pravidlo založené na mene hostiteľa.

Čo vám úspešné pripojenie ponechá

Výsledné toky prenášajú údaje tunelovanej služby. Neodhaľujú samostatnú odpoveď HTTP, ktorú by vaša aplikácia mala prečítať a zahodiť. Pridanie druhej výmeny CONNECT by poslalo službe text HTTP po tom, čo JDK už tunel vytvoril.

Príklad nastavuje časový limit pripojenia a časový limit čítania zo socketu; sú to samostatné ovládacie prvky, nie jeden spoločný termín pre reláciu aplikácie.

Povolenie CONNECT stále patrí proxy. Koncový bod, ktorý preposiela bežné webové požiadavky, môže port služby odmietnuť alebo pred otvorením tunela vyžadovať overenie. Tieto zlyhania držte oddelene od servera, ktorý tunel prijme, ale neskôr odmietne váš aplikačný protokol.

Ak tento protokol potrebuje TLS, dohodnite TLS cez pripojený socket so zamýšľaným menom hostiteľa služby a bežnými kontrolami certifikátu. Samotné CONNECT tok nešifruje. Pre skutočné HTTP API zostáva HTTP klient pohodlnejším rozhraním, pretože spracúva aj správy HTTP.

Súvisiace články