gf/net/ghttp/ghttp_server_config_static.go

119 lines
3.3 KiB
Go
Raw Normal View History

// Copyright 2017 gf Author(https://github.com/gogf/gf). All Rights Reserved.
2018-11-28 20:19:28 +08:00
//
// This Source Code Form is subject to the terms of the MIT License.
// If a copy of the MIT was not distributed with this file,
// You can obtain one at https://github.com/gogf/gf.
2018-11-28 20:19:28 +08:00
2019-08-14 22:03:52 +08:00
// 静态文件搜索优先级: Resource > ServerPaths > ServerRoot > SearchPath
2018-11-28 20:19:28 +08:00
package ghttp
import (
2019-06-19 09:06:52 +08:00
"fmt"
"strings"
2019-07-29 21:01:19 +08:00
2019-08-14 22:03:52 +08:00
"github.com/gogf/gf/os/gres"
2019-07-29 21:01:19 +08:00
"github.com/gogf/gf/container/garray"
"github.com/gogf/gf/os/gfile"
"github.com/gogf/gf/os/glog"
"github.com/gogf/gf/util/gconv"
2018-11-28 20:19:28 +08:00
)
// 静态文件目录映射关系对象
type staticPathItem struct {
2019-06-19 09:06:52 +08:00
prefix string // 映射的URI前缀
path string // 静态文件目录绝对路径
}
2018-11-28 20:19:28 +08:00
// 设置http server参数 - IndexFiles默认展示文件index.html, index.htm
2019-06-19 09:06:52 +08:00
func (s *Server) SetIndexFiles(index []string) {
s.config.IndexFiles = index
2018-11-28 20:19:28 +08:00
}
// 允许展示访问目录的文件列表
2019-06-19 09:06:52 +08:00
func (s *Server) SetIndexFolder(enabled bool) {
s.config.IndexFolder = enabled
2018-11-28 20:19:28 +08:00
}
// 是否开启/关闭静态文件服务,当关闭时仅提供动态接口服务,路由性能会得到一定提升
func (s *Server) SetFileServerEnabled(enabled bool) {
2019-06-19 09:06:52 +08:00
s.config.FileServerEnabled = enabled
2018-11-28 20:19:28 +08:00
}
// 设置http server参数 - ServerRoot
2019-06-19 09:06:52 +08:00
func (s *Server) SetServerRoot(root string) {
2019-08-14 22:03:52 +08:00
realPath := root
if !gres.Contains(realPath) {
2019-08-14 22:03:52 +08:00
if p, err := gfile.Search(root); err != nil {
glog.Fatal(fmt.Sprintf(`[ghttp] SetServerRoot failed: %v`, err))
2019-08-14 22:03:52 +08:00
} else {
realPath = p
}
2019-06-19 09:06:52 +08:00
}
glog.Debug("[ghttp] SetServerRoot path:", realPath)
s.config.SearchPaths = []string{strings.TrimRight(realPath, gfile.Separator)}
s.config.FileServerEnabled = true
2018-11-28 20:19:28 +08:00
}
// 添加静态文件搜索**目录**,必须给定目录的绝对路径
func (s *Server) AddSearchPath(path string) {
2019-08-14 22:03:52 +08:00
realPath := path
if !gres.Contains(realPath) {
2019-08-14 22:03:52 +08:00
if p, err := gfile.Search(path); err != nil {
glog.Fatal(fmt.Sprintf(`[ghttp] AddSearchPath failed: %v`, err))
2019-08-14 22:03:52 +08:00
} else {
realPath = p
}
2019-06-19 09:06:52 +08:00
}
s.config.SearchPaths = append(s.config.SearchPaths, realPath)
s.config.FileServerEnabled = true
2018-11-28 20:19:28 +08:00
}
// 添加URI与静态**目录**的映射
func (s *Server) AddStaticPath(prefix string, path string) {
2019-08-14 22:03:52 +08:00
realPath := path
if !gres.Contains(realPath) {
2019-08-14 22:03:52 +08:00
if p, err := gfile.Search(path); err != nil {
glog.Fatal(fmt.Sprintf(`[ghttp] AddStaticPath failed: %v`, err))
2019-08-14 22:03:52 +08:00
} else {
realPath = p
}
2019-06-19 09:06:52 +08:00
}
addItem := staticPathItem{
prefix: prefix,
path: realPath,
}
if len(s.config.StaticPaths) > 0 {
// 先添加item
s.config.StaticPaths = append(s.config.StaticPaths, addItem)
// 按照prefix从长到短进行排序
array := garray.NewSortedArray(func(v1, v2 interface{}) int {
s1 := gconv.String(v1)
s2 := gconv.String(v2)
r := len(s2) - len(s1)
if r == 0 {
r = strings.Compare(s1, s2)
}
return r
})
2019-06-19 09:06:52 +08:00
for _, v := range s.config.StaticPaths {
array.Add(v.prefix)
}
// 按照重新排序的顺序重新添加item
paths := make([]staticPathItem, 0)
for _, v := range array.Slice() {
for _, item := range s.config.StaticPaths {
if strings.EqualFold(gconv.String(v), item.prefix) {
paths = append(paths, item)
break
}
}
}
s.config.StaticPaths = paths
} else {
s.config.StaticPaths = []staticPathItem{addItem}
}
s.config.FileServerEnabled = true
2018-11-28 20:19:28 +08:00
}