Egy egyedi TCP-protokoll átjuthat egy HTTP-proxyn, ha az a proxy engedélyezi a CONNECT-et a cél felé. Az alkalmazásprotokollnak nem kell HTTP-vé válnia: a HTTP létrehozza az alagutat, majd az alkalmazás a saját bájtjait cseréli benne.

Az OpenJDK 25 HTTP-proxy útvonalat biztosít a Socket(Proxy) osztályban. A megvalósítás elvégzi a CONNECT-cserét, és egy csatlakoztatott socketet ad vissza az alkalmazásnak.

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();
}

Ez a részlet a java.net és a java.io osztályait használja. Cserélje ki a két végpontot, és végezze el a protokollcserét, mielőtt kilép a try blokkból. Engedélyezett nyilvános TCP-cél esetén csak akkor válasszon HTTP-jelölteket a HTTP-proxy listáról, miután ellenőrizte a CONNECT-engedélyt a cél portjára. A proxy címe az, ahová a Java először csatlakozik; a connect számára átadott cím azonosítja azt a szolgáltatást, amelyet a proxynak el kell érnie.

A feloldatlan cél megtartja a hosztnevét ennek a megvalósításnak a CONNECT-kéréséhez. Egy feloldott InetSocketAddress viszont a feloldott IP-címét adja át annak a kérésnek. Ez a különbség akkor számít, amikor a proxynak fel kell oldania a szolgáltatás nevét, vagy hosztnév-alapú szabályzatot kell alkalmaznia.

Mit hagy Önnek egy sikeres kapcsolat

A létrejövő adatfolyamok az alagúton átvitt szolgáltatás adatait hordozzák. Nem tesznek elérhetővé külön HTTP-választ, amelyet az alkalmazásának el kellene olvasnia és eldobnia. Egy második CONNECT-csere HTTP-szöveget küldene a szolgáltatásnak, miután a JDK már létrehozta az alagutat.

A példa kapcsolódási időkorlátot és socketolvasási időkorlátot ad meg; ezek külön szabályzók, nem egyetlen átfogó határidő az alkalmazás munkamenetére.

A CONNECT-engedély továbbra is a proxyé. Egy hétköznapi webkéréseket továbbító végpont elutasíthatja a szolgáltatás portját, vagy hitelesítést kérhet az alagút megnyitása előtt. Tartsa ezeket a hibákat elkülönítve attól a kiszolgálótól, amely elfogadja az alagutat, de később elutasítja az alkalmazásprotokollját.

Ha annak a protokollnak TLS-re van szüksége, egyeztessen TLS-t a csatlakoztatott socketen keresztül a szolgáltatás szándékolt hosztnevével és a szokásos tanúsítvány-ellenőrzésekkel. A CONNECT önmagában nem titkosítja az adatfolyamot. Valódi HTTP API esetén a HTTP-kliens marad a kényelmesebb felület, mert az HTTP-üzeneteket is kezeli.

Kapcsolódó cikkek