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