'n Pasgemaakte TCP-protokol kan deur 'n HTTP-proxy beweeg wanneer daardie proxy CONNECT na die bestemming toelaat. Die toepassingsprotokol hoef nie HTTP te word nie: HTTP vestig die tonnel, dan ruil die toepassing sy eie grepe daarin uit.

OpenJDK 25 bied 'n HTTP-proxy-pad in Socket(Proxy). Die implementering daarvan voer die CONNECT-uitruiling uit en gee 'n gekoppelde sok vir die toepassing terug om te gebruik.

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

Hierdie fragment gebruik klasse uit java.net en java.io. Vervang die twee eindpunte en voer die protokoluitruiling uit voordat jy die try-blok verlaat. Vir 'n toegelate openbare TCP-teiken, kies HTTP-kandidate uit die HTTP-proxylys eers nadat jy CONNECT-toestemming vir daardie teiken se poort nagegaan het. Die proxy-adres is waar Java eerste koppel; die adres wat aan connect gegee word, identifiseer die diens wat die proxy moet bereik.

Die onopgeloste bestemming behou sy gasheernaam vir hierdie implementering se CONNECT-versoek. 'n Opgeloste InetSocketAddress verskaf eerder sy opgeloste IP-adres aan daardie versoek. Daardie onderskeid maak saak wanneer die proxy die diensnaam moet oplos of beleid op grond van die gasheernaam moet toepas.

Wat 'n suksesvolle verbinding jou laat

Die resulterende strome dra die tonnelde diens se data. Hulle stel nie 'n aparte HTTP-antwoord bloot wat jou toepassing moet lees en weggooi nie. 'n Tweede CONNECT-uitruiling sou HTTP-teks na die diens stuur nadat die JDK die tonnel reeds gevestig het.

Die voorbeeld verskaf 'n verbindingstydlimiet en 'n leestydlimiet vir die sok; dit is aparte beheerinstrumente, nie een algehele sperdatum vir die toepassingsessie nie.

CONNECT-toestemming bly aan die proxy. 'n Eindpunt wat gewone webversoeke deurstuur, kan die diens se poort verwerp of verifikasie vereis voordat 'n tonnel oopgemaak word. Hou daardie mislukkings apart van 'n bediener wat die tonnel aanvaar maar later jou toepassingsprotokol verwerp.

As daardie protokol TLS nodig het, onderhandel TLS deur die gekoppelde sok met die diens se bedoelde gasheernaam en normale sertifikaatkontroles. CONNECT alleen versleutel nie die stroom nie. Vir 'n werklike HTTP-API bly 'n HTTP-kliënt die gerieflikste koppelvlak omdat dit ook HTTP-boodskappe hanteer.

Verwante artikels