改进Web Server静态文件与服务的优先级判断

This commit is contained in:
John
2018-08-23 00:31:14 +08:00
parent 13d6fc00a2
commit 684e6d2940
2 changed files with 42 additions and 32 deletions

View File

@ -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")
}

View File

@ -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
}
}
}