Node.js CONNECT హ్యాండ్లర్లు head బఫర్ను సంరక్షించాలి
HTTP నుండి టనెల్ వరకు సరిహద్దులో Node యొక్క CONNECT సాకెట్ మరియు head బఫర్ను నిర్వహించండి, హెడర్లకు ఆవల ఇప్పటికే చదివిన బైట్లను సంరక్షిస్తూ.
Node HTTP సర్వర్ సాధారణ ప్రాక్సీ అభ్యర్థనను తన request callback ద్వారా నిర్వహిస్తుంది. CONNECT మరో మార్గం తీసుకుంటుంది: సర్వర్ అభ్యర్థన, క్లయింట్ సాకెట్ మరియు head బఫర్తో పాటు connectను విడుదల చేస్తుంది.
ఆ సంఘటన HTTP పార్సింగ్ మరియు టనెల్ మధ్య అప్పగింపు. టనెల్ చేసిన ట్రాఫిక్ కోసం కొనసాగించి ఉపయోగించే సాధారణ ServerResponse ఆబ్జెక్ట్ లేదు.
| వాదన | అది ఏమి మోసుకొస్తుంది |
|---|---|
req | CONNECT అభ్యర్థన, దాని గమ్యస్థాన అధికారం మరియు హెడర్లతో సహా |
clientSocket | క్లయింట్కు తిరిగి వెళ్లే కనెక్షన్ |
head | Node ఇప్పటికే HTTP హెడర్లకు ఆవల చదివిన టనెల్ డేటా, బహుశా ఖాళీగా |
బైట్లను రిలే చేసే ముందు HTTP నిర్ణయాన్ని పూర్తి చేయండి
అభ్యర్థించిన హోస్ట్ మరియు పోర్ట్ను ధృవీకరించండి, ప్రాక్సీ యొక్క యాక్సెస్ మరియు ప్రామాణీకరణ విధానాన్ని వర్తించండి మరియు అప్స్ట్రీమ్ కనెక్షన్ను ఏర్పాటు చేయండి. CONNECT service.example:443 వంటి అధికారాన్ని గుర్తిస్తుంది; ప్రతి కోలన్ వద్ద గుడ్డిగా విభజించే బదులు IPv6 అధికారాలను దృష్టిలో ఉంచుకుని ఆ రూపాన్ని పార్స్ చేయండి.
టనెల్ ఆమోదించబడినప్పుడు, విజయవంతమైన HTTP ప్రతిస్పందనను మరియు దానిని ముగించే ఖాళీ లైన్ను పంపండి. తర్వాత క్లయింట్ సాకెట్ నుండి వచ్చే తర్వాతి బైట్లతో కొనసాగే ముందు ఏవైనా head బైట్లను అప్స్ట్రీమ్కు పంపండి. కొత్త డేటా లిజనర్ను జోడించడం ద్వారా ఇప్పటికే హ్యాండ్లర్కు విడిగా అందించిన బఫర్ను తిరిగి పొందలేము.
Node యొక్క అధికారిక టనెలింగ్ ఉదాహరణ రెండు స్ట్రీమ్ దిశలను కలిపే ముందు serverSocket.write(head)తో ఆ అప్పగింపును నిర్వహిస్తుంది. దాని చిన్న ఉదాహరణ పరివర్తనను చూపుతుంది; అమలు చేసిన ప్రాక్సీకి పరిమిత కనెక్షన్ ప్రయత్నాలు, యాక్సెస్ నియంత్రణలు మరియు జీవితచక్ర నిర్వహణ కూడా అవసరం.
విజయం తర్వాత, బైట్లు సేవా ప్రోటోకాల్కు చెందుతాయి
విజయవంతమైన CONNECT ప్రతిస్పందన కనెక్షన్ను బైట్ స్ట్రీమ్గా మారుస్తుంది. లక్ష్యం HTTPS సైట్ అయితే, దాని TLS మార్పిడి ఆ స్ట్రీమ్ లోపలే జరుగుతుంది. కేవలం టనెల్ చేయడం ప్రాక్సీ ప్రత్యామ్నాయ వెబ్సైట్ ధృవపత్రాన్ని జారీ చేయాలని కోరదు.
CONNECTని ఆమోదించే ముందు, HTTP లోపం తిరస్కరణకు కారణాన్ని వివరించగలదు. ఆమోదించిన తర్వాత, స్ట్రీమ్లో HTTP 500 రాయడం టనెల్ ప్రోటోకాల్లో బైట్లను ఇంజెక్ట్ చేస్తుంది. బదులుగా, తర్వాతి వైఫల్యాలలో సరైన కనెక్షన్లను ముగించండి లేదా నాశనం చేయండి.
రెండు దిశలను బ్యాక్ప్రెషర్-అవగాహన స్ట్రీమ్ నిర్వహణతో కలపండి, మరియు end, error మరియు close సంఘటనలు భాగస్వామిని ఎలా ముగిస్తాయో నిర్ణయించండి. ప్రారంభ head బఫర్ను అదే యాజమాన్య నమూనాలో భాగంగా సంరక్షించండి; అది అప్లికేషన్ డేటా, పడవేయాల్సిన అదనపు HTTP హెడర్లు కాదు.