2013-02-15 80 views
2

我真的需要提取的信息是:如何最有效地解析C中的這個HTTP請求?

一)它是否是一個GET要求

二)文件地址(例如的index.html)

C)的主機信息(例如本地主機:8081)

我剛纔有這樣做的代碼(請參閱我的帖子的底部),但它似乎效率低下,相當靜態,並且不會提取主機信息。

所以我想有一個理智的解決方案來解析HTTP請求在C.乾杯!

HTTP請求

GET /index.html HTTP/1.1 
Host: localhost:8081 
Connection: keep-alive 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.70 Safari/537.17 
DNT: 1 
Accept-Encoding: gzip,deflate,sdch 
Accept-Language: en-US,en;q=0.8,en-GB;q=0.6 
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3 

目前代碼

int parsehttp(char *inputstring, int *type, char *getaddress) { 
    if((strncmp(inputstring, "GET", 3)) == 0) { 
     *type = 1; 
    } else { 
     *type = 0; 
    } 
    char firstline[BUFLEN] = ""; 
    int charoffset = getlineend(inputstring); //this function returns the int offset of '\r\n' 
    strncpy(firstline, inputstring, charoffset-2); 
    firstline[charoffset-1] = '\0'; 
    sscanf(firstline,"%*s %s %*s",getaddress); 
    inputstring = (inputstring + charoffset); 
    return 1; 
} 
+0

我想說你正在尋找正則表達式的正則表達式。看看一些教程,這應該不是一個大問題:) – dutt 2013-02-15 11:59:09

+5

@dutt如果他嘗試這與正則表達式然後他將有** 2 **問題。 – 2013-02-15 11:59:44

+1

解析來自互聯網的數據的一個理智的解決方案包括檢查緩衝區溢出和各種其他驗證。 – 2013-02-15 12:06:48

回答

3

什麼可以幫助你,是的strstr功能。它試圖在您提供的字符串中找到給定的字符串。由於HTTP請求由以0xD結尾的行組成,所以可以分割行。 通常,文本行中的信息使用空格分隔。 因此,要找到「GET」或「POST」您使用

char* getpost = strstr("GET /index.html HTTP/1.1", "GET"); 

如果是的getPost!= NULL,你有你的字符串,可以減少之後GET或POST。

其次,你會尋找「主機:」並跳過該部分,直到你達到0xD,0xA,所以你得到你的主機地址。

請參閱strstr以瞭解關於strstr的聯機幫助頁。

+0

你可以很容易地得到與strstr緩衝區溢出 - 要理智,你應該使用strnstr實現(或滾動你自己的) – griffin 2013-07-31 11:55:35

0

你不應該擔心這是低效率的,它畢竟是聯網的,並且總是會比CPU,緩存,RAM慢很多。

如果您正在編寫http服務器,那麼您應該關心的唯一事情就是內存安全性以及您的代碼在客戶端發送意外事件時的功能。

一些例子: 什麼是你的代碼(遵循此代碼/取決於其解析)辦:

  • 客戶端發送> 10 MB的數據,所有惡意形成的,如根本沒有換行符。
  • 客戶端發送錯誤的小數(即ip /端口/內容長度)
  • 客戶端發送正確的數據,但蘋果緩慢,例如每秒1個字節。
  • ...更多。
+0

我知道,因爲我剛剛完成我自己的異步Web服務器。 – 2013-02-15 12:15:03

+2

-1我以前也寫過網絡服務器,而不用擔心CPU和/或RAM是一個非常糟糕的主意。如果你不擔心這些,只需使用Apache或其他一些較慢的服務器,並且不要自己推出。 – griffin 2013-07-31 11:57:37