Tunnel HTTP CONNECT Java Socket di OpenJDK 25
Gunakan jalur socket proxy HTTP di OpenJDK 25 untuk mencapai layanan TCP yang diizinkan, sambil menjaga titik akhir proxy dan tujuan tetap terpisah.
Protokol TCP khusus dapat melintasi proxy HTTP ketika proxy tersebut mengizinkan CONNECT ke tujuan. Protokol aplikasi tidak harus menjadi HTTP: HTTP membangun tunnel, lalu aplikasi menukar byte-nya sendiri di dalamnya.
OpenJDK 25 menyediakan jalur proxy HTTP pada Socket(Proxy). Implementasinya melakukan pertukaran CONNECT dan mengembalikan socket yang terhubung untuk digunakan aplikasi.
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();
}Fragmen ini menggunakan kelas dari java.net dan java.io. Ganti kedua titik akhir dan lakukan pertukaran protokol sebelum keluar dari blok try. Untuk target TCP publik yang diizinkan, pilih kandidat HTTP dari daftar proxy HTTP hanya setelah memeriksa izin CONNECT untuk port target tersebut. Alamat proxy adalah tempat Java terhubung lebih dulu; alamat yang diteruskan ke connect mengidentifikasi layanan yang harus dicapai proxy.
Tujuan yang belum diresolusi mempertahankan nama hostnya untuk permintaan CONNECT implementasi ini. Sebaliknya, InetSocketAddress yang sudah diresolusi memasok alamat IP hasil resolusinya ke permintaan itu. Perbedaan itu penting ketika proxy harus meresolusi nama layanan atau menerapkan kebijakan berbasis nama host.
Apa yang tersisa setelah koneksi berhasil
Aliran yang dihasilkan membawa data layanan yang di-tunnel. Aliran itu tidak menampilkan respons HTTP terpisah yang harus dibaca dan dibuang oleh aplikasi Anda. Menambahkan pertukaran CONNECT kedua akan mengirim teks HTTP ke layanan setelah JDK sudah membangun tunnel.
Contoh ini menetapkan batas waktu koneksi dan batas waktu baca socket; keduanya kontrol terpisah, bukan satu tenggat keseluruhan untuk sesi aplikasi.
Izin CONNECT tetap milik proxy. Titik akhir yang meneruskan permintaan web biasa dapat menolak port layanan atau meminta autentikasi sebelum membuka tunnel. Jaga kegagalan itu terpisah dari server yang menerima tunnel tetapi kemudian menolak protokol aplikasi Anda.
Jika protokol itu membutuhkan TLS, negosiasikan TLS melalui socket yang terhubung dengan nama host yang dimaksudkan layanan dan pemeriksaan sertifikat yang biasa. CONNECT saja tidak mengenkripsi aliran. Untuk HTTP API sungguhan, klien HTTP tetap menjadi antarmuka yang lebih nyaman karena juga menangani pesan HTTP.