प्रॉक्सी से क्लाइंट के लिए GET और CONNECT अनुरोधों को ठीक से कैसे भेजें?


0

मैं C ++ में HTTP प्रॉक्सी बना रहा हूं; जब एक ग्राहक एक भेजता है GET या CONNECT प्रॉक्सी के लिए अनुरोध, प्रॉक्सी पैकेट के HTTP हेडर को पार्स करता है, इसमें होस्टनाम को हल करता है, सर्वर डेस्टिनेशन पर एक और सॉकेट खोलता है और क्लाइंट का अनुरोध भेजता है। फिर प्रॉक्सी क्लाइंट को सर्वर की प्रतिक्रिया भेजेगा।

यहाँ, उदाहरण के लिए, प्रॉक्सी सर्वर को क्या भेजता है जब वह प्राप्त करता है GET अनुरोध या ए CONNECT ग्राहक से अनुरोध:

GET http://www.gstatic.com/generate_204 HTTP/1.1

CONNECT cr-input.getspeakit.com:443 HTTP/1.1

लेकिन जब मैं पार्स ए GET सर्वर से प्रतिक्रिया, मुझे एक 400 स्थिति कोड मिलता है, अर्थात Bad Requestऐसा लगता है (विकिपीडिया से):

एक विकृत अनुरोध वाक्यविन्यास, अमान्य अनुरोध संदेश फ़्रेमिंग, या भ्रामक अनुरोध मार्ग।

क्या मैं सर्वर में गलत तर्क भेज रहा हूँ GET निवेदन?

जवाबों:


0

जब एक HTTP क्लाइंट एक भेजता है GET अनुरोध, गंतव्य होस्टनाम है आमतौर पर नहीं अनुरोधित URI में। यानी भेजने के बजाय

GET http://www.gstatic.com/generate_204 HTTP/1.1

एक HTTP 1.1 क्लाइंट भेजता है:

GET /generate_204 HTTP/1.1
Host: www.gstatic.com

चूंकि क्लाइंट "जानता है" कि इसे आईपी पते के लिए DNS नाम "www.gstatic.com" को हल करने की आवश्यकता है, और उस आईपी पते पर HTTP अनुरोध भेजें, यह वास्तव में hostname को शामिल करने की आवश्यकता नहीं है फिर अनुरोधित मार्ग के हिस्से के रूप में। Host शीर्ष लेख मूल रूप से अनुरोधित होस्टनाम के सर्वर का संकेत है।

ध्यान दें कि उपरोक्त शब्दार्थ द्वारा कवर किया गया है आरएफसी 7230, धारा 5.3 । और वहाँ, यह कर देता है अनुरोधित / लक्ष्य संसाधन का "पूर्ण रूप" बताएं सकता है स्कीमा और होस्टनाम शामिल करें; यह "मूल रूप" है जो मैंने ऊपर वर्णित किया है। यदि आपका मूल / गंतव्य सर्वर "पूर्ण रूप" के लिए "400 बैड रिक्वेस्ट" लौटाता है जो आपके प्रॉक्सी का उपयोग कर रहा है, यह या तो सुझाव देता है ए) वह सर्वर "पूर्ण रूप" का समर्थन नहीं करता है, या ख) कुछ और गलत है (एक लापता है Host अनुरोध हैडर;)।

इसका अर्थ है कि आपका HTTP प्रॉक्सी वास्तव में HTTP अनुरोध (HTTP क्लाइंट के लिए) की पहली पंक्ति में होने वाले गंतव्य होस्टनाम पर निर्भर नहीं होना चाहिए सकता है अनुरोधित / लक्ष्य संसाधन के "मूल रूप" का उपयोग करें; इसके बजाय, आपके प्रॉक्सी को ढूंढना चाहिए Host हेडर, यदि आपको उस जानकारी को जानने की आवश्यकता है। और से बचने के लिए 400 Bad Request मूल सर्वर से, मेरा सुझाव है कि आपका प्रॉक्सी भेजें जैसे :

GET /generate_204 HTTP/1.1
Host: www.gstatic.com

के शब्दार्थ के लिए CONNECT विधि, देखें आरएफसी 7231, धारा 4.3.6 । वहाँ, हम देखते हैं कि अनुरोधित संसाधन जरूर होस्टनाम और पोर्ट से मिलकर। कोई भी 2xx गंतव्य सर्वर से प्रतिक्रिया सफलता इंगित करती है; कोई अन्य प्रतिक्रिया कोड इंगित करता है कि अनुरोधित "सुरंग" स्थापित नहीं है। बाकी RFC मामलों और व्यवहारों के लिए बाकी RFC पढ़ने लायक है।

उम्मीद है की यह मदद करेगा!


यह बहुत मदद करता है, बहुत-बहुत धन्यवाद मैं इन इन्फोसिस में से किसी को भी नहीं पा सका, आरएफसी में भी नहीं। क्या आप कुछ लिंक के बारे में जानते हैं जो प्रॉक्सी सर्वर को भेजना चाहिए, और क्या प्रॉक्सी क्लाइंट को वापस भेजना चाहिए? उदाहरण के लिए, CONNECT तरीका।
elmazzun

मैंने अपने पोस्ट को संबंधित RFC के लिंक शामिल करने के लिए अपडेट किया है, जिसमें शामिल हैं CONNECT तरीका।
Castaglia
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.