pserver]如何解析HTTP請求報文
在上一篇文章中,講述了如何編寫一個最簡單的server,但該程序只是接受到請求之后馬上返回響應(yīng),實在不能更簡單。在正常的開發(fā)中,應(yīng)該根據(jù)不同的請求做出不同的響應(yīng)。要做到上述的功能,首先要解析客戶端發(fā)來的請求報文。
報文在不同的上下文情景下有不同的理解,本文所說的報文都是在HTTP上下文中描述的名詞。
HTTP報文是什么
在HTTP程序中,報文就是HTTP用來搬運東西的包裹,也可以理解為程序之間傳遞信息時發(fā)送的數(shù)據(jù)塊。這些數(shù)據(jù)塊以一些文本形式的元信息開頭,這些信息描述了報文的內(nèi)容和含義,后面跟著可選的數(shù)據(jù)部分。
報文的流動
HTTP使用屬于流入和流出來描述報文的傳遞方向。HTTP報文會像合水一樣流動。不管時請求報文還是響應(yīng)報文,都會向下游流動,所有報文的發(fā)送者都在接受者的上游。下圖展示了報文向下游流動的例子。
報文的組成
報文由三個部分組成:
- 對報文進(jìn)行描述的起始行
- 包含屬性的首部塊
- 可選的、包含數(shù)據(jù)的主體部分
起始行和首部是由行分隔的ASCII文本。每行都以一個由兩個字符(回車符--ASCII碼13和換行符--ASCII碼10)組成的行終止序列結(jié)束。可以寫做CRLF。
盡管規(guī)范說明應(yīng)該用CRLF來表示行終止,但穩(wěn)健的應(yīng)用程序也應(yīng)該接受單個換行作為行的終止。筆者僅支持以CRLF換行的解析,因為我覺得既然有了規(guī)范,那就需要遵循,遵循相同的協(xié)議的程序才能互相通信。
實體是一個可選的數(shù)據(jù)塊。與起始