Prilagođeni TCP protokol može putovati kroz HTTP proxy kada taj proxy dozvoljava CONNECT prema odredištu. Aplikacijski protokol ne mora postati HTTP: HTTP uspostavlja tunel, a zatim aplikacija razmjenjuje sopstvene bajtove unutar njega.

OpenJDK 25 pruža putanju kroz HTTP proxy u Socket(Proxy). Njegova implementacija izvodi CONNECT razmenu i vraća povezani socket za korišćenje aplikaciji.

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

Ovaj fragment koristi klase iz java.net i java.io. Zamenite dve krajnje tačke i obavite razmenu protokola pre izlaska iz try bloka. Za dozvoljenu javnu TCP metu birajte HTTP kandidate sa liste HTTP proxyja tek nakon što proverite dozvolu za CONNECT na portu te mete. Adresa proxyja je mesto na koje se Java prvo povezuje; adresa prosleđena u connect označava uslugu do koje proxy treba da stigne.

Nerešeno odredište zadržava ime hosta za CONNECT zahtev ove implementacije. Rešeni InetSocketAddress umesto toga tom zahtevu dostavlja svoju rešenu IP adresu. Ta razlika je važna kada proxy mora da reši ime usluge ili primeni pravilo zasnovano na imenu hosta.

Šta vam uspešna veza ostavlja

Dobijeni tokovi nose podatke tunelirane usluge. Oni ne izlažu zaseban HTTP odgovor koji bi vaša aplikacija trebalo da pročita i odbaci. Dodavanje druge CONNECT razmene poslalo bi HTTP tekst usluzi nakon što je JDK već uspostavio tunel.

Primer postavlja vremensko ograničenje povezivanja i vremensko ograničenje čitanja sa socketa; to su odvojene kontrole, a ne jedan zajednički rok za aplikacijsku sesiju.

Dozvola za CONNECT i dalje pripada proxyju. Krajnja tačka koja prosleđuje obične veb zahteve može odbiti port usluge ili zahtevati autentifikaciju pre otvaranja tunela. Držite te neuspehe odvojeno od servera koji prihvata tunel ali kasnije odbija vaš aplikacijski protokol.

Ako tom protokolu treba TLS, pregovarajte TLS kroz povezani socket sa predviđenim imenom hosta usluge i uobičajenim proverama sertifikata. Sam CONNECT ne šifruje tok. Za stvarni HTTP API, HTTP klijent ostaje prikladniji interfejs jer obrađuje i HTTP poruke.

Povezani članci