<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      Go Revel - server.go 源碼分析

      之前介紹了 Go Revel - main函數(shù)分析 http://www.rzrgm.cn/hangxin1940/p/3263775.html 最后會調(diào)用 `revel.Run(*port)` 開啟服務(wù)。 `server.go`源碼 https://github.com/robfig/revel/blob/master/server.go 大致流程: ![golang_server.Run](http://images.cnblogs.com/cnblogs_com/hangxin1940/508415/o_server.Run.png "golang_server.Run") 首先獲取ip地址 address := HttpAddr if port == 0 { port = HttpPort } // If the port equals zero, it means do not append port to the address. // It can use unix socket or something else. if port != 0 { address = fmt.Sprintf("%s:%d", address, port) } 如果ip地址為0,則讀取配置文件中的。 生成模板加載器: MainTemplateLoader = NewTemplateLoader(TemplatePaths) 這個模板加載器包含了當(dāng)前項目模板的路徑。 根據(jù)配置文件是否開啟熱代碼加載: // The "watch" config variable can turn on and off all watching. // (As a convenient way to control it all together.) if Config.BoolDefault("watch", true) { MainWatcher = NewWatcher() Filters = append([]Filter{WatchFilter}, Filters...) } 這里會生成一個`Watcher`,并將它加入過濾器鏈,`Watcher`符合Filter接口。它會對監(jiān)聽目錄的中文件的任何更改作出響應(yīng)。 根據(jù)配置文件是否開啟模板熱加載: // If desired (or by default), create a watcher for templates and routes. // The watcher calls Refresh() on things on the first request. if MainWatcher != nil && Config.BoolDefault("watch.templates", true) { MainWatcher.Listen(MainTemplateLoader, MainTemplateLoader.paths...) } else { MainTemplateLoader.Refresh() } 同上,它會對模板目錄進(jìn)行監(jiān)控 開啟HTTP服務(wù): Server = &http.Server{ Addr: address, Handler: http.HandlerFunc(handle), } 處理所有向`OnAppStart`注冊過的方法: runStartupHooks() 開始監(jiān)聽并等待連接: if HttpSsl { ERROR.Fatalln("Failed to listen:", Server.ListenAndServeTLS(HttpSslCert, HttpSslKey)) } else { ERROR.Fatalln("Failed to listen:", Server.ListenAndServe()) } 這里會視情況來開啟ssl 請求處理器: // This method handles all requests. It dispatches to handleInternal after // handling / adapting websocket connections. func handle(w http.ResponseWriter, r *http.Request) { if r.Header.Get("Upgrade") == "websocket" { websocket.Handler(func(ws *websocket.Conn) { r.Method = "WS" handleInternal(w, r, ws) }).ServeHTTP(w, r) } else { handleInternal(w, r, nil) } } func handleInternal(w http.ResponseWriter, r *http.Request, ws *websocket.Conn) { var ( req = NewRequest(r) resp = NewResponse(w) c = NewController(req, resp) ) req.Websocket = ws Filters[0](c, Filters[1:]) if c.Result != nil { c.Result.Apply(req, resp) } } 所有的http請求都會在這里被處理。 首先會判斷是否為`websocket`鏈接,如果是則打上標(biāo)記,并當(dāng)作websocket處理,最終都會調(diào)用`handleInternal`。 在`handleInternal`中,首先會處理過濾器鏈: Filters[0](c, Filters[1:]) `Filters`是一個切片,存儲`Filter`類型的方法 type Filter func(c *Controller, filterChain []Filter) `Filter`是一個固定參數(shù)的方法,并且內(nèi)部方法實現(xiàn)為級聯(lián)遞歸調(diào)用。每次掉用,會傳入`controller`以及當(dāng)前`Filters`長度-1的一個切片,在方法最后會遞歸調(diào)用下去,直到傳入的`Filters`切片沒有元素。 自己實現(xiàn)的`Controller`中的方法被調(diào)用之前,所有的請求數(shù)據(jù)都會被`Filter`過濾一邊,比如根據(jù)請求信息來生成路由信息,根據(jù)請求參數(shù)來轉(zhuǎn)換為正確的自定義類型,運行攔截器等等。 最后,會運行: c.Result.Apply(req, resp) `controller`的`Result`字段會在運行過濾器鏈時被賦值,有可能是處理路由時的`Result`(比如404),也有可能是自定義`controller`中的`Result`(正常處理)

      posted on 2013-08-18 00:28  黑暗伯爵  閱讀(1860)  評論(0)    收藏  舉報

      導(dǎo)航

      主站蜘蛛池模板: 日韩av一区二区三区不卡| 久久国产自偷自偷免费一区 | 亚洲av激情一区二区三区| 国产一区二区三区尤物视频| 2021国产在线视频| 亚洲色大成网站www永久一区| 中文字幕成熟丰满人妻| 蜜臀精品视频一区二区三区| 亚洲欧美一区二区三区图片| 日本欧美大码a在线观看| 亚洲午夜亚洲精品国产成人| 久久99热只有频精品8| 精品久久久噜噜噜久久久| 久久国内精品自在自线91| 熟女系列丰满熟妇AV| 一本大道久久香蕉成人网| 欧美成人精品三级网站视频| 日韩一区二区三区一级片| 99在线视频免费观看| 亚洲成色精品一二三区| 国产高清精品在线91| 97av麻豆蜜桃一区二区| 东京热人妻无码一区二区av| 色94色欧美sute亚洲线路二| 人妻少妇精品视频专区| 丰满熟妇人妻av无码区| 天天澡天天揉揉av无码| 亚洲中文字幕国产综合| 欧美日韩不卡视频合集| 亚洲AV日韩AV高清在线观看| 国产午夜福利在线视频| 青草青草视频2免费观看| 亚洲综合色网一区二区三区| 成人免费无遮挡在线播放| 欧美性色黄大片| 精品国产成人午夜福利| 国产午夜福利视频合集| 免费人妻无码不卡中文字幕18禁| 少妇熟女天堂网av| 亚洲a∨国产av综合av| 欧美xxxxx在线观看|