Curl ഇല്ലാതെ HTTP റിക്വസ്റ്റുകൾ ചെയ്യാം
curl അല്ലെങ്കിൽ wget ഇല്ലാത്ത ഒരു സെർവറിൽ നിങ്ങൾ ജോലി ചെയ്യേണ്ടി വന്നേക്കാം. ഒരു എൻഡ്പോയിന്റ് (endpoint) ടെസ്റ്റ് ചെയ്യേണ്ടതുണ്ട്, എന്നാൽ ആ ടൂളുകൾ അവിടെ ലഭ്യമല്ല. അത്തരം സാഹചര്യങ്ങളിൽ HTTP റിക്വസ്റ്റുകൾ നേരിട്ട് അയക്കാൻ നിങ്ങൾക്ക് Bash ഉപയോഗിക്കാം.
Bash-ൽ /dev/tcp എന്ന് വിളിക്കപ്പെടുന്ന ഒരു മറഞ്ഞിരിക്കുന്ന ഫീച്ചർ ഉണ്ട്. ഇതൊരു യഥാർത്ഥ ഫയലല്ല. Bash-ന് മനസ്സിലാകുന്ന ഒരു പ്രത്യേക ഡിവൈസ് (device) ആണിത്. നിങ്ങൾ /dev/tcp/hostname/port എന്ന പാതയിലേക്ക് എഴുതുമ്പോൾ, Bash നിങ്ങൾക്കായി ഒരു TCP കണക്ഷൻ തുറക്കുന്നു.
ഇത് എങ്ങനെ പ്രവർത്തിക്കുന്നു:
ഫയൽ ഡിസ്ക്രിപ്റ്ററുകൾ (file descriptors) നിയന്ത്രിക്കുന്നതിന് നിങ്ങൾ exec കമാൻഡ് ഉപയോഗിക്കുന്നു. ഉദാഹരണത്തിന്, വായനയ്ക്കും എഴുതുന്നതിനുമായി നിങ്ങൾക്ക് ഫയൽ ഡിസ്ക്രിപ്റ്റർ 3 തുറക്കാം.
ഇതിന്റെ സിന്റാക്സ് (syntax) ഇപ്രകാരമാണ്: exec 3<>/dev/tcp/example.com/80
ഈ കണക്ഷൻ തുറന്നുകഴിഞ്ഞാൽ, നിങ്ങൾക്ക് അതിലേക്ക് ഡാറ്റ അയക്കാവുന്നതാണ്. കൂടാതെ അതിൽ നിന്ന് ഡാറ്റ വായിച്ചെടുക്കാനും സാധിക്കും. HTTP പ്രോട്ടോക്കോൾ താഴ്ന്ന തലത്തിൽ (low level) എങ്ങനെ പ്രവർത്തിക്കുന്നു എന്ന് ഈ രീതിയിലൂടെ മനസ്സിലാക്കാം.
ഒരു GET റിക്വസ്റ്റ് എങ്ങനെ ചെയ്യാം:
ഡാറ്റ ലഭിക്കുന്നതിന്, നിങ്ങൾ ശരിയായ ഹെഡറുകൾ (headers) അയക്കേണ്ടതുണ്ട്. നിങ്ങളുടെ റിക്വസ്റ്റ് അവസാനിച്ചു എന്ന് സൂചിപ്പിക്കാൻ അവസാനം ഒരു ശൂന്യമായ വരി (blank line) ആവശ്യമാണ്.
ഈ ഘട്ടങ്ങൾ പിന്തുടരുക:
- നിങ്ങളുടെ host, port, path വേരിയബിളുകൾ സെറ്റ് ചെയ്യുക.
execഉപയോഗിച്ച് കണക്ഷൻ തുറക്കുക.- GET റിക്വസ്റ്റ് അയക്കാൻ
printfഉപയോഗിക്കുക. വരികൾ അവസാനിക്കാൻ\r\nഉപയോഗിക്കുക. - റെസ്പോൺസ് (response) വായിക്കാൻ
catഅല്ലെങ്കിൽ ഒരു ലൂപ്പ് ഉപയോഗിക്കുക. - ജോലി കഴിഞ്ഞാൽ ഫയൽ ഡിസ്ക്രിപ്റ്റർ ക്ലോസ് ചെയ്യുക.
ഉദാഹരണ സ്ക്രിപ്റ്റ്:
HOST="example.com"
PORT=80
REQUEST_PATH="/"
exec 3<>/dev/tcp/${HOST}/${PORT}
printf "GET ${REQUEST_PATH} HTTP/1.0\r\nHost: ${HOST}\r\n\r\n" >&3
cat <&3
exec 3>&-
ക്ലയന്റുകളും സെർവറുകളും എങ്ങനെ പരസ്പരം ആശയവിനിമയം നടത്തുന്നു എന്ന് മനസ്സിലാക്കാൻ ഈ സാങ്കേതികവിദ്യ സഹായിക്കുന്നു. മിനിമലിസ്റ്റ് സിസ്റ്റങ്ങളിൽ (minimalist systems) ഡീബഗ്ഗിംഗ് (debugging) ചെയ്യുന്നതിന് ഇതൊരു ഉപകാരപ്രദമായ നൈപുണ്യമാണ്.