আজকাল প্রায় সব ওয়েব ডেভেলপমেন্ট ফ্রেমওয়ার্ক দিয়ে করা হয়। আপনি রেল, সিনাট্রা বা লোটাস ব্যবহার করুন না কেন, আপনাকে সত্যিই চিন্তা করতে হবে না কিভাবে কুকিজ এবং অন্যান্য শিরোনামগুলি nginx বা apache থেকে অ্যাপ্লিকেশন সার্ভারে এবং আপনার অ্যাপে যায়৷ তারা শুধু করে।
আমরা একটু গভীরভাবে এই যাত্রা পরীক্ষা করতে যাচ্ছি. কারণ দেখা যাচ্ছে যে হেডারের গল্পে ওয়েবের ইতিহাস সম্পর্কে অনেক আকর্ষণীয় তথ্য রয়েছে৷
যাইহোক HTTP হেডার কি?
যখনই একটি ওয়েব ব্রাউজার একটি অনুরোধ করে, এটি HTTP শিরোনাম বলা এই জিনিসগুলি বরাবর পাঠায়। এগুলিতে কুকিজ, ব্যবহারকারী এজেন্ট সম্পর্কে তথ্য, ক্যাশিং তথ্য রয়েছে — অনেকগুলি সত্যিই দরকারী জিনিস৷
আপনার ব্রাউজারের ডেভেলপমেন্ট টুলে রিকোয়েস্ট দেখে আপনি দেখতে পারেন কোন হেডার পাঠানো হচ্ছে। এখানে একটি উদাহরণ. আপনি দেখতে পাচ্ছেন, শিরোনামগুলি যাদুকর কিছু নয়। এগুলি শুধুমাত্র একটি নির্দিষ্ট উপায়ে টেক্সট ফরম্যাট করা হয়েছে৷
৷
কিভাবে আপনার অ্যাপে হেডার পাঠানো হয় না
আপনি যদি কখনও একটি র্যাক অ্যাপ লিখে থাকেন, আপনি সম্ভবত env
দেখেছেন হ্যাশ, যা অ্যাপের পরিবেশ ভেরিয়েবল ধারণ করে। আপনি যদি এটির ভিতরে একটু নজর দেন, আপনি দেখতে পাবেন যে সাধারণ সিস্টেম এনভায়রনমেন্ট ভেরিয়েবল ছাড়াও, এতে সমস্ত অনুরোধ শিরোনাম রয়েছে৷
# config.ru
run lambda { |env| [200, {"Content-Type" => "text/plain"}, [env.inspect]] }
# Outputs:
# { "HTTP_HOST"=>"localhost:9000", "HTTP_CONNECTION"=>"keep-alive", "HTTP_PRAGMA"=>"no-cache", "HTTP_CACHE_CONTROL"=>"no-cache", "HTTP_ACCEPT"=>"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", "HTTP_UPGRADE_INSECURE_REQUESTS"=>"1", "HTTP_USER_AGENT"=>"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36", ... }
এটি না কিভাবে nginx আপনার অ্যাপে হেডার পাস করে। :)
অ্যাপ্লিকেশন সার্ভার
আজকাল, বেশিরভাগ রুবি ওয়েব অ্যাপ ইউনিকর্নের মতো অ্যাপ্লিকেশন সার্ভারে চলে। যেহেতু অ্যাপ সার্ভারগুলি nginx দ্বারা তৈরি হয় না, তাই nginx তাদের পরিবেশের ভেরিয়েবল সেট করতে পারে না৷
শিরোনাম কিভাবে তারপর nginx থেকে ইউনিকর্ন ভ্রমণ করে? সরল যখন nginx অ্যাপ সার্ভারে অনুরোধটি ফরোয়ার্ড করে, তখন এটি সম্পূর্ণ অনুরোধ পাঠায় — শিরোনাম এবং সমস্ত।
এটি প্রদর্শনের জন্য, আমি একটি সাধারণ অ্যাপ্লিকেশন সার্ভার তৈরি করেছি যা nginx যা STDOUT-এ পাঠায় তা ডাম্প করে।
require "socket"
# Create the socket and "save it" to the file system
server = UNIXServer.new('/tmp/socktest.sock')
# Wait until for a connection (by nginx)
socket = server.accept
# Read everything from the socket
while line = socket.readline
puts line.inspect
end
socket.close
আপনি যদি ইউনিকর্নের পরিবর্তে এই সার্ভারের সাথে সংযোগ করার জন্য nginx কনফিগার করেন, তাহলে আপনি দেখতে পাবেন ঠিক কী তথ্য অ্যাপ সার্ভারে পাঠানো হচ্ছে:শুধুমাত্র একটি সাধারণ HTTP অনুরোধ। হেডার এবং সব।
একটি সাধারণ আপস্ট্রিম অ্যাপ সার্ভার কীভাবে লিখতে হয় সে সম্পর্কে আরও তথ্যের জন্য, ইউনিক্স সকেটগুলিতে আমার পোস্টটি দেখুন৷
তাহলে পরিবেশের ভেরিয়েবল নিয়ে বিরক্ত কেন?
1993 সালে, NSCA "কমন গেটওয়ে ইন্টারফেস" বা সংক্ষেপে CGI নামে একটি বিশেষত্ব প্রকাশ করে।
গতিশীল ওয়েবপেজ তৈরি করতে ডিস্কে ইচ্ছামত প্রোগ্রাম চালানোর জন্য অ্যাপাচির মতো সার্ভারের জন্য এটি একটি উপায় ছিল। একজন ব্যবহারকারী একটি পৃষ্ঠার অনুরোধ করবে, এবং Apache আক্ষরিক অর্থে শেল আউট করবে এবং ফলাফল তৈরি করতে একটি প্রোগ্রাম চালাবে। যেহেতু অ্যাপাচি সরাসরি অ্যাপ তৈরি করেছে, তাই এটি তাদের পরিবেশের ভেরিয়েবল সেট করতে পারে।
CGI মান নির্দিষ্ট করে যে HTTP শিরোনামগুলি পরিবেশের ভেরিয়েবল হিসাবে পাস করা হবে। এবং বিদ্যমান এনভায়রনমেন্ট ভেরিয়েবলের সাথে কোনো নামকরণের সংঘর্ষ এড়াতে, এটি নির্দিষ্ট করে যে "HTTP_" নামের সাথে আগে থেকে যুক্ত করা উচিত।
তাই আপনি পরিবেশের ভেরিয়েবলের একটি গুচ্ছ নিয়ে আবদ্ধ হন যা দেখতে এইরকম:
HTTP_ACCEPT="text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
HTTP_ACCEPT_CHARSET="ISO-8859-1,utf-8;q=0.7,*;q=0.7"
HTTP_ACCEPT_ENCODING="gzip, deflate"
HTTP_ACCEPT_LANGUAGE="en-us,en;q=0.5"
HTTP_CONNECTION="keep-alive"
HTTP_HOST="example.com"
HTTP_USER_AGENT="Mozilla/5.0 (Windows NT 6.1; WOW64; rv:5.0) Gecko/20100101 Firefox/5.0"
আজকাল খুব কমই কেউ নতুন ডেভেলপমেন্টের জন্য CGI ব্যবহার করে, কিন্তু পরিবেশ ভেরিয়েবল হিসাবে সংরক্ষণ করা HTTP শিরোনামগুলি দেখতে এখনও খুব সাধারণ - যদিও কখনও কখনও সেগুলি ভুয়া পরিবেশ ভেরিয়েবল হয়৷
অ্যাপ সার্ভারগুলি কীভাবে এটি নকল করে
অ্যাপ্লিকেশন সার্ভারগুলি কাঁচা HTTP অনুরোধের বাইরে হেডার পার্স করে৷ তাহলে তারা পরিবেশে কিভাবে আসবে? আচ্ছা, অ্যাপ সার্ভার সেগুলিকে সেখানে রাখে৷
৷আমি ওয়েবব্রিকের চারপাশে একটু খনন করেছি এবং ধূমপানকারী বন্দুকটি খুঁজে পেতে সক্ষম হয়েছি:
self.each{|key, val|
next if /^content-type$/i =~ key
next if /^content-length$/i =~ key
name = "HTTP_" + key
name.gsub!(/-/o, "_")
name.upcase!
meta[name] = val
}
অবশেষে, এই "নকল" এনভায়রনমেন্ট ভেরিয়েবলগুলিকে অন্যান্য বাস্তব পরিবেশের ভেরিয়েবলের সাথে একত্রিত করা হয় এবং আপনার র্যাক অ্যাপে এবং রেলে পাঠানো হয়, যা তাদের এনভায়রনমেন্ট হ্যাশের বাইরে নিয়ে যায়। :)