একটি কাস্টম TCP প্রোটোকল HTTP প্রক্সির ভেতর দিয়ে যেতে পারে যখন প্রক্সিটি গন্তব্যের প্রতি CONNECT অনুমতি দেয়। অ্যাপ্লিকেশন প্রোটোকলকে HTTP হতে হবে না: HTTP টানেলটি স্থাপন করে, তারপর অ্যাপ্লিকেশন তার নিজের বাইট বিনিময় করে।

OpenJDK 25 Socket(Proxy)-এ একটি HTTP প্রক্সি পথ সরবরাহ করে। এর বাস্তবায়ন 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 বার্তাও পরিচালনা করে।

সম্পর্কিত নিবন্ধ