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,
2019-06-19 09:06:52 +08:00
}
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.
refactor: interface{} to any and reflect.Ptr to reflect.Pointer (#4395) This pull request standardizes the use of the Go 1.18+ `any` type alias instead of `interface{}` throughout the codebase. The change improves code readability and aligns with modern Go best practices. The update touches many files, including core data structures, code generation templates, logging utilities, and test data, ensuring consistency across all usages. **Type alias migration to `any`:** * Replaced all instances of `interface{}` with `any` in core data structures such as `garray` and in generated model structs (e.g., `TableUser`, `User1`, `User2`) to modernize type usage. [[1]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L31-R31) [[2]](diffhunk://#diff-6c19859cb32c7516ea95ddc8f8235460818eb2f24d2204308e0d9e1b19e7d90fL15-R19) [[3]](diffhunk://#diff-a15ba2f5e830b4833c47b902515a4f9e5a4f83a3707698f3229b307ec3776b41L15-R18) [[4]](diffhunk://#diff-52e0837e84d49221d1b810d88fdf78221f36cffcd664fb42f8aba49a79b974dcL15-R19) [[5]](diffhunk://#diff-11c3457d1a23a4ca6ecd00d6b856289774936b6a708384cf03aff164044e7546L15-R19) [[6]](diffhunk://#diff-2cff9cf8e6a0cc34087326d8c8149c3bbaf74c76fdbdf5a73daed13cc04249e1L15-R19) * Updated function signatures, method parameters, and return types from `interface{}` to `any` in various parts of the codebase, including code generation, service logic, and logging utilities (e.g., `mlog`). [[1]](diffhunk://#diff-175edfeea54490b8fe4e18ffcbea5835efaf8f0b8acf623359073987cae7eb76L48-R55) [[2]](diffhunk://#diff-2b1953fb78cf3593d8c2c7d911e95b65fd0b847c30ed0b4d167d16fe6d781235L54-R74) [[3]](diffhunk://#diff-e001b7a4b63603b9b14f00de78a4d570bb76c5f57d856a24643f071032e12356L66-R73) [[4]](diffhunk://#diff-5582954e8a9983988dc8854ad82067fb2ac6269b988e07357ad8db1dfec5f1a0L39-R41) [[5]](diffhunk://#diff-c5d51d56f487779a2b6207c7ad26c7a20bbadcc846ce094fe60ab4cabff58c51L107-R107) [[6]](diffhunk://#diff-f96e6a9fdb416eb1804ceaba1fe0ac637bff22c43837f8bb849c2366ce72d4a1L116-R121) [[7]](diffhunk://#diff-f94c83a1b08ae060d9346f4a6031fc4a7b9a0b894e02d9afaa09018b6598eac0L112-R112) [[8]](diffhunk://#diff-748b11dbe8828dd4c040ec23cae0b8fe57ecf0a2d1b7694ea39102294e633c64L36-R36) [[9]](diffhunk://#diff-748b11dbe8828dd4c040ec23cae0b8fe57ecf0a2d1b7694ea39102294e633c64L74-R74) [[10]](diffhunk://#diff-748b11dbe8828dd4c040ec23cae0b8fe57ecf0a2d1b7694ea39102294e633c64L96-R96) **Generated code and templates:** * Adjusted generated files and code generation templates to output `any` instead of `interface{}` for relevant struct fields and function signatures, ensuring that new code generation aligns with the updated convention. [[1]](diffhunk://#diff-6c19859cb32c7516ea95ddc8f8235460818eb2f24d2204308e0d9e1b19e7d90fL15-R19) [[2]](diffhunk://#diff-a15ba2f5e830b4833c47b902515a4f9e5a4f83a3707698f3229b307ec3776b41L15-R18) [[3]](diffhunk://#diff-52e0837e84d49221d1b810d88fdf78221f36cffcd664fb42f8aba49a79b974dcL15-R19) [[4]](diffhunk://#diff-11c3457d1a23a4ca6ecd00d6b856289774936b6a708384cf03aff164044e7546L15-R19) [[5]](diffhunk://#diff-2cff9cf8e6a0cc34087326d8c8149c3bbaf74c76fdbdf5a73daed13cc04249e1L15-R19) [[6]](diffhunk://#diff-175edfeea54490b8fe4e18ffcbea5835efaf8f0b8acf623359073987cae7eb76L48-R55) [[7]](diffhunk://#diff-e001b7a4b63603b9b14f00de78a4d570bb76c5f57d856a24643f071032e12356L66-R73) [[8]](diffhunk://#diff-5582954e8a9983988dc8854ad82067fb2ac6269b988e07357ad8db1dfec5f1a0L39-R41) **Container and utility updates:** * Refactored the `garray` container implementation and related constructors/methods to use `[]any` instead of `[]interface{}`, along with corresponding function signatures. [[1]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L31-R31) [[2]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L52-R52) [[3]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L62-R62) [[4]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L73-R86) [[5]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L96-R97) [[6]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L107-R114) [[7]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L124-R124) [[8]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L135-R143) [[9]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L167-R167) These changes collectively modernize the codebase and prepare it for future Go developments by using the idiomatic `any` type.
2025-08-28 16:53:19 +08:00
array := garray.NewSortedArray(func(v1, v2 any) int {
2019-06-19 09:06:52 +08:00
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)
2019-06-19 09:06:52 +08:00
}
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) {
2019-06-19 09:06:52 +08:00
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
}