請(qǐng)從github下載配套代碼: https://github.com/shuningzhang/learn_golang
電子書下載地址: https://u19702000.ctfile.com/dir/19702000-33357795-bb2f31/
前面我們實(shí)現(xiàn)的Web服務(wù)器軟件只能支持靜態(tài)html文件莉炉,不能支持圖片等復(fù)雜的html元素。下面本文將繼續(xù)完善該Web服務(wù)器軟件的功能使其可以支持圖片資源碴犬。通過(guò)本文絮宁,我們主要學(xué)習(xí)在Go語(yǔ)言中字符串相關(guān)的操作。如下圖是本文實(shí)現(xiàn)后的效果服协,在瀏覽器中會(huì)有一個(gè)字符串及一個(gè)小房子的圖片:
HTTP協(xié)議
在具體修改服務(wù)端代碼之前绍昂,我們先看一下對(duì)于圖片來(lái)說(shuō)http的請(qǐng)求有什么差異。如下圖是通過(guò)Wireshark捕獲的對(duì)圖片請(qǐng)求的蚯涮,可以看出沒(méi)有什么本質(zhì)的區(qū)別治专,只是請(qǐng)求頭里面路徑是一個(gè)圖片的路徑(/house.png)。
如下是Wireshark捕獲的應(yīng)答部分的內(nèi)容遭顶,這里重點(diǎn)關(guān)注一下紅色方框里面的內(nèi)容张峰,這里指出了應(yīng)答內(nèi)容的類型。瀏覽器會(huì)根據(jù)該類型進(jìn)行解析棒旗。如果類型與實(shí)際內(nèi)容不匹配喘批,將導(dǎo)致解析出現(xiàn)問(wèn)題。
服務(wù)端代碼解析
下面我們看一下服務(wù)端代碼的內(nèi)容具體是哪些铣揉。這里主要修改了3個(gè)地方:
- 增加了請(qǐng)求消息頭的解析函數(shù)饶深,確定請(qǐng)求的內(nèi)容及類型
- 增加了響應(yīng)消息的封裝函數(shù),根據(jù)響應(yīng)的內(nèi)容的大小和類型組裝應(yīng)答消息頭
- 修改主函數(shù)內(nèi)容
首先增加了一個(gè)請(qǐng)求消息頭解析的方法逛拱,該方法用于解析請(qǐng)求消息頭敌厘,將其方法、路徑和版本信息解析出來(lái)朽合。這里我們重點(diǎn)關(guān)注的是解析出請(qǐng)求的路徑俱两。因?yàn)槁窂嚼锩姘募覀兏鶕?jù)文件名就可以讀取文件的內(nèi)容曹步,并且根據(jù)文件擴(kuò)展名可以知道文件的類型宪彩。
該函數(shù)中主要使用了字符串處理的包strings,該包實(shí)現(xiàn)了子串的查找和字符串切割等功能讲婚。本函數(shù)通過(guò)這些功能解析出需要的內(nèi)容尿孔。
其次,將之前的應(yīng)答消息頭組裝的代碼封裝成一個(gè)函數(shù),該函數(shù)有2個(gè)參數(shù)活合,分別是文件長(zhǎng)度和內(nèi)容的類型雏婶。
最后,我們修改了主函數(shù)芜辕,主函數(shù)的邏輯修改的不大尚骄,主要是通過(guò)調(diào)用前面兩個(gè)函數(shù)來(lái)實(shí)現(xiàn)請(qǐng)求的解析和內(nèi)容的發(fā)送。這里實(shí)現(xiàn)的比較簡(jiǎn)單侵续,只是實(shí)現(xiàn)了基本邏輯倔丈,還有很多Bug。如1状蜗,根據(jù)解析的結(jié)果需五,如果請(qǐng)求是根路徑,則發(fā)送index.html的內(nèi)容轧坎,否則從請(qǐng)求路徑獲取內(nèi)容宏邮。
這里有個(gè)明顯的Bug,就是根據(jù)文件擴(kuò)展名來(lái)拼裝響應(yīng)消息頭的內(nèi)容缸血,但未必都是正常的蜜氨,但目前來(lái)說(shuō)是可以正常工作的。后面我們?cè)僦鸩酵晟啤?/p>
測(cè)試驗(yàn)證
照例我們驗(yàn)證一下捎泻,服務(wù)端運(yùn)行程序飒炎,在瀏覽器輸入地址后回車,可以看到運(yùn)行的效果笆豁。