From 2fcf141ae24793403cd6f732185f6a09d7017b40 Mon Sep 17 00:00:00 2001 From: yusing Date: Sat, 7 Feb 2026 21:18:22 +0800 Subject: [PATCH] fix(docs): correct swagger and package README --- internal/api/v1/homepage/categories.go | 1 + internal/api/v1/homepage/items.go | 6 ++++++ internal/api/v1/route/by_provider.go | 1 - internal/entrypoint/README.md | 6 ++++-- internal/entrypoint/entrypoint.go | 6 +++--- internal/entrypoint/http_server.go | 9 ++++++--- internal/entrypoint/routes.go | 9 ++++++--- 7 files changed, 26 insertions(+), 12 deletions(-) diff --git a/internal/api/v1/homepage/categories.go b/internal/api/v1/homepage/categories.go index 8885d27c..7ae61c77 100644 --- a/internal/api/v1/homepage/categories.go +++ b/internal/api/v1/homepage/categories.go @@ -20,6 +20,7 @@ import ( // @Produce json // @Success 200 {array} string // @Failure 403 {object} apitypes.ErrorResponse +// @Failure 500 {object} apitypes.ErrorResponse // @Router /homepage/categories [get] func Categories(c *gin.Context) { ep := entrypoint.FromCtx(c.Request.Context()) diff --git a/internal/api/v1/homepage/items.go b/internal/api/v1/homepage/items.go index 618dfc1f..a3c52a87 100644 --- a/internal/api/v1/homepage/items.go +++ b/internal/api/v1/homepage/items.go @@ -36,6 +36,7 @@ type HomepageItemsRequest struct { // @Success 200 {object} homepage.Homepage // @Failure 400 {object} apitypes.ErrorResponse // @Failure 403 {object} apitypes.ErrorResponse +// @Failure 500 {object} apitypes.ErrorResponse // @Router /homepage/items [get] func Items(c *gin.Context) { var request HomepageItemsRequest @@ -54,6 +55,11 @@ func Items(c *gin.Context) { } ep := entrypoint.FromCtx(c.Request.Context()) + if ep == nil { + c.JSON(http.StatusInternalServerError, apitypes.Error("entrypoint not found in context", nil)) + return + } + if httpheaders.IsWebsocket(c.Request.Header) { websocket.PeriodicWrite(c, 2*time.Second, func() (any, error) { return HomepageItems(ep, proto, hostname, &request), nil diff --git a/internal/api/v1/route/by_provider.go b/internal/api/v1/route/by_provider.go index 6026091c..fb80aecf 100644 --- a/internal/api/v1/route/by_provider.go +++ b/internal/api/v1/route/by_provider.go @@ -7,7 +7,6 @@ import ( entrypoint "github.com/yusing/godoxy/internal/entrypoint/types" "github.com/yusing/godoxy/internal/route" - _ "github.com/yusing/goutils/apitypes" apitypes "github.com/yusing/goutils/apitypes" ) diff --git a/internal/entrypoint/README.md b/internal/entrypoint/README.md index 8449c079..c9bc5b1a 100644 --- a/internal/entrypoint/README.md +++ b/internal/entrypoint/README.md @@ -45,7 +45,7 @@ type Entrypoint interface { // Route registry access GetRoute(alias string) (types.Route, bool) - AddRoute(r types.Route) + AddRoute(r types.Route) error IterRoutes(yield func(r types.Route) bool) NumRoutes() int RoutesByProvider() map[string][]types.Route @@ -368,7 +368,9 @@ route := &route.Route{ Port: route.Port{Proxy: 80, Target: 3000}, } -ep.AddRoute(route) +if err := ep.AddRoute(route); err != nil { + return err +} ``` ## Context Integration diff --git a/internal/entrypoint/entrypoint.go b/internal/entrypoint/entrypoint.go index b1b6e074..33990f0b 100644 --- a/internal/entrypoint/entrypoint.go +++ b/internal/entrypoint/entrypoint.go @@ -54,9 +54,9 @@ var emptyCfg Config func NewTestEntrypoint(t testing.TB, cfg *Config) *Entrypoint { t.Helper() - task := task.GetTestTask(t) - ep := NewEntrypoint(task, cfg) - entrypoint.SetCtx(task, ep) + testTask := task.GetTestTask(t) + ep := NewEntrypoint(testTask, cfg) + entrypoint.SetCtx(testTask, ep) return ep } diff --git a/internal/entrypoint/http_server.go b/internal/entrypoint/http_server.go index d1eed7b4..1b34ab13 100644 --- a/internal/entrypoint/http_server.go +++ b/internal/entrypoint/http_server.go @@ -75,19 +75,22 @@ func (srv *httpServer) Listen(addr string, proto HTTPProto) error { } task := srv.ep.task.Subtask("http_server", false) - server, err := server.StartServer(task, opts) + s, err := server.StartServer(task, opts) if err != nil { return err } srv.stopFunc = task.FinishAndWait srv.addr = addr - srv.srv = server + srv.srv = s srv.routes = pool.New[types.HTTPRoute](fmt.Sprintf("[%s] %s", proto, addr)) srv.routes.DisableLog(srv.ep.httpPoolDisableLog.Load()) return nil } func (srv *httpServer) Close() { + if srv.stopFunc == nil { + return + } srv.stopFunc(nil) } @@ -160,8 +163,8 @@ func serveNotFound(w http.ResponseWriter, r *http.Request) { Msgf("not found: %s", r.Host) errorPage, ok := errorpage.GetErrorPageByStatus(http.StatusNotFound) if ok { - w.WriteHeader(http.StatusNotFound) w.Header().Set("Content-Type", "text/html; charset=utf-8") + w.WriteHeader(http.StatusNotFound) if _, err := w.Write(errorPage); err != nil { log.Err(err).Msg("failed to write error page") } diff --git a/internal/entrypoint/routes.go b/internal/entrypoint/routes.go index b7834b4d..60d53048 100644 --- a/internal/entrypoint/routes.go +++ b/internal/entrypoint/routes.go @@ -2,6 +2,7 @@ package entrypoint import ( "errors" + "fmt" "net" "strconv" @@ -12,17 +13,17 @@ import ( func (ep *Entrypoint) IterRoutes(yield func(r types.Route) bool) { for _, r := range ep.HTTPRoutes().Iter { if !yield(r) { - break + return } } for _, r := range ep.streamRoutes.Iter { if !yield(r) { - break + return } } for _, r := range ep.excludedRoutes.Iter { if !yield(r) { - break + return } } } @@ -73,6 +74,8 @@ func (ep *Entrypoint) AddRoute(r types.Route) error { r.Stream().Close() ep.streamRoutes.Del(r) }) + default: + return fmt.Errorf("unknown route type: %T", r) } return nil }