Golang HTTP伺服器原始碼簡析

2021-09-10 02:01:55 字數 2758 閱讀 4275

會看到ok

http.newservemux 返回的型別是*http.servemux

type servemux struct 

type muxentry struct

可以看到servemux 主要是儲存路由資訊(路徑和處理函式),所以被稱為多路復用器,類似路由

func (mux *servemux) handlefunc(pattern string, handler func(responsewriter, *request)) 

mux.handle(pattern, handlerfunc(handler))

}func (mux *servemux) handle(pattern string, handler handler)

...}

當我們呼叫handlefunc函式的時候,它會把pattern 和 handler 儲存到 m 中,所以m 可以稱為路由表

經過http協議的處理,最後的內容會儲存到乙個結構體中,後面會講解具體內容,接收完請求之後,會呼叫servehttp函式來處理相應的請求,所以路由匹配將會在這個函式中進行。

}從上面可以看到,真正的匹配是在match函式中進行匹配,也就是一開始先用map準確查詢,如果找不到,就列舉查詢最長符合的路徑。

可以看到,每次接收一次連線請求,就會開啟乙個goroutine處理連線,經過一些配置,然後呼叫readrequest 開始讀取請求內容,構造結構體,然後呼叫servehttp 處理這個請求, 然後呼叫 finishrequest 進行響應。

func (c *conn) readrequest(ctx context.context) (w *response, err error) 

...return w, nil

}func readrequest(b *bufio.reader, deletehostheader bool) (req *request, err error)

...// subsequent lines: key: value.

mimeheader, err := tp.readmimeheader() // 讀http首部

if err != nil

req.header = header(mimeheader)

...err = readtransfer(req, b) // 獲取http 主體body

if err != nil

...return req,nil

從其內部可以看出,讀取乙個請求是步驟先是tp.readline 讀取http起始行部分資訊,獲取 method 、uri 和 proto 三部分,然後readmimeheader 讀取頭部 ,處理頭部資訊,儲存到map結構當中,最後 readtransfer 交接body。

func (w *response) finishrequest()
可以看到,最後將響應內容寫到緩衝區中,交由下層協議處理。

省略大部分實現細節,但可以很快了解其大致流程,而不會困頓於區域性,有興趣可以深入了解。

golang http伺服器跨域問題解決

w.header set access control allow origin 允許訪問所有域 w.header add access control allow headers content type header的型別 w.header set content type 返回資料格式是jso...

linux伺服器新增yum源

最近買了臺vps伺服器,執行的基本環境,很被偷工減料,yum的更新源太少,順便按如下 修改新增。操作步驟如下 找到centos base.repo的檔案。vi etc yum.repos.d centos base.repo 在檔案末尾增加以下部分 dag name dag rpm reposito...

更換伺服器的源

ubuntu 的源和安裝系統時選擇的語言有關係,如果是英文,源是美國那邊的,有時候更新很慢。可以通過更換國內的源解決。先備份原來的檔案 sudo cp etc apt sources.list etc apt source.list old sudo vim etc apt sources.list...