Soru HTTP Üstbilgilerini Ayrıştırma


Yeni, C'de küçük ve verimli bir web sunucusu oluşturmaya ilgi duydum ve HTTP Header'dan POST yöntemlerini ayrıştırma konusunda bazı problemler yaşadım. "Gönderilen" verilerden ad / değer çiftlerini almayı nasıl ele alacakları konusunda herhangi bir tavsiyede bulunabilir mi?

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

Alt çizgiyi bir bütün olarak almak için somut bir yol görmüyorum ve her seferinde çalıştığından emin olun. Ben hiçbir şeyde kodlama yapmanın hayranı değilim.


18
2017-09-17 03:49


Menşei




Cevaplar:


Ad / değer çiftlerini satırsonu satırsonu veya daha spesifik olarak arayarak alabilirsiniz. \ R \ n \ r \ n (bundan sonra mesajın gövdesi başlayacaktır).

Ardından, listeyi & ile ayırabilirsiniz ve ardından bu geri dönen dizelerin her birini = isim / değer çiftleri arasında bölebilirsiniz.

Bakın HTTP 1.1 RFC.


20
2017-09-17 03:55



Ah teşekkürler. İsim / değer çiftleri dizisinden hemen önce fazladan bir boşluk olduğunu fark ettim ama iki ve ikiyi bir araya getirmedim. - Chuck Callebs
@rofly: iki ve iki hesaplamayın, sadece standardı okuyun (RFC 2616). Bölüm 4.1'de. - bortzmeyer
Sadece "\ n \ n" veya "\ n \ r \ n" gibi "ilginç" başlıkları kullanan uyumlu olmayan istemciler olduğunu unutmayın. - Wade
Bununla birlikte, uygulama / x-www-form-urlencoded'den başka içerik türleri olduğunu unutmayın. Herhangi bir tip olabilir, ör. json popülerdir. - Per Johansson


Üstbilgide İçerik Uzunluğuna sahip olduğunuzda, boş satırın hemen ardından okunacak bayt miktarını bilirsiniz. Herhangi bir nedenle (GET veya POST) Content-Length başlığında değilse, boş satırdan (crlf) sonra okunacak bir şey olmadığı anlamına gelir.


4
2017-12-22 12:07





Boş satırı görene kadar akışı ayrıştırmaya devam etmelisiniz. Geri kalan POST verileridir.

Posta verileri için küçük bir ayrıştırıcı yazmanız gerekiyor. C kütüphanesi rutinlerini indeks, strtok ve sscanf gibi hızlı ve kirli bir şey yapmak için kullanabilirsiniz. Eğer "küçük" tanımında yer alırsanız, düzenli bir ifade kütüphanesi, hatta esnek ve bizon ile daha ayrıntılı bir şeyler yapabilirsiniz.

En azından, sanırım bu tür sorulara cevap veriyor.


2
2017-09-17 04:00





IETF RFC buna rağmen, burada bir cevap daha var. Her zaman ekstra olduğunu anladığınızı varsayalım /r/n sonra Content-Length başlıkta satır, onu bir şey içine izole etmek için yapabilmek mümkün olmalıdır char* değişken adında data. Başladığımız yer burası.

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);  

0
2017-11-23 05:00