2015-10-20 76 views
0

我有另一個問題。現在我正在嘗試編寫一個可以從標準HTTP頭中成功提取發佈數據的函數。提取HTTP發佈數據

例如,如果我進入的HTTP標頭是:

GET/HTTP/1.0 
Host: example.com 

postdata=1&otherdata=2&whatever=3 

我只想找回:

postdata=1&otherdata=2&whatever=3 

爲了符合標準,\r\n必須在代碼中產生,以表示一個新行。

目前,該函數沒有返回任何內容,但是如果我刪除&& !strstr(p1,"\r\n"),則返回HTTP頭中除第一行之外的每一行。

從左到右的函數參數是:傳入的HTTP數據,輸出數據和要檢索的最大大小。

話,我會從另一個調用程序的功能在以下方式:

char result[500]; 
char* httppostdata=gethttpdata(); 
gethttppost(httppostdata,result,500); 

我們必須假設高於gethttpdata返回一個有效的指針到實際的HTTP數據。

這是需要固定功能:

unsigned long gethttppost(char* in,char* res,unsigned long max){ 
    char *p2,*p1=in;unsigned long mx; 
    while ((p1=strstr(p1,"\r\n"))){ 
    p1+=2; 
    if ((p2=strstr(p1,"\r\n\r\n")) && !strstr(p1,"\r\n")){ 
     mx=(unsigned long)(p2-p1); 
     if (mx > max){mx=max;} 
     memcpy(res,p1,mx); 
     return mx; 
    } 
    } 
    return 0; 
} 
+0

貴HTTP頭總是包含單詞'postdata'? –

+0

並不總是如此。它可能是隨機的 – Mike

回答

0

也許你能適應這個您的需求。它使用strtok來查找由CR和/或LF分隔的字符串中的最後一個令牌。終止CRLF是否不存在並不重要。

#include <stdio.h> 
#include <string.h> 

int main(void) 
{ 
    char httphdr[]= 
     "GET/HTTP/1.0\r\nHost: example.com\r\n\r\npostdata=1&otherdata=2&whatever=3\r\n"; 
    char *ptr = NULL, *lptr = NULL; 
    ptr = strtok(httphdr, "\r\n"); 
    while (ptr) { 
     lptr = ptr; 
     ptr = strtok(NULL, "\r\n"); 
    } 
    if (lptr) 
     printf("%s\n", lptr); 
    else 
     printf("Not found\n"); 
    return 0; 
} 

程序輸出

postdata=1&otherdata=2&whatever=3 
+0

謝謝,但我不認爲strtok適用於64位系統。 – Mike

+1

@Mike:爲什麼不呢?它不適用於寬字符,但這是一個不同的事情。 –

+0

@Mike爲什麼不嘗試呢?您部分成功的嘗試使用了'strstr',並且這些字符串函數不需要任何特定大小的系統來工作。 –

0

的問題是在

if ((p2=strstr(p1,"\r\n\r\n")) && !strstr(p1,"\r\n")){ 

如果p2NULL,有是肯定的一個"\r\n"序列,第二strstr不可能返回NULL。所以代碼跳過標題的結尾,之後第一個strstr總是失敗。

我沒有看到這些併發症的原因。你只需要找到(次),其中頭結束:

char * headers_end = strstr(in, "\r\n\r\n"); 
    if (headers_end == 0) 
     return 0; 
    char * body = headers_end += 4; 
    char * body_end = strstr(body, "\r\n"); 
    ....