2010-10-26 81 views
2

我構建了一個解析頭文件的程序,並且我希望在收到POST時閱讀郵件正文。HTTP協議:郵件正文的結尾

對於標題,我已經能夠查找以確定標題何時結束。我對郵件正文有更多問題。我是否應該查看「Content-Length」字段以瞭解何時停止閱讀輸入內容?在我現在的代碼中(下面),它不會停止,直到我在Firefox中點擊紅十字(停止加載頁面)。

下面是代碼:

size_t n; 
unsigned char newChar; 

int index = 0; 
int capacity = 50; 
char *option = (char *) malloc(sizeof(char) * capacity); 

while ((n = read(req->socket, &newChar, sizeof(newChar))) > 0) { 
    if (newChar == '\0' || newChar == '\n') break; // This is not working 

    if (index == capacity) { 
    capacity *= 2; 
    option = (char *) realloc(option, sizeof(char) * capacity); 
    assert(option != NULL); 
    } 
    option[index++] = newChar; 
    fprintf(stderr, "%c", newChar); 
} 

if (index == capacity) { 
    capacity *= 2; 
    option = (char *) realloc(option, sizeof(char) * capacity); 
    assert(option != NULL); 
} 
option[index] = '\0'; 

正確的輸入被打印出來,但我不知道爲什麼它不會停止,直到停止加載按鈕按下得到。我想知道是否有其他解決方案,或者是否需要使用標題中的「Content-Length」字段。

非常感謝你,

Jary

回答

3

有幾件事情需要考慮。你會想要考慮你想要如何處理所有這些情況?

  • 對於HTTP協議1.0,連接關閉用於表示數據結束。

  • 這在HTTP 1.1中得到了改進,它支持持久連接。對於HTTP 1.1,通常您設置或讀取Content-Length標頭以瞭解需要多少數據。

  • 最後在HTTP 1.1中,還有「分塊」模式的可能性,當它們到達時您將獲得大小,並且您知道在塊大小== 0時已達到最終值。

查看原始圖片你是否知道libcurl?它肯定會幫助你重新實施車輪。

+1

感謝所有這些信息,我認爲我只需要實施其中一種或兩種情況。謝謝! – Jary 2010-10-26 02:24:15

0

該代碼塊上等待它從來不會出現另一個字符的read()。

此外,RFC2616, 3.7.1聲明「HTTP應用程序必須接受CRLF,裸露的CR和純粹的LF作爲代表通過HTTP接收的文本媒體中的換行符。此外,如果文本使用字符集表示對於一些多字節字符集,不分別使用字節13和10作爲CR和LF,HTTP允許使用該字符集定義的任何八位字節序列來表示換行符的CR和LF的等價值「。

因此,您需要抓住的不僅僅是「\ n」。