একটি SOCKS5 অনুরোধকে HTTP টানেলে অনুবাদ করা
প্যারেন্টের সাথে CONNECT বিনিময় সম্পূর্ণ করুন, ক্লায়েন্টকে SOCKS উত্তর ফেরত দিন এবং কেবল তারপর অ্যাপ্লিকেশন বাইট পাঠান।
একটি SOCKS5 ফ্রন্ট এন্ড তার পরবর্তী পরিবহন হিসেবে HTTP প্রক্সি ব্যবহার করতে পারে। এটি ক্লায়েন্টের প্রতি SOCKS সার্ভার এবং প্যারেন্টের প্রতি HTTP CONNECT ক্লায়েন্ট হিসেবে কাজ করে। অ্যাপ্লিকেশন স্ট্রিম শুরুর আগেই দুটি নিয়ন্ত্রণ বিনিময় শেষ হয়।
SOCKS CONNECT অনুরোধ ইতিমধ্যেই গন্তব্য হোস্ট বা ঠিকানা এবং পোর্ট সরবরাহ করে। একটি দৃষ্টান্তমূলক HTTP/1.1 প্যারেন্ট বিনিময়ের জন্য:
client → adapter: SOCKS5 CONNECT service.example.net:443
adapter → parent:
CONNECT service.example.net:443 HTTP/1.1
Host: service.example.net:443
parent → adapter: HTTP/1.1 200 Connection Established
[end of headers]
adapter → client: SOCKS5 success reply
client ↔ adapter ↔ parent ↔ service: application bytes
সীমান্তে ফলাফলের অনুবাদ করুন
অ্যাডাপ্টার প্যারেন্টের যেকোনো প্রয়োজনীয় প্রমাণীকরণ সম্পূর্ণ করে CONNECT ফলাফলের জন্য অপেক্ষা করে। একটি সফল 2xx উত্তর প্যারেন্ট টানেল স্থাপন করে। কেবল তারপরেই এটি নিম্নধারার ক্লায়েন্টের কাছে সংশ্লিষ্ট SOCKS সফলতার উত্তর ফেরত পাঠানো উচিত।
যদি প্যারেন্ট অপারেশনটি প্রত্যাখ্যান করে, তাহলে একটি নির্দিষ্ট SOCKS ব্যর্থতার উত্তর পাঠান, তারপর ক্লায়েন্ট সংযোগ দ্রুত বন্ধ করুন। SOCKS5 ব্যর্থতা শনাক্তের দশ সেকেন্ডের মধ্যে সেই বন্ধ হওয়া দাবি করে। প্যারেন্টের HTTP স্ট্যাটাস অ্যাডাপ্টারের জন্য ডায়াগনস্টিক তথ্য হিসেবে রাখুন। সেই স্ট্যাটাস লাইনটি অ্যাপ্লিকেশন ডেটা হিসেবে পাঠানো এমন একটি স্ট্রিমে HTTP নিয়ন্ত্রণ বার্তা ঢুকিয়ে দেবে যার ক্লায়েন্ট SOCKS ফ্রেমিং প্রত্যাশা করে।
সফল CONNECT ফলাফলের আগে প্যারেন্ট এখনও HTTP বলছে, যেকোনো চ্যালেঞ্জ বা ত্রুটি উত্তর ফ্রেমিং সহ। সফল ফলাফলের হেডার বিভাজকের পরে সংযোগটি টানেলে পরিণত হয়; প্রথমে গ্রহণ করার মতো কোনো HTTP প্রতিক্রিয়া বডি থাকে না।
হেডারগুলোর পরের বাইট সংরক্ষণ করুন
একটি পাঠ প্যারেন্ট হেডারের শেষ এবং গন্তব্য থেকে আসা বাইট একসাথে ধারণ করতে পারে। সেই অতিরিক্ত বাইট নিম্নধারার অ্যাপ্লিকেশনের জন্য রাখুন। সার্ভার-প্রথম প্রোটোকল সংযোগ খোলার সাথে সাথে অভিবাদন জানাতে পারে।
SOCKS সফলতার উত্তর পাঠানোর পর, অ্যাপ্লিকেশন স্ট্রিম দুই দিকেই পাঠান। অ্যাডাপ্টারকে একটি ক্লায়েন্ট বার্তার সাথে একটি সার্ভার বার্তা পালাক্রমে পাঠাতে হয় না, এবং TLS রেকর্ড পাঠানোর জন্য সেগুলো বুঝতেও হয় না। এর প্রোটোকল কাজ ছিল দুটি টানেল আলোচনা স্থাপন ও অনুবাদ করা।