ഫോർവേഡ് പ്രോക്സി അഭ്യർത്ഥനാ വരിയും ഹെഡറുകളും വായിച്ച്, അവ കൈമാറി, പിന്നീട് select-ൽ POST ബോഡിക്കായി കാത്തിരിക്കുന്നു. ക്ലയന്റ് അത് ഇതിനകം അയച്ചു. ഇരുവശവും പരസ്പരം കാത്തിരിക്കുന്നതായി തോന്നുന്നു.

Python-ന്റെ BaseHTTPRequestHandler-ൽ ഹെഡറുകൾ വായിക്കുന്നത് rfile എന്ന ബഫർ ചെയ്ത ഇൻപുട്ട് സ്ട്രീമിലൂടെയാണ്. ആ സ്ട്രീമിന് മുന്നോട്ട് വായിക്കാനും ബോഡിയുടെ ബൈറ്റുകൾ സൂക്ഷിക്കാനും കഴിയും. അടിയിലുള്ള socket-ൽ കാത്തിരിക്കുന്നത് അതിന്റെ ഫയൽ ഡിസ്ക്രിപ്റ്റർ തയ്യാറാണോ എന്ന് മാത്രം ചോദിക്കുന്നു; Python സ്ട്രീമിൽ ഇതിനകം ഉപയോഗയോഗ്യമായ ഡാറ്റ ഉണ്ടോ എന്ന് ചോദിക്കുന്നില്ല.

ഹെഡറുകൾ വായിച്ച ബഫറിനെ പിന്തുടരുക

ബോഡിയും self.rfile വഴി വായിക്കുക. ബഫർ ചെയ്ത സ്ട്രീം ഉപയോഗിച്ച് ഹെഡറുകൾ പാഴ്സ് ചെയ്ത ശേഷം self.connection.recv-ലേക്ക് മാറരുത്. അല്ലെങ്കിൽ ആ സ്ട്രീം സൂക്ഷിക്കുന്ന ബൈറ്റുകൾ ഒഴിവാക്കി, ഇനി ഒരിക്കലും അയക്കാത്ത ഡാറ്റയ്ക്കായി കോഡ് കാത്തിരിക്കാം.

rfile തന്നെ select-ലേക്ക് നൽകുന്നത് select അതിന്റെ Python ബഫർ പരിശോധിക്കാൻ കാരണമാകുന്നില്ല. റെഡിനസ് API ഒബ്ജക്റ്റിന്റെ ഫയൽ ഡിസ്ക്രിപ്റ്ററിലൂടെ പ്രവർത്തിക്കുന്നു.

ഒരു സാധുവായ Content-Length ഉള്ളതും Transfer-Encoding ഇല്ലാത്തതുമായ അഭ്യർത്ഥനയ്ക്ക്, പ്രഖ്യാപിച്ച ബൈറ്റ് എണ്ണം കൃത്യമായി ഉപയോഗിക്കുക, ഇൻപുട്ടിന്റെ നേരത്തെയുള്ള അവസാനവും നിങ്ങളുടെ വലിപ്പ-സമയ പരിധികളും കൈകാര്യം ചെയ്യുക. EOF വരെ വായിക്കരുത്: തുടർച്ചയായ കണക്ഷൻ ഉപയോഗിക്കുന്ന ക്ലയന്റ് അഭ്യർത്ഥന കഴിഞ്ഞ ശേഷവും കണക്ഷൻ തുറന്നിടാം.

ഫ്രെയിമിംഗ് പ്രോക്സിയുടെ വ്യക്തമായ ഭാഗമാക്കുക

ചങ്ക് ചെയ്ത അഭ്യർത്ഥനാ ബോഡികൾക്ക് ചങ്ക് ചെയ്ത ഫ്രെയിമിംഗ് പിന്തുണ വേണം. ഇല്ലാത്ത Content-Length തിരഞ്ഞ് അവ വായിക്കാനാകില്ല. അവ്യക്തമായ നീള മെറ്റാഡാറ്റയ്ക്ക് സൗകര്യപ്രദമെന്ന് തോന്നുന്ന ഹെഡർ തിരഞ്ഞെടുക്കുന്നതിനു പകരം നിർവചിച്ച നിരസിക്കൽ പാത വേണം.

ബ്ലോക്കിംഗ് handler പരിമിതമായ വായനകളോടെ അതിന്റെ സ്ട്രീം ഇന്റർഫേസ് തുടർന്നും ഉപയോഗിക്കാം. ഇവന്റ്-അധിഷ്ഠിത പ്രോക്സിക്ക് പാഴ്സറിന്റെ മുൻകൂട്ടി വായനയെ റെഡിനസ് കൈകാര്യം ചെയ്യലുമായി സംയോജിപ്പിക്കുന്ന ബഫർ മോഡൽ വേണം. ടൈംഔട്ട് മാറ്റുന്നത് ഒരേ socket-ന്റെ രണ്ട് സ്വതന്ത്ര ഉപഭോക്താക്കളെ യോജിപ്പിക്കില്ല.

ഈ രോഗനിർണ്ണയം ഇൻകമിംഗ് ബൈറ്റുകൾ എവിടെ സൂക്ഷിക്കുന്നു എന്നതിനെക്കുറിച്ചാണ്. പ്രോക്സി ശരിയായ ബോഡി ഉപയോഗിച്ച ശേഷവും ആ ബോഡി സ്ഥിരതയുള്ള HTTP ഫ്രെയിമിംഗോടെ കൈമാറേണ്ടതുണ്ട്. സാധാരണ http.server handler മെക്കാനിസം മനസ്സിലാക്കാൻ ഉപയോഗപ്രദമായ സ്ഥലമാണ്, പക്ഷേ അത് ഉത്പാദന ഫോർവേഡ്-പ്രോക്സി നടപ്പാക്കലല്ല.

അനുബന്ധ ലേഖനങ്ങൾ