Files
gf/net/ghttp/ghttp_server_config_static.go

133 lines
3.7 KiB
Go
Raw Permalink Normal View History

2021-01-10 23:37:20 +08:00
// Copyright GoFrame Author(https://goframe.org). 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
2021-01-10 23:37:20 +08:00
// Static Searching Priority: Resource > ServerPaths > ServerRoot > SearchPath
2018-11-28 20:19:28 +08:00
package ghttp
import (
2021-09-27 21:27:24 +08:00
"context"
2019-06-19 09:06:52 +08:00
"strings"
2019-07-29 21:01:19 +08:00
2021-10-11 21:41:56 +08:00
"github.com/gogf/gf/v2/container/garray"
"github.com/gogf/gf/v2/os/gfile"
2022-03-19 17:58:21 +08:00
"github.com/gogf/gf/v2/os/gres"
2021-10-11 21:41:56 +08:00
"github.com/gogf/gf/v2/util/gconv"
2018-11-28 20:19:28 +08:00
)
// staticPathItem is the item struct for static path configuration.
type staticPathItem struct {
prefix string // The router URI.
path string // The static path.
}
// SetIndexFiles sets the index files for server.
func (s *Server) SetIndexFiles(indexFiles []string) {
s.config.IndexFiles = indexFiles
}
2022-03-19 17:58:21 +08:00
// GetIndexFiles retrieves and returns the index files from the server.
func (s *Server) GetIndexFiles() []string {
return s.config.IndexFiles
2018-11-28 20:19:28 +08:00
}
// SetIndexFolder enables/disables listing the sub-files if requesting a directory.
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
}
// SetFileServerEnabled enables/disables the static file service.
// It's the main switch for the static file service. When static file service configuration
// functions like SetServerRoot, AddSearchPath and AddStaticPath are called, this configuration
// is automatically 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
}
// SetServerRoot sets the document root for static service.
2019-06-19 09:06:52 +08:00
func (s *Server) SetServerRoot(root string) {
2021-09-27 21:27:24 +08:00
var (
ctx = context.TODO()
realPath = root
)
if !gres.Contains(realPath) {
2019-08-14 22:03:52 +08:00
if p, err := gfile.Search(root); err != nil {
s.Logger().Fatalf(ctx, `SetServerRoot failed: %+v`, err)
2019-08-14 22:03:52 +08:00
} else {
realPath = p
}
2019-06-19 09:06:52 +08:00
}
2021-09-27 21:27:24 +08:00
s.Logger().Debug(ctx, "SetServerRoot path:", realPath)
2019-06-19 09:06:52 +08:00
s.config.SearchPaths = []string{strings.TrimRight(realPath, gfile.Separator)}
s.config.FileServerEnabled = true
2018-11-28 20:19:28 +08:00
}
// AddSearchPath add searching directory path for static file service.
func (s *Server) AddSearchPath(path string) {
2021-09-27 21:27:24 +08:00
var (
ctx = context.TODO()
realPath = path
)
if !gres.Contains(realPath) {
2019-08-14 22:03:52 +08:00
if p, err := gfile.Search(path); err != nil {
s.Logger().Fatalf(ctx, `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
}
// AddStaticPath sets the uri to static directory path mapping for static file service.
func (s *Server) AddStaticPath(prefix string, path string) {
2021-09-27 21:27:24 +08:00
var (
ctx = context.TODO()
realPath = path
)
if !gres.Contains(realPath) {
2019-08-14 22:03:52 +08:00
if p, err := gfile.Search(path); err != nil {
s.Logger().Fatalf(ctx, `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 {
s.config.StaticPaths = append(s.config.StaticPaths, addItem)
2020-05-01 03:31:04 +08:00
// Sort the array by length of prefix from short to long.
2019-06-19 09:06:52 +08:00
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)
}
2020-05-01 03:31:04 +08:00
// Add the items to paths by previous sorted slice.
2019-06-19 09:06:52 +08:00
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
}