2008-09-17 25 views
18

मुझे सी में एक छोटे, कुशल वेब सर्वर के निर्माण में एक नई रुचि मिली है और HTTP शीर्षलेख से POST विधियों को पार्स करने में कुछ परेशानी हुई है। क्या किसी को "पोस्ट" डेटा से नाम/मूल्य जोड़े को पुनर्प्राप्त करने के तरीके के बारे में कोई सलाह होगी?पार्सिंग HTTP शीर्षलेख

POST /test HTTP/1.1 
Host: test-domain.com:7017 
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.1) Gecko/2008070208 Firefox/3.0.1 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Language: en-us,en;q=0.5 
Accept-Encoding: gzip,deflate 
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 
Keep-Alive: 300 
Connection: keep-alive 
Referer: http://test-domain.com:7017/index.html 
Cookie: __utma=43166241.217413299.1220726314.1221171690.1221200181.16; __utmz=43166241.1220726314.1.1.utmccn=(direct)|utmcsr=(direct)|utmcmd=(none) 
Cache-Control: max-age=0 
Content-Type: application/x-www-form-urlencoded 
Content-Length: 25 

field1=asfd&field2=a3f3f3 
// ^-this 

मुझे पूरी तरह से नीचे की रेखा को पुनः प्राप्त करने के लिए कोई ठोस तरीका नहीं दिखता है और यह सुनिश्चित करता है कि यह हर बार काम करता है। मैं कुछ भी में हार्ड कोडिंग के प्रशंसक नहीं हूँ।

उत्तर

19

आप न्यूलाइन न्यूलाइन की खोज करके नाम/मूल्य जोड़ों को पुनः प्राप्त कर सकते हैं या अधिक विशेष रूप से \ r \ n \ r \ n (इसके बाद, संदेश का बॉडी शुरू हो जाएगा)।

फिर आप आसानी से & द्वारा सूची को विभाजित कर सकते हैं, और उसके बाद नाम/मूल्य जोड़े के लिए उन सभी लौटे तारों को विभाजित कर सकते हैं।

HTTP 1.1 RFC देखें।

+0

आह, धन्यवाद। मैंने देखा कि नाम/मूल्य जोड़े की स्ट्रिंग से पहले एक अतिरिक्त जगह थी, लेकिन दो और दो को एक साथ नहीं रखा। –

+2

@rofly: दो और दो की गणना न करें, बस मानक (आरएफसी 2616) पढ़ें। यह धारा 4.1 में है। – bortzmeyer

+2

बस ध्यान रखें कि गैर-अनुपालन वाले ग्राहक हैं जो '\ n \ n' या '\ n \ r \ n' जैसे शीर्षकों के "रोचक" अंत का उपयोग करते हैं। – Wade

2

आपको रिक्त रेखा को देखने तक स्ट्रीम को हेडर के रूप में पार्स रखने की आवश्यकता है। शेष पोस्ट डेटा है।

आपको पोस्ट डेटा के लिए थोड़ा पार्सर लिखना होगा। आप सी लाइब्रेरी दिनचर्या का उपयोग कुछ त्वरित और गंदे करने के लिए कर सकते हैं, जैसे इंडेक्स, स्ट्रोक, और एसएसकेएनएफ। यदि आपके पास "छोटे" की परिभाषा में इसके लिए जगह है, तो आप नियमित अभिव्यक्ति पुस्तकालय, या यहां तक ​​कि फ्लेक्स और बाइसन के साथ कुछ और विस्तृत कर सकते हैं।

कम से कम, मुझे लगता है कि इस तरह के आपके प्रश्न का उत्तर देते हैं।

4

एक बार जब आप शीर्षलेख में सामग्री-लंबाई रखते हैं, तो आप रिक्त रेखा के ठीक बाद बाइट्स की मात्रा को पढ़ने के लिए जानते हैं। यदि, किसी भी कारण से (GET या POST) सामग्री-लंबाई शीर्षलेख में नहीं है, तो इसका मतलब है कि रिक्त रेखा (crlf) के बाद पढ़ने के लिए कुछ भी नहीं है।

0

आईईटीएफ आरएफसी इसके बावजूद, यहां बिंदु के उत्तर के लिए एक और है। यह मानते हुए कि आपको एहसास है कि हेडर में Content-Length लाइन के बाद हमेशा एक अतिरिक्त /r/n है, तो आप इसे वैरिएबल data नामक अलग करने के लिए काम करने में सक्षम होना चाहिए। यह वह जगह है जहां हम शुरू करते हैं।

char *data = "f1=asfd&f2=a3f3f3"; 
char f1[100], 
char f2[100]; 
sscanf(data, "%s&%s", &f1, &f2); // get the field tuples 

char f1_name[50]; 
char f1_data[50]; 
sscanf(f1, "%s=%s", f1_name, f1_data); 

char f2_name[50]; 
char f2_data[50]; 
sscanf(f2, "%s=%s", f2_name, f2_data); 
संबंधित मुद्दे