diff --git a/g/net/ghttp/ghttp_request.go b/g/net/ghttp/ghttp_request.go index 3a9ac2ec1..b26109574 100644 --- a/g/net/ghttp/ghttp_request.go +++ b/g/net/ghttp/ghttp_request.go @@ -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") } diff --git a/g/net/ghttp/ghttp_server_handler.go b/g/net/ghttp/ghttp_server_handler.go index 583ae2c91..f1473bb4e 100644 --- a/g/net/ghttp/ghttp_server_handler.go +++ b/g/net/ghttp/ghttp_server_handler.go @@ -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 } } }