تونلهای HTTP CONNECT با Java Socket در OpenJDK 25
از مسیر سوکت پروکسی HTTP در OpenJDK 25 برای رسیدن به یک سرویس TCP مجاز استفاده کنید و نقطه پایانی پروکسی و مقصد را جدا نگه دارید.
یک پروتکل TCP سفارشی میتواند از یک پروکسی HTTP عبور کند وقتی آن پروکسی اجازه CONNECT به مقصد را میدهد. پروتکل برنامه لازم نیست HTTP شود: HTTP تونل را برقرار میکند و سپس برنامه بایتهای خودش را درون آن مبادله میکند.
OpenJDK 25 مسیری از طریق پروکسی HTTP را در Socket(Proxy) فراهم میکند. پیادهسازی آن تبادل CONNECT را انجام میدهد و یک سوکت متصل برای استفاده برنامه برمیگرداند.
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();
}این قطعه از کلاسهایی از java.net و java.io استفاده میکند. دو نقطه پایانی را جایگزین کنید و تبادل پروتکل را پیش از ترک بلوک try انجام دهید. برای یک مقصد TCP عمومی مجاز، نامزدهای HTTP را از فهرست پروکسی HTTP تنها پس از بررسی اجازه CONNECT برای درگاه آن مقصد انتخاب کنید. نشانی پروکسی جایی است که Java ابتدا به آن متصل میشود؛ نشانیای که به connect داده میشود سرویسی را مشخص میکند که پروکسی باید به آن برسد.
مقصد حلنشده نام میزبان خود را برای درخواست CONNECT این پیادهسازی حفظ میکند. در عوض یک InetSocketAddress حلشده نشانی IP حلشده خود را به آن درخواست میدهد. این تفاوت وقتی مهم است که پروکسی باید نام سرویس را حل کند یا خطمشی مبتنی بر نام میزبان را اعمال کند.
یک اتصال موفق چه چیزی برای شما باقی میگذارد
جریانهای حاصل دادههای سرویس تونلشده را حمل میکنند. آنها پاسخ HTTP جداگانهای را که برنامه شما باید بخواند و دور بیندازد آشکار نمیکنند. افزودن تبادل CONNECT دوم پس از آنکه JDK تونل را برقرار کرده، متن HTTP را به سرویس میفرستد.
مثال یک مهلت اتصال و یک مهلت خواندن سوکت تعیین میکند؛ اینها کنترلهای جداگانهای هستند، نه یک مهلت کلی برای نشست برنامه.
اجازه CONNECT همچنان متعلق به پروکسی است. نقطه پایانیای که درخواستهای وب عادی را هدایت میکند ممکن است درگاه سرویس را رد کند یا پیش از باز کردن تونل احراز هویت بخواهد. این شکستها را از سروری که تونل را میپذیرد اما بعداً پروتکل برنامه شما را رد میکند جدا نگه دارید.
اگر آن پروتکل به TLS نیاز دارد، TLS را از طریق سوکت متصل با نام میزبان موردنظر سرویس و بررسیهای معمول گواهی مذاکره کنید. CONNECT بهتنهایی جریان را رمزنگاری نمیکند. برای یک HTTP API واقعی، کلاینت HTTP همچنان رابط راحتتری است چون پیامهای HTTP را هم مدیریت میکند.