سؤال

لقد وجدت اهتمامًا جديدًا ببناء خادم ويب صغير وفعال بلغة C وواجهت بعض المشاكل في تحليل أساليب 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

لا أرى طريقة ملموسة لاستعادة النتيجة النهائية ككل والتأكد من أنها تعمل في كل مرة.أنا لست من محبي البرمجة الصعبة في أي شيء.

هل كانت مفيدة؟

المحلول

يمكنك استرداد أزواج الاسم/القيمة من خلال البحث عن سطر جديد أو بشكل أكثر تحديدًا (بعد ذلك، سيبدأ نص الرسالة).

بعد ذلك، يمكنك ببساطة تقسيم القائمة حسب &، ثم تقسيم كل من تلك السلاسل التي تم إرجاعها بين = لأزواج الاسم/القيمة.

انظر HTTP 1.1 آر إف سي.

نصائح أخرى

بمجرد تحديد طول المحتوى في الرأس، ستعرف مقدار البايتات التي سيتم قراءتها مباشرة بعد السطر الفارغ.إذا لم يكن طول المحتوى موجودًا في الرأس لأي سبب (GET أو POST)، فهذا يعني أنه لا يوجد شيء يمكن قراءته بعد السطر الفارغ (crlf).

تحتاج إلى الاستمرار في تحليل الدفق كرؤوس حتى ترى السطر الفارغ.والباقي هو بيانات POST.

تحتاج إلى كتابة محلل صغير لبيانات النشر.يمكنك استخدام إجراءات مكتبة C للقيام بشيء سريع وقذر، مثل الفهرس، وstrtok، وsscanf.إذا كان لديك مجال لذلك في تعريفك لكلمة "صغير"، فيمكنك القيام بشيء أكثر تفصيلًا باستخدام مكتبة التعبيرات العادية، أو حتى باستخدام flex وbison.

على الأقل، أعتقد أن هذا النوع من الإجابة على سؤالك.

بالرغم من ذلك، IETF RFC، إليك إجابة أكثر دقة.على افتراض أنك تدرك أن هناك دائمًا ما هو إضافي /r/n بعد Content-Length في الرأس، يجب أن تكون قادرًا على القيام بالعمل لعزله في ملف char* متغير اسمه 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);  
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top