HTTP স্ট্যাটাস কোড

প্রতিটি নিবন্ধিত HTTP স্ট্যাটাস কোড, এর সঠিক reason phrase এবং এটিকে সংজ্ঞায়িত করা RFC সেকশনের একটি অনুসন্ধানযোগ্য টেবিল। 1xx থেকে 5xx ক্লাস দিয়ে ফিল্টার করুন।

এই রেসপন্স কোডটি আসলে কী বোঝায়? টেবিল ফিল্টার করতে 429-এর মতো একটি সংখ্যা বা gateway-এর মতো একটি শব্দ টাইপ করুন, অথবা একটি একক ক্লাসে সীমাবদ্ধ করুন। প্রতিটি সারিতে কোড, তারের উপর ভ্রমণকারী সঠিক reason phrase এবং যে স্পেসিফিকেশন সেকশন এটিকে সংজ্ঞায়িত করে তা দেখানো হয়।

মিলে যাওয়া কোড
কোড Reason phrase সংজ্ঞায়িত করা হয়েছে

HTTP স্ট্যাটাস কোড সঠিকভাবে পড়া

ক্লাস ডিজিট চুক্তি বহন করে

প্রতিটি HTTP রেসপন্স একটি তিন-অঙ্কের কোড দিয়ে শুরু হয়, এবং প্রথম অঙ্কটি একমাত্র অংশ যা একটি ক্লায়েন্টের বোঝা আবশ্যক। RFC 9110 এ বিষয়ে স্পষ্ট: যে ক্লায়েন্ট একটি অপরিচিত 499 পায় তাকে অবশ্যই এটি ঠিক 400-এর মতো আচরণ করতে হবে, কারণ ক্লাসটি শব্দার্থ সংজ্ঞায়িত করে এবং অবশিষ্ট দুটি অঙ্ক শুধু সেগুলোকে পরিমার্জিত করে। সেই নিয়মটিই প্রোটোকলকে এক্সটেনসিবল রাখে। ২০০৫ সালে লেখা একটি প্রক্সি এখনও 451 সঠিকভাবে রাউট করতে পারে আইনি সেন্সরশিপ কী তা না জেনেও।

পাঁচটি ক্লাস পরের কী ঘটবে তার জন্য কে দায়ী তার ভিত্তিতে পরিষ্কারভাবে বিভক্ত। একটি 1xx হল একটি অন্তর্বর্তী রেসপন্স, তাই প্রকৃত উত্তর এখনও আসছে এবং সংযোগ খোলা থাকে। একটি 2xx মানে রিকোয়েস্ট সফল হয়েছে এবং ক্লায়েন্ট থামতে পারে। একটি 3xx একটি রিডাইরেক্ট ফিরিয়ে দেয়, তাই ক্লায়েন্টের অন্য কোথাও আবার চেষ্টা করা উচিত। একটি 4xx রিকোয়েস্টকে দোষারোপ করে, তাই অপরিবর্তিতভাবে এটি পুনরাবৃত্তি করলে আবার ব্যর্থ হবে। একটি 5xx সার্ভারকে দোষারোপ করে, তাই অভিন্ন রিকোয়েস্ট রিট্রাইতে সফল হতে পারে। এ কারণেই রিট্রাই লজিক নির্দিষ্ট কোডের বদলে ক্লাসের উপর ভিত্তি করে চলে: একটি 503 রিট্রাই করা যুক্তিসঙ্গত, একটি 403 রিট্রাই করা একটি বাগ।

যেগুলো নিয়মিত বিভ্রান্ত হয়

301 এবং 308, বা 302 এবং 307-এর মধ্যে পার্থক্য স্টাইলিস্টিক নয়। পুরোনো জোড়া ক্লায়েন্টকে রিডাইরেক্ট অনুসরণ করার সময় একটি POST-কে GET-এ পুনর্লিখন করার অনুমতি দেয়, যা ব্রাউজাররা ঐতিহাসিকভাবে করেছে। নতুন জোড়া সেই পুনর্লিখন নিষিদ্ধ করে এবং পদ্ধতি ও বডি উভয়ই সংরক্ষণ করে। যদি আপনি একটি ফর্ম এন্ডপয়েন্ট 301 দিয়ে সরান, কিছু ক্লায়েন্ট নীরবে সাবমিশনটিকে GET-এ রূপান্তর করবে এবং পেলোডটি ফেলে দেবে। অ-আইডেমপোটেন্ট কিছুর জন্য 308 বা 307 ব্যবহার করুন।

401 এবং 403 একইভাবে বিভ্রান্ত হয়। একটি 401 মানে রিকোয়েস্টটি অথেনটিকেটেড ছিল না এবং অবশ্যই একটি WWW-Authenticate চ্যালেঞ্জসহ আসতে হবে, যা ক্লায়েন্টকে ক্রেডেনশিয়াল দিয়ে কীভাবে আবার চেষ্টা করতে হয় তা বলে। একটি 403 মানে সার্ভার বুঝেছে আপনি কে এবং তবুও অস্বীকার করছে। চ্যালেঞ্জ হেডার ছাড়া একটি 401 পাঠানো একটি স্পেসিফিকেশন লঙ্ঘন, এবং ব্যবহারকারী শুধু লগ ইন করতে ভুলে গেলে একটি 403 পাঠানো ব্যর্থতা ডিবাগ করা অনেক কঠিন করে তোলে।

4xx ক্লাসে সত্যিই দরকারী একটি জোড়াও রয়েছে: 400 বনাম 422। একটি 400 মানে রিকোয়েস্টটি একেবারেই পার্স করা যায়নি, তাই সিনট্যাক্স ভাঙা। একটি 422 মানে সিনট্যাক্স ঠিকঠাক পার্স হয়েছে কিন্তু কন্টেন্ট ভ্যালিডেশনে ব্যর্থ হয়েছে। এই দুটোকে আলাদা করলে API ক্লায়েন্টদের জন্য একটি অস্বচ্ছ ব্যর্থতা কর্মযোগ্য হয়ে ওঠে।

Reason phrase শুধু মানুষের জন্য

কোডের পাশের টেক্সট, যেমন Not Found বা I'm a teapot, হল reason phrase। HTTP/1.1 এটি স্ট্যাটাস লাইনে পাঠায়, কিন্তু HTTP/2 এবং HTTP/3 এটি সম্পূর্ণরূপে সরিয়ে দিয়েছে, তাই একটি আধুনিক সংযোগ প্রায়শই কোনো ফ্রেজ ছাড়াই সংখ্যাটি বহন করে। কোনো ক্লায়েন্টের কখনোই সেই স্ট্রিংয়ের উপর শাখা করা উচিত নয়। এটি বিদ্যমান যাতে একটি লগ বা কাঁচা ট্রেস পড়া মানুষ লুকআপ টেবিল ছাড়াই কী ঘটেছে দেখতে পারে।

কিছু কোড দেখতে যতটা মনে হয় তার চেয়েও বেশি সীমাবদ্ধ। একটি 204 এবং 304 অবশ্যই কোনো মেসেজ বডি অন্তর্ভুক্ত করবে না, তাই একটি মধ্যস্থতাকারী যে একটি যোগ করে তা একটি অবৈধ রেসপন্স তৈরি করছে। একটি HEAD রেসপন্স কোড যাই হোক কখনো বডি বহন করে না। এই ফ্রেমিং নিয়মগুলো গুরুত্বপূর্ণ কারণ যেখানে বডি প্রত্যাশিত নয় সেখানে একটি বডি সংযোগ পুনঃব্যবহারকে ডিসিঙ্ক্রোনাইজ করে, যা সুস্পষ্ট ত্রুটির বদলে উদ্ভট ক্রস-রিকোয়েস্ট দুর্নীতি হিসেবে প্রকাশ পায়।

ওপেন-সোর্স নোট: কোনো থার্ড-পার্টি লাইব্রেরি ছাড়াই ভ্যানিলা JavaScript-এ বাস্তবায়িত।

FAQ

কয়টি HTTP স্ট্যাটাস কোড বিদ্যমান?
IANA পাঁচটি ক্লাসে মাত্র ষাটের বেশি নিবন্ধিত কোড তালিকাভুক্ত করে, এবং এই টেবিলটি সেগুলোর সবকটি প্লাস কিছু ব্যাপকভাবে মোতায়েন করা WebDAV এবং এক্সটেনশন কোড কভার করে। রেজিস্ট্রি ইচ্ছাকৃতভাবে উন্মুক্ত, তাই নতুন কোড যোগ করা যেতে পারে, এ কারণেই অপরিচিত কিছুর জন্য ক্লায়েন্টদের অবশ্যই ক্লাস ডিজিটে ফিরে যেতে হবে।
স্থায়ী রিডাইরেক্টের জন্য আমার কি 301 বা 308 ব্যবহার করা উচিত?
308 ব্যবহার করুন, যদি না আপনি বিশেষভাবে চান পুরোনো ক্লায়েন্টরা POST-কে GET-এ রূপান্তর করুক। উভয়ই মানে রিসোর্স স্থায়ীভাবে সরেছে, কিন্তু শুধু 308 নিশ্চিত করে পদ্ধতি ও বডি রিডাইরেক্ট টিকে থাকে। সাধারণ পৃষ্ঠা সরানোর জন্য দুটোই কাজ করে, এবং 301-এর সামান্য ব্যাপক লিগ্যাসি সমর্থন রয়েছে।
401 এবং 403-এর মধ্যে পার্থক্য কী?
একটি 401 মানে আপনি অথেনটিকেট করেননি এবং রেসপন্সে অবশ্যই একটি WWW-Authenticate হেডার থাকতে হবে যা বর্ণনা করে কীভাবে করতে হয়। একটি 403 মানে আপনি ঠিকঠাক অথেনটিকেট করেছেন এবং তবুও অনুমতি নেই। ব্যবহারকারীর শুধু লগ ইন করা দরকার হলে 401 সঠিক; তার অ্যাকাউন্টে সত্যিই অনুমতি না থাকলে 403 সঠিক।
418 I'm a teapot কি একটি প্রকৃত স্ট্যাটাস কোড?
এটি প্রকৃত এই অর্থে যে RFC 2324 এটি Hyper Text Coffee Pot Control Protocol-এর জন্য সংজ্ঞায়িত করে, ১৯৯৮ সালের একটি এপ্রিল ফুল স্পেসিফিকেশন। IANA এটিকে সংরক্ষিত রাখে যাতে অন্য কেউ 418 দাবি করতে না পারে। এটি প্রকৃত HTTP-এর অংশ নয়, তবে বেশ কিছু ফ্রেমওয়ার্ক এটিকে একটি ইস্টার এগ হিসেবে বাস্তবায়ন করে।
কোন কোডগুলো আমার ক্লায়েন্ট স্বয়ংক্রিয়ভাবে রিট্রাই করা উচিত?
408, 429 এবং বেশিরভাগ 5xx রেসপন্সে রিট্রাই করুন, এবং উপস্থিত থাকলে সর্বদা একটি Retry-After হেডারকে সম্মান করুন। 408 এবং 429 ছাড়া অন্য 4xx কোড রিট্রাই করবেন না, কারণ রিকোয়েস্টটিই সমস্যা এবং অপরিবর্তিতভাবে পুনরাবৃত্তি করলে তা অভিন্নভাবে ব্যর্থ হবে।
আমার HTTP/2 রেসপন্সে কেন কোনো reason phrase নেই?
HTTP/2 এবং HTTP/3 তারের ফরম্যাট থেকে reason phrase বাদ দিয়েছে কারণ কোনো ক্লায়েন্টের এটি পার্স করার কথা ছিল না। শুধু সংখ্যাসূচক কোডটি ট্রান্সমিট হয়। HTTP/2 রেসপন্সের জন্য ফ্রেজ প্রদর্শনকারী টুলগুলো এটির মতো একটি টেবিল থেকে স্থানীয়ভাবে খুঁজে নেয়।