func (mux *ServeMux) ServeHTTP (w ResponseWriter, r *Request) { if r.RequestURI == "*" { if r.ProtoAtLeast(1, 1) { w.Header().Set("Connection", "close") } w.WriteHeader(StatusBadRequest) return } //匹配注册到路由上的handler函数 h, _ := mux.Handler(r) //调用handler函数的ServeHTTP办法 //即Hello函数,然后把数据写到http.ResponseWriter //对象中返回给客户端。 h.ServeHTTP(w, r)}func (mux *ServeMux) Handler(r *Request) (h Handler, pattern string) { if r.Method != "CONNECT" { if p := cleanPath(r.URL.Path); p != r.URL.Path { _, pattern = mux.handler(r.Host, p) url := *r.URL url.Path = p return RedirectHandler(url.String(), StatusMovedPermanently), pattern } } return mux.handler(r.Host, r.URL.Path)}func (mux *ServeMux) handler(host, path string) (h Handler, pattern string) { mux.mu.RLock() defer mux.mu.RUnlock() // Host-specific pattern takes precedence over generic>if mux.hosts { //如 127.0.0.1/hello h, pattern = mux.match(host + path) } if h == nil { // 如 /hello h, pattern = mux.match(path) } if h == nil { h, pattern = NotFoundHandler(), "" } return}func (mux *ServeMux) match(path string) (h Handler, pattern string) { var n = 0 for k, v := range mux.m { if !pathMatch(k, path) { continue } //经由过程迭代m寻找出注册路由的patten模式 //与实际url匹配的handler函数并返回。 if h == nil || len(k) > n { n = len(k) h = v.h pattern = v.pattern } } return}func pathMatch(pattern, path string) bool { if len(pattern) == 0 { // should not happen
推荐阅读
在这个系列的第一部分,我们具体地评论辩论了 cd - 敕令,在第二部分,我们深刻商量了 pushd 和 popd 两个敕令,以及它们应用的场景。持续对敕令行的评论辩论,在这篇教程中,我们将会经由>>>详细阅读
本文标题:Go语言HTTP Server源码分析
地址:http://www.17bianji.com/lsqh/34685.html
1/2 1
Go语言HTTP Server源码分析
作者: 来源: 2017-04-10 15:04:23 阅读次 我要评论
关键词: 探索发现
乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。
网友点评
精彩导读
品牌展示

科技快报