diff --git a/document.go b/document.go index d420f4b..ef28210 100644 --- a/document.go +++ b/document.go @@ -24,7 +24,7 @@ func MakeDocument() []Api { return DefaultServer.MakeDocument() } -func (ws *webServer) MakeDocument() []Api { +func (ws *WebServer) MakeDocument() []Api { out := make([]Api, 0) // 1. Rewrite & Proxy diff --git a/handler.go b/handler.go index b8bde48..91f0454 100644 --- a/handler.go +++ b/handler.go @@ -16,7 +16,7 @@ import ( ) type RouteHandler struct { - ws *webServer + ws *WebServer webRequestingNum int64 } @@ -245,7 +245,7 @@ func hostOnly(host string) string { return h } -func (ws *webServer) findService(method, host, path string, args map[string]any) (*webServiceType, *websocketServiceType) { +func (ws *WebServer) findService(method, host, path string, args map[string]any) (*webServiceType, *websocketServiceType) { ws.webServicesLock.RLock() defer ws.webServicesLock.RUnlock() @@ -339,7 +339,7 @@ func parseRequestArgs(request *Request, args map[string]any) { } } -func (ws *webServer) checkAuth(authLevel int, options *WebServiceOptions, request *Request, response *Response, args map[string]any, logger *log.Logger) (bool, any) { +func (ws *WebServer) checkAuth(authLevel int, options *WebServiceOptions, request *Request, response *Response, args map[string]any, logger *log.Logger) (bool, any) { ac := ws.webAuthCheckers[authLevel] if ac == nil { ac = ws.webAuthChecker @@ -358,7 +358,7 @@ func (ws *webServer) checkAuth(authLevel int, options *WebServiceOptions, reques return pass, obj } -func (ws *webServer) doWebService(service *webServiceType, request *Request, response *Response, args map[string]any, +func (ws *WebServer) doWebService(service *webServiceType, request *Request, response *Response, args map[string]any, result any, logger *log.Logger, object any) any { if result != nil { return result @@ -436,7 +436,7 @@ func outputResult(response *Response, result any) { _, _ = response.Write(data) } } -func (ws *webServer) handleClientKeys(request *Request, response *Response) { +func (ws *WebServer) handleClientKeys(request *Request, response *Response) { // SessionId if ws.usedSessionIdKey != "" { sessionId := request.Header().Get(ws.usedSessionIdKey) diff --git a/proxy.go b/proxy.go index c6d4926..9794bf1 100644 --- a/proxy.go +++ b/proxy.go @@ -88,7 +88,7 @@ func (hc *HostContext) Proxy(authLevel int, path string, to string) *HostContext return hc } -func (ws *webServer) findProxy(request *Request) (int, *string, *string, string) { +func (ws *WebServer) findProxy(request *Request) (int, *string, *string, string) { host := request.Host hostOnly, port, _ := strings.Cut(host, ":") hosts := []string{host} @@ -145,7 +145,7 @@ func (ws *webServer) findProxy(request *Request) (int, *string, *string, string) return 0, nil, nil, "" } -func (ws *webServer) processProxy(request *Request, response *Response, logger *log.Logger) bool { +func (ws *WebServer) processProxy(request *Request, response *Response, logger *log.Logger) bool { authLevel, proxyToApp, proxyToPath, foundHost := ws.findProxy(request) if proxyToApp == nil || proxyToPath == nil || *proxyToApp == "" || *proxyToPath == "" { @@ -186,7 +186,7 @@ func (ws *webServer) processProxy(request *Request, response *Response, logger * return true } -func (ws *webServer) getHttpClient() *gohttp.Client { +func (ws *WebServer) getHttpClient() *gohttp.Client { // 尝试从注入对象获取 if obj := ws.GetInject(reflect.TypeOf(&gohttp.Client{})); obj != nil { return obj.(*gohttp.Client) @@ -198,7 +198,7 @@ func (ws *webServer) getHttpClient() *gohttp.Client { return gohttp.NewClient(timeout) } -func (ws *webServer) checkAuthForProxy(authLevel int, request *Request, response *Response, logger *log.Logger) (bool, any) { +func (ws *WebServer) checkAuthForProxy(authLevel int, request *Request, response *Response, logger *log.Logger) (bool, any) { ac := ws.webAuthCheckers[authLevel] if ac == nil { ac = ws.webAuthChecker @@ -245,7 +245,7 @@ func ReplaceProxies(host string, rules []ProxyRule) { DefaultServer.ReplaceProxies(host, rules) } -func (ws *webServer) ReplaceProxies(host string, rules []ProxyRule) { +func (ws *WebServer) ReplaceProxies(host string, rules []ProxyRule) { newProxies := make([]*proxyType, 0, len(rules)) for _, r := range rules { newProxies = append(newProxies, parseProxyRule(r.AuthLevel, r.Path, r.ToApp, r.ToPath, r.To)) diff --git a/reload.go b/reload.go index 1b06d5a..48c8020 100644 --- a/reload.go +++ b/reload.go @@ -17,14 +17,14 @@ func OnReload(handler func() error) { DefaultServer.OnReload(handler) } -func (ws *webServer) OnReload(handler func() error) { +func (ws *WebServer) OnReload(handler func() error) { globalReloadHook.lock.Lock() defer globalReloadHook.lock.Unlock() globalReloadHook.hooks = append(globalReloadHook.hooks, handler) } // triggerReload 触发所有注册的重新加载钩子 -func (ws *webServer) triggerReload() error { +func (ws *WebServer) triggerReload() error { globalReloadHook.lock.RLock() hooks := make([]func() error, len(globalReloadHook.hooks)) copy(hooks, globalReloadHook.hooks) diff --git a/response.go b/response.go index ad67a45..ad53122 100644 --- a/response.go +++ b/response.go @@ -19,7 +19,7 @@ type Response struct { dontLog200 bool `js:"-"` dontLogArgs []string `js:"-"` ProxyHeader *http.Header `js:"-"` - server *webServer `js:"-"` + server *WebServer `js:"-"` } func (r *Response) SetCookie(cookie *Cookie) { @@ -38,7 +38,7 @@ func (r *Response) SetCookie(cookie *Cookie) { } // NewResponse 创建 Response 包装 -func NewResponse(writer http.ResponseWriter, server *webServer) *Response { +func NewResponse(writer http.ResponseWriter, server *WebServer) *Response { return &Response{ Writer: writer, Code: http.StatusOK, diff --git a/rewrite.go b/rewrite.go index d4f828b..e0de1e4 100644 --- a/rewrite.go +++ b/rewrite.go @@ -49,7 +49,7 @@ func (hc *HostContext) Rewrite(path string, to string) *HostContext { return hc } -func (ws *webServer) processRewrite(request *Request, response *Response, logger *log.Logger) bool { +func (ws *WebServer) processRewrite(request *Request, response *Response, logger *log.Logger) bool { host := request.Host hostOnly, port, _ := strings.Cut(host, ":") hosts := []string{host} @@ -139,7 +139,7 @@ func ReplaceRewrites(host string, rules []RewriteRule) { DefaultServer.ReplaceRewrites(host, rules) } -func (ws *webServer) ReplaceRewrites(host string, rules []RewriteRule) { +func (ws *WebServer) ReplaceRewrites(host string, rules []RewriteRule) { newRewrites := make([]*rewriteType, 0, len(rules)) for _, r := range rules { newRewrites = append(newRewrites, parseRewriteRule(r.Path, r.ToPath, r.To)) diff --git a/robustness_test.go b/robustness_test.go index 9b86cd4..4f92970 100644 --- a/robustness_test.go +++ b/robustness_test.go @@ -23,7 +23,7 @@ func TestStaticRobustness(t *testing.T) { _ = os.WriteFile(testFile, content, 0644) // 注册静态目录 - ws := newWebServer() + ws := NewWebServer() ws.Config.App = "test" ws.Static("/img/", tempDir) @@ -45,7 +45,7 @@ func TestStaticRobustness(t *testing.T) { } func TestDynamicRobustness(t *testing.T) { - ws := newWebServer() + ws := NewWebServer() ws.Config.App = "test" pathPattern := "/api/scene/{name}" @@ -72,7 +72,7 @@ func TestDynamicRobustness(t *testing.T) { } func TestHostMatching(t *testing.T) { - ws := newWebServer() + ws := NewWebServer() ws.Config.App = "test" // 1. 注册只带端口的 Host diff --git a/server.go b/server.go index d044f04..9ba3462 100644 --- a/server.go +++ b/server.go @@ -28,7 +28,7 @@ type staticType struct { rootPath *string } -type webServer struct { +type WebServer struct { Config ServiceConfig server *http.Server listener net.Listener @@ -105,13 +105,13 @@ type webServer struct { } // DefaultServer 全局单例服务实例 -var DefaultServer = newWebServer() +var DefaultServer = NewWebServer() // Config 全局配置对象 (指向 DefaultServer.Config) var Config = &DefaultServer.Config -func newWebServer() *webServer { - ws := &webServer{ +func NewWebServer() *WebServer { + ws := &WebServer{ webServices: make(map[string]map[string]*webServiceType), regexWebServices: make(map[string][]*webServiceType), webServicesList: make([]*webServiceType, 0), @@ -144,7 +144,7 @@ func SetDiscovererForTest(d *discover.Discoverer) { } // ApplyConfig 将 ServiceConfig 中的路由策略应用到内部的文件级策略中 -func (ws *webServer) ApplyConfig() { +func (ws *WebServer) ApplyConfig() { ws.hostPoliciesLock.Lock() defer ws.hostPoliciesLock.Unlock() @@ -232,7 +232,7 @@ func (ws *webServer) ApplyConfig() { ws.rebuildStaticsUnderLock("") } -func (ws *webServer) rebuildProxiesUnderLock(host string) { +func (ws *WebServer) rebuildProxiesUnderLock(host string) { combined := make([]*proxyType, 0) combined = append(combined, ws.codeProxies[host]...) combined = append(combined, ws.fileProxies[host]...) @@ -244,7 +244,7 @@ func (ws *webServer) rebuildProxiesUnderLock(host string) { ws.hostProxies[host] = combined } -func (ws *webServer) rebuildRewritesUnderLock(host string) { +func (ws *WebServer) rebuildRewritesUnderLock(host string) { combined := make([]*rewriteType, 0) combined = append(combined, ws.codeRewrites[host]...) combined = append(combined, ws.fileRewrites[host]...) @@ -256,7 +256,7 @@ func (ws *webServer) rebuildRewritesUnderLock(host string) { ws.hostRewrites[host] = combined } -func (ws *webServer) rebuildStaticsUnderLock(host string) { +func (ws *WebServer) rebuildStaticsUnderLock(host string) { combined := make(map[string]*string) for k, v := range ws.codeStatics[host] { combined[k] = v @@ -286,7 +286,7 @@ func (ws *webServer) rebuildStaticsUnderLock(host string) { } // Start 启动服务,实现 starter.Service 接口 -func (ws *webServer) Start(ctx context.Context, logger *log.Logger) error { +func (ws *WebServer) Start(ctx context.Context, logger *log.Logger) error { if logger == nil { logger = log.DefaultLogger } @@ -442,7 +442,7 @@ func (ws *webServer) Start(ctx context.Context, logger *log.Logger) error { } // Stop 停止服务,实现 starter.Service 接口 -func (ws *webServer) Stop(ctx context.Context) error { +func (ws *WebServer) Stop(ctx context.Context) error { ws.running = false // 执行停机钩子 (反序) @@ -465,7 +465,7 @@ func (ws *webServer) Stop(ctx context.Context) error { } // Status 检查服务健康状态,实现 starter.Service 接口 -func (ws *webServer) Status() (string, error) { +func (ws *WebServer) Status() (string, error) { if ws.server == nil || !ws.running { return "", fmt.Errorf("server is not running") } @@ -473,7 +473,7 @@ func (ws *webServer) Status() (string, error) { } // Reload 实现配置重新加载,实现 starter.Reloader 接口 -func (ws *webServer) Reload() error { +func (ws *WebServer) Reload() error { logger := ws.logger if logger == nil { logger = log.DefaultLogger @@ -490,7 +490,7 @@ func (ws *webServer) Reload() error { // AsyncServer 兼容旧版异步服务实例 type AsyncServer struct { - *webServer + *WebServer } // Stop 兼容旧版的无参数停止方法 @@ -501,13 +501,13 @@ func (as *AsyncServer) Stop() { } ctx, cancel := context.WithTimeout(context.Background(), stopTimeout) defer cancel() - _ = as.webServer.Stop(ctx) + _ = as.WebServer.Stop(ctx) } // AsyncStart 兼容旧版的异步启动方法 func AsyncStart() *AsyncServer { _ = DefaultServer.Start(context.Background(), log.DefaultLogger) - return &AsyncServer{webServer: DefaultServer} + return &AsyncServer{WebServer: DefaultServer} } // Wait 等待服务结束 (兼容旧版,直接阻塞) diff --git a/service.go b/service.go index aa33655..264a3fd 100644 --- a/service.go +++ b/service.go @@ -61,7 +61,7 @@ func SetClientKeys(deviceIdKey, clientAppKey, sessionIdKey string) { DefaultServer.SetClientKeys(deviceIdKey, clientAppKey, sessionIdKey) } -func (ws *webServer) SetClientKeys(deviceIdKey, clientAppKey, sessionIdKey string) { +func (ws *WebServer) SetClientKeys(deviceIdKey, clientAppKey, sessionIdKey string) { ws.usedDeviceIdKey = deviceIdKey ws.usedClientAppKey = clientAppKey ws.usedSessionIdKey = sessionIdKey @@ -72,7 +72,7 @@ func SetSessionIdMaker(maker func() string) { DefaultServer.SetSessionIdMaker(maker) } -func (ws *webServer) SetSessionIdMaker(maker func() string) { +func (ws *WebServer) SetSessionIdMaker(maker func() string) { ws.sessionIdMaker = maker } @@ -81,7 +81,7 @@ func SetAuthChecker(authChecker func(authLevel int, logger *log.Logger, url *str DefaultServer.SetAuthChecker(authChecker) } -func (ws *webServer) SetAuthChecker(authChecker func(authLevel int, logger *log.Logger, url *string, in map[string]any, request *Request, response *Response, options *WebServiceOptions) (pass bool, object any)) { +func (ws *WebServer) SetAuthChecker(authChecker func(authLevel int, logger *log.Logger, url *string, in map[string]any, request *Request, response *Response, options *WebServiceOptions) (pass bool, object any)) { ws.webAuthChecker = authChecker } @@ -90,7 +90,7 @@ func AddAuthChecker(authLevels []int, authChecker func(authLevel int, logger *lo DefaultServer.AddAuthChecker(authLevels, authChecker) } -func (ws *webServer) AddAuthChecker(authLevels []int, authChecker func(authLevel int, logger *log.Logger, url *string, in map[string]any, request *Request, response *Response, options *WebServiceOptions) (pass bool, object any)) { +func (ws *WebServer) AddAuthChecker(authLevels []int, authChecker func(authLevel int, logger *log.Logger, url *string, in map[string]any, request *Request, response *Response, options *WebServiceOptions) (pass bool, object any)) { for _, al := range authLevels { ws.webAuthCheckers[al] = authChecker } @@ -101,7 +101,7 @@ func SetInFilter(filter func(in *map[string]any, request *Request, response *Res DefaultServer.SetInFilter(filter) } -func (ws *webServer) SetInFilter(filter func(in *map[string]any, request *Request, response *Response, logger *log.Logger) (out any)) { +func (ws *WebServer) SetInFilter(filter func(in *map[string]any, request *Request, response *Response, logger *log.Logger) (out any)) { ws.inFilters = append(ws.inFilters, filter) } @@ -110,7 +110,7 @@ func AddShutdownHook(hook func()) { DefaultServer.AddShutdownHook(hook) } -func (ws *webServer) AddShutdownHook(hook func()) { +func (ws *WebServer) AddShutdownHook(hook func()) { ws.shutdownHooksLock.Lock() defer ws.shutdownHooksLock.Unlock() ws.shutdownHooks = append(ws.shutdownHooks, hook) @@ -121,7 +121,7 @@ func SetOutFilter(filter func(in map[string]any, request *Request, response *Res DefaultServer.SetOutFilter(filter) } -func (ws *webServer) SetOutFilter(filter func(in map[string]any, request *Request, response *Response, out any, logger *log.Logger) (newOut any, isOver bool)) { +func (ws *WebServer) SetOutFilter(filter func(in map[string]any, request *Request, response *Response, out any, logger *log.Logger) (newOut any, isOver bool)) { ws.webServicesLock.Lock() defer ws.webServicesLock.Unlock() ws.outFilters = append(ws.outFilters, filter) @@ -130,7 +130,7 @@ func (ws *webServer) SetOutFilter(filter func(in map[string]any, request *Reques // HostContext 提供流式服务注册能力 type HostContext struct { - ws *webServer + ws *WebServer host string } @@ -139,7 +139,7 @@ func Host(host string) *HostContext { return DefaultServer.Host(host) } -func (ws *webServer) Host(host string) *HostContext { +func (ws *WebServer) Host(host string) *HostContext { if host == "" { host = "*" } @@ -151,7 +151,7 @@ func Register(method, path string, serviceFunc any) *webServiceType { return DefaultServer.Register(method, path, serviceFunc) } -func (ws *webServer) Register(method, path string, serviceFunc any) *webServiceType { +func (ws *WebServer) Register(method, path string, serviceFunc any) *webServiceType { return ws.Host("*").Register(method, path, serviceFunc) } @@ -160,7 +160,7 @@ func RegisterWebsocket(path string, serviceFunc any) *websocketServiceType { return DefaultServer.RegisterWebsocket(path, serviceFunc) } -func (ws *webServer) RegisterWebsocket(path string, serviceFunc any) *websocketServiceType { +func (ws *WebServer) RegisterWebsocket(path string, serviceFunc any) *websocketServiceType { return ws.Host("*").WebSocket(path, serviceFunc) } @@ -169,7 +169,7 @@ func Proxy(authLevel int, path string, to string) { DefaultServer.Proxy(authLevel, path, to) } -func (ws *webServer) Proxy(authLevel int, path string, to string) { +func (ws *WebServer) Proxy(authLevel int, path string, to string) { ws.Host("*").Proxy(authLevel, path, to) } @@ -178,7 +178,7 @@ func Restful(authLevel int, path string, serviceStruct any) { DefaultServer.Restful(authLevel, path, serviceStruct) } -func (ws *webServer) Restful(authLevel int, path string, serviceStruct any) { +func (ws *WebServer) Restful(authLevel int, path string, serviceStruct any) { ws.Host("*").Restful(authLevel, path, serviceStruct) } @@ -468,7 +468,7 @@ func GetInject(dataType reflect.Type) any { return DefaultServer.GetInject(dataType) } -func (ws *webServer) GetInject(dataType reflect.Type) any { +func (ws *WebServer) GetInject(dataType reflect.Type) any { if obj, exists := ws.injectObjects[dataType]; exists { return obj } @@ -497,7 +497,7 @@ func EnableWebDev(config watch.Config) { DefaultServer.webDevConfig = config } -func (ws *webServer) initWebDev(logger *log.Logger) { +func (ws *WebServer) initWebDev(logger *log.Logger) { webDevOnce.Do(func() { logger.Warning("Web Development Mode Enabled. This should NOT be used in production environment.") onWatchConn := map[string]*WebSocketConn{} diff --git a/static.go b/static.go index 33e4e88..df83480 100644 --- a/static.go +++ b/static.go @@ -26,7 +26,7 @@ func Static(path, rootPath string) { DefaultServer.Static(path, rootPath) } -func (ws *webServer) Static(path, rootPath string) { +func (ws *WebServer) Static(path, rootPath string) { ws.Host("*").Static(path, rootPath) } @@ -35,7 +35,7 @@ func StaticByHost(path, rootPath, host string) { DefaultServer.StaticByHost(path, rootPath, host) } -func (ws *webServer) StaticByHost(path, rootPath, host string) { +func (ws *WebServer) StaticByHost(path, rootPath, host string) { if !filepath.IsAbs(rootPath) { if absPath, err := filepath.Abs(rootPath); err == nil { rootPath = absPath @@ -57,7 +57,7 @@ func ReplaceStatics(host string, config map[string]string) { DefaultServer.ReplaceStatics(host, config) } -func (ws *webServer) ReplaceStatics(host string, config map[string]string) { +func (ws *WebServer) ReplaceStatics(host string, config map[string]string) { newStatics := make(map[string]*string, len(config)) for path, rootPath := range config { rp := rootPath @@ -76,7 +76,7 @@ func (ws *webServer) ReplaceStatics(host string, config map[string]string) { ws.rebuildStaticsUnderLock(host) } -func (ws *webServer) getStaticFilePath(requestPath, host string) string { +func (ws *WebServer) getStaticFilePath(requestPath, host string) string { requestPath, _ = url.PathUnescape(requestPath) ws.staticsByHostLock.RLock() defer ws.staticsByHostLock.RUnlock() @@ -90,7 +90,7 @@ func (ws *webServer) getStaticFilePath(requestPath, host string) string { return ws.findMatchedPathSorted(ws.hostStatics[""], requestPath) } -func (ws *webServer) findMatchedPathSorted(config []*staticType, requestPath string) string { +func (ws *WebServer) findMatchedPathSorted(config []*staticType, requestPath string) string { for _, rule := range config { if strings.HasPrefix(requestPath, rule.path) { return filepath.Join(*rule.rootPath, requestPath[len(rule.path):]) @@ -99,7 +99,7 @@ func (ws *webServer) findMatchedPathSorted(config []*staticType, requestPath str return "" } -func (ws *webServer) processStatic(requestPath string, request *Request, response *Response, logger *log.Logger) bool { +func (ws *WebServer) processStatic(requestPath string, request *Request, response *Response, logger *log.Logger) bool { filePath := ws.getStaticFilePath(requestPath, request.Host) if filePath == "" { return false diff --git a/websocket.go b/websocket.go index 961b90e..e501c2a 100644 --- a/websocket.go +++ b/websocket.go @@ -59,7 +59,7 @@ func Upgrade(response *Response, request *Request) (*WebSocketConn, error) { return &WebSocketConn{Conn: conn}, nil } -func (ws *webServer) doWebsocketService(wsc *websocketServiceType, request *Request, response *Response, logger *log.Logger, object any) { +func (ws *WebServer) doWebsocketService(wsc *websocketServiceType, request *Request, response *Response, logger *log.Logger, object any) { wsConn, err := Upgrade(response, request) if err != nil { logger.Error("websocket upgrade failed", "error", err.Error())