Առաջադրող պրոքսին կարդում է հարցման տողը և վերնագրերը, փոխանցում դրանք, ապա 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 հենդլերը օգտակար տեղ է մեխանիզմը հասկանալու համար, բայց դա արտադրական առաջադրող պրոքսիի իրականացում չէ։

Առնչվող հոդվածներ