Python HTTP պրոքսիի POST մարմինները կարող են բուֆերացվել rfile-ում
Կարդացեք Python HTTP պրոքսիի հարցումը հենդլերի բուֆերացված մուտքով՝ այն բայթերին սպասելու փոխարեն, որոնք արդեն լքել են socket-ի բուֆերը։
Առաջադրող պրոքսին կարդում է հարցման տողը և վերնագրերը, փոխանցում դրանք, ապա select-ում սպասում POST մարմնին։ Հաճախորդն արդեն ուղարկել է այն։ Երկու կողմերն էլ կարծես սպասում են միմյանց։
Python-ի BaseHTTPRequestHandler-ով վերնագրերի ընթերցումն անցնում է rfile-ով՝ բուֆերացված մուտքային հոսքով։ Այդ հոսքը կարող է առաջ կարդալ և պահել մարմնին պատկանող բայթեր։ Հիմքում ընկած socket-ին սպասելը միայն հարցնում է՝ արդյոք նրա ֆայլային դեսկրիպտորը պատրաստ է. այն չի հարցնում՝ արդյոք Python հոսքը արդեն պարունակում է օգտագործելի տվյալներ։
Հետևեք այն բուֆերին, որը կարդաց վերնագրերը
Մարմինը նույնպես կարդացեք self.rfile-ով։ Վերնագրերը բուֆերացված հոսքով վերլուծելուց հետո մի անցեք self.connection.recv-ին։ Հակառակ դեպքում կոդը կարող է շրջանցել այդ հոսքի պահած բայթերը և սպասել տվյալների, որոնք երբեք նորից չեն ուղարկվի։
rfile-ը select-ին փոխանցելը չի ստիպում select-ին ստուգել նրա Python բուֆերը։ Պատրաստականության API-ն աշխատում է օբյեկտի ֆայլային դեսկրիպտորով։
Մեկ վավեր Content-Length ունեցող և Transfer-Encoding չունեցող հարցման համար սպառեք ճիշտ հայտարարված բայթերի քանակը՝ կառավարելով մուտքի վաղաժամ ավարտը և ձեր չափի ու ժամանակի սահմանները։ Մի կարդացեք մինչև EOF. մշտական կապ օգտագործող հաճախորդը կարող է կապը բաց թողնել հարցումն ավարտելուց հետո։
Շրջանակավորումը դարձրեք պրոքսիի բացահայտ մաս
Բաժանված հարցման մարմինները պահանջում են բաժանված շրջանակավորման աջակցություն։ Դրանք հնարավոր չէ կարդալ բացակայող Content-Length փնտրելով։ Երկիմաստ երկարության մետատվյալները պահանջում են հստակ մերժման ուղի՝ հարմար թվացող վերնագիր ընտրելու փոխարեն։
Արգելափակող հենդլերը կարող է շարունակել օգտագործել իր հոսքային ինտերֆեյսը սահմանափակ ընթերցումներով։ Իրադարձություններով ղեկավարվող պրոքսին պահանջում է բուֆերի մոդել, որը ինտեգրում է պարսերի առաջընթաց ընթերցումը պատրաստականության կառավարման հետ։ Ժամանակի սահմանի փոփոխությունը չի հաշտեցնի նույն socket-ի երկու անկախ սպառողների։
Այս ախտորոշումը վերաբերում է նրան, թե որտեղ են պահվում մուտքային բայթերը։ Այն բանից հետո, երբ պրոքսին սպառել է ճիշտ մարմինը, այն դեռ պետք է փոխանցի այդ մարմինը հետևողական HTTP շրջանակավորմամբ։ Ստանդարտ http.server հենդլերը օգտակար տեղ է մեխանիզմը հասկանալու համար, բայց դա արտադրական առաջադրող պրոքսիի իրականացում չէ։