mirror of
https://gitee.com/johng/gf
synced 2026-06-07 10:22:11 +08:00
改进Web Server静态文件与服务的优先级判断
This commit is contained in:
@ -20,22 +20,23 @@ import (
|
||||
// 请求对象
|
||||
type Request struct {
|
||||
http.Request
|
||||
parsedGet *gtype.Bool // GET参数是否已经解析
|
||||
parsedPost *gtype.Bool // POST参数是否已经解析
|
||||
queryVars map[string][]string // GET参数
|
||||
routerVars map[string][]string // 路由解析参数
|
||||
exit *gtype.Bool // 是否退出当前请求流程执行
|
||||
Id int // 请求id(唯一)
|
||||
Server *Server // 请求关联的服务器对象
|
||||
Cookie *Cookie // 与当前请求绑定的Cookie对象(并发安全)
|
||||
Session *Session // 与当前请求绑定的Session对象(并发安全)
|
||||
Response *Response // 对应请求的返回数据操作对象
|
||||
Router *Router // 匹配到的路由对象
|
||||
EnterTime int64 // 请求进入时间(微秒)
|
||||
LeaveTime int64 // 请求完成时间(微秒)
|
||||
Param interface{} // 开发者自定义参数
|
||||
parsedHost *gtype.String // 解析过后不带端口号的服务器域名名称
|
||||
clientIp *gtype.String // 解析过后的客户端IP地址
|
||||
parsedGet *gtype.Bool // GET参数是否已经解析
|
||||
parsedPost *gtype.Bool // POST参数是否已经解析
|
||||
queryVars map[string][]string // GET参数
|
||||
routerVars map[string][]string // 路由解析参数
|
||||
exit *gtype.Bool // 是否退出当前请求流程执行
|
||||
Id int // 请求id(唯一)
|
||||
Server *Server // 请求关联的服务器对象
|
||||
Cookie *Cookie // 与当前请求绑定的Cookie对象(并发安全)
|
||||
Session *Session // 与当前请求绑定的Session对象(并发安全)
|
||||
Response *Response // 对应请求的返回数据操作对象
|
||||
Router *Router // 匹配到的路由对象
|
||||
EnterTime int64 // 请求进入时间(微秒)
|
||||
LeaveTime int64 // 请求完成时间(微秒)
|
||||
Param interface{} // 开发者自定义参数
|
||||
parsedHost *gtype.String // 解析过后不带端口号的服务器域名名称
|
||||
clientIp *gtype.String // 解析过后的客户端IP地址
|
||||
isFileRequest bool // 是否为静态文件请求(非服务请求,当静态文件存在时,优先级会被服务请求高,被识别为文件请求)
|
||||
}
|
||||
|
||||
// 创建一个Request对象
|
||||
@ -153,8 +154,13 @@ func (r *Request) GetHost() string {
|
||||
return host
|
||||
}
|
||||
|
||||
// 判断是否为静态文件请求
|
||||
func (r *Request) IsFileRequest() bool {
|
||||
return r.isFileRequest
|
||||
}
|
||||
|
||||
// 判断是否为AJAX请求
|
||||
func (r *Request) IsAjax() bool {
|
||||
func (r *Request) IsAjaxRequest() bool {
|
||||
return strings.EqualFold(r.Header.Get("X-Requested-With"), "XMLHttpRequest")
|
||||
}
|
||||
|
||||
|
||||
@ -52,28 +52,32 @@ func (s *Server)handleRequest(w http.ResponseWriter, r *http.Request) {
|
||||
s.closeQueue.PushBack(request)
|
||||
}()
|
||||
|
||||
// 优先执行静态文件检索
|
||||
filePath := s.paths.Search(r.URL.Path)
|
||||
if filePath != "" {
|
||||
request.isFileRequest = true
|
||||
}
|
||||
|
||||
// 事件 - BeforeServe
|
||||
s.callHookHandler(HOOK_BEFORE_SERVE, request)
|
||||
|
||||
// 路由注册检索
|
||||
// 服务路由信息检索
|
||||
handler := (*handlerItem)(nil)
|
||||
if !request.exit.Val() {
|
||||
parsedItem := s.getServeHandlerWithCache(request)
|
||||
if parsedItem == nil {
|
||||
// 如果路由不匹配,那么执行静态文件检索
|
||||
path := s.paths.Search(r.URL.Path)
|
||||
if path != "" {
|
||||
s.serveFile(request, path)
|
||||
} else {
|
||||
request.Response.WriteStatus(http.StatusNotFound)
|
||||
}
|
||||
if request.IsFileRequest() {
|
||||
s.serveFile(request, filePath)
|
||||
} else {
|
||||
handler = parsedItem.handler
|
||||
if request.Router == nil {
|
||||
for k, v := range parsedItem.values {
|
||||
request.routerVars[k] = v
|
||||
parsedItem := s.getServeHandlerWithCache(request)
|
||||
if parsedItem == nil {
|
||||
request.Response.WriteStatus(http.StatusNotFound)
|
||||
} else {
|
||||
handler = parsedItem.handler
|
||||
if request.Router == nil {
|
||||
for k, v := range parsedItem.values {
|
||||
request.routerVars[k] = v
|
||||
}
|
||||
request.Router = parsedItem.handler.router
|
||||
}
|
||||
request.Router = parsedItem.handler.router
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user