2010-03-07 162 views
1

我正在寫一個小項目,它使用HTTP 1.1 GET和POST與一組服務器進行交互。服務器給了我一些標題行之後的響應,所以我儘管使用strtok()函數使用\n作爲分隔符,但每當我嘗試這樣做時就會崩潰。如何解析C中的HTTP響應?

有沒有簡單的方法來解析C中的HTTP響應?我不想爲此使用第三方庫,但如果它真的需要,我不會有任何問題。

非常感謝您的一切。

編輯:下面是一些示例代碼,只是想打印線:

char *response = "HTTP/1.1 200 OK\nServer: Apache-Coyote/1.1\nPragma: no-cache" 

char *token = NULL; 
token = strtok(response, "\n"); 
while (token) { 
    printf("Current token: %s.\n", token); 
    token = strtok(NULL, "\n"); 
} 
+2

請發佈您的代碼 – 2010-03-07 04:41:47

+1

當在一個線程或多進程程序中使用時,可能需要使用'strtok_r()'來保證安全,如果可用的話,請考慮使用它 – mctylr 2010-03-07 05:07:41

+0

試圖修改來自'「...」'字符串文字的字符數組的任何元素都是**未定義的行爲**;請參閱http://c0x.coding-guidelines.com/6.4.5.html和http://www.catb.org/jargon/html/N/nasal-demons.html。 – ephemient 2010-03-07 05:47:02

回答

5

http-parser是用C語言編寫的Node.js的項目

這是一個簡單和超快速HTTP解析器只有2個C文件,沒有任何外部依賴。

+0

它是用回調式編寫的,以支持「輪詢」循環。也許作者對阻塞解析器感興趣,比如'golang'的[ReadRequest](http://golang.org/pkg/net/http/#ReadRequest) – 2015-02-16 09:55:50

+0

有沒有一個客戶端用C語言編寫的解析器?存儲庫附帶的示例對於像我這樣的新手來說似乎不夠。 – Bharat 2017-02-20 20:14:21

4

您發佈的代碼中的問題非常簡單:strtok通過修改您傳遞給它的字符串來工作。修改字符串文字會導致未定義的行爲。你的代碼一個真正的微小變化讓它工作(我還率領適當的標題,並移動可執行部分成一個函數:

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

char response[] = "HTTP/1.1 200 OK\nServer: Apache-Coyote/1.1\nPragma: no-cache"; 

int main() { 
    char *token = NULL; 
    token = strtok(response, "\n"); 
    while (token) { 
     printf("Current token: %s.\n", token); 
     token = strtok(NULL, "\n"); 
    } 
    return 0; 
} 

在實際使用時,你會被讀取HTTP響應成無論如何緩衝區;你遇到的問題僅僅出現在你生成的一個簡單的測試用例中,同時它也指出strtok是一個功能設計很差的事實,你幾乎肯定會用其他的東西。

+0

不確定爲什麼你認爲這個問題反映了strtok上的poorl。真正的問題是,字符串文字被認爲是「char *」而不是「const char *」,並且該問題可能會影響修改字符串輸入的任何代碼。 – 2010-03-07 06:27:06

+0

它反映了'strtok'糟糕,因爲它不必要地限制了它的輸入範圍,不僅僅是可以修改的數據,而且你不介意在使用過程中基本破壞。 – 2010-03-07 07:06:54