diff --git a/go.mod b/go.mod index b730e15..7f2f08d 100644 --- a/go.mod +++ b/go.mod @@ -3,6 +3,7 @@ module github.com/yusing/go-proxy go 1.23.4 require ( + github.com/PuerkitoBio/goquery v1.10.1 github.com/coder/websocket v1.8.12 github.com/coreos/go-oidc/v3 v3.12.0 github.com/docker/cli v27.4.1+incompatible @@ -16,6 +17,7 @@ require ( github.com/prometheus/client_golang v1.20.5 github.com/puzpuzpuz/xsync/v3 v3.4.0 github.com/rs/zerolog v1.33.0 + github.com/vincent-petithory/dataurl v1.0.0 golang.org/x/crypto v0.32.0 golang.org/x/net v0.34.0 golang.org/x/oauth2 v0.25.0 @@ -26,7 +28,6 @@ require ( require ( github.com/Microsoft/go-winio v0.6.2 // indirect - github.com/PuerkitoBio/goquery v1.10.1 // indirect github.com/andybalholm/cascadia v1.3.3 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/cenkalti/backoff/v4 v4.3.0 // indirect @@ -63,7 +64,6 @@ require ( github.com/prometheus/common v0.61.0 // indirect github.com/prometheus/procfs v0.15.1 // indirect github.com/sirupsen/logrus v1.9.3 // indirect - github.com/vincent-petithory/dataurl v1.0.0 // indirect go.opentelemetry.io/auto/sdk v1.1.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.58.0 // indirect go.opentelemetry.io/otel v1.33.0 // indirect diff --git a/internal/api/handler.go b/internal/api/handler.go index a8d1bef..512c5fe 100644 --- a/internal/api/handler.go +++ b/internal/api/handler.go @@ -6,6 +6,7 @@ import ( v1 "github.com/yusing/go-proxy/internal/api/v1" "github.com/yusing/go-proxy/internal/api/v1/auth" + "github.com/yusing/go-proxy/internal/api/v1/favicon" . "github.com/yusing/go-proxy/internal/api/v1/utils" "github.com/yusing/go-proxy/internal/common" config "github.com/yusing/go-proxy/internal/config/types" @@ -37,7 +38,7 @@ func NewHandler(cfg config.ConfigInstance) http.Handler { mux.HandleFunc("GET", "/v1/schema/{filename...}", v1.GetSchemaFile) mux.HandleFunc("GET", "/v1/stats", useCfg(cfg, v1.Stats)) mux.HandleFunc("GET", "/v1/stats/ws", useCfg(cfg, v1.StatsWS)) - mux.HandleFunc("GET", "/v1/favicon/{alias}", auth.RequireAuth(v1.GetFavIcon)) + mux.HandleFunc("GET", "/v1/favicon/{alias}", auth.RequireAuth(favicon.GetFavIcon)) return mux } diff --git a/internal/api/v1/favicon.go b/internal/api/v1/favicon/favicon.go similarity index 96% rename from internal/api/v1/favicon.go rename to internal/api/v1/favicon/favicon.go index 5115213..d04c65b 100644 --- a/internal/api/v1/favicon.go +++ b/internal/api/v1/favicon/favicon.go @@ -1,4 +1,4 @@ -package v1 +package favicon import ( "bufio" @@ -20,6 +20,7 @@ import ( "github.com/yusing/go-proxy/internal/homepage" "github.com/yusing/go-proxy/internal/logging" gphttp "github.com/yusing/go-proxy/internal/net/http" + "github.com/yusing/go-proxy/internal/route/routes" route "github.com/yusing/go-proxy/internal/route/types" ) @@ -66,8 +67,8 @@ func GetFavIcon(w http.ResponseWriter, req *http.Request) { U.RespondError(w, U.ErrMissingKey("alias"), http.StatusBadRequest) return } - r := listRoute(alias) - if r == nil { + r, ok := routes.GetHTTPRoutes().Load(alias) + if !ok { http.NotFound(w, req) return } @@ -104,6 +105,12 @@ var ( iconCacheMu sync.RWMutex ) +func ResetIconCache(route route.HTTPRoute) { + iconCacheMu.Lock() + defer iconCacheMu.Unlock() + delete(iconCache, route.TargetName()) +} + func loadIconCache(key string) (icon []byte, ok bool) { iconCacheMu.RLock() icon, ok = iconCache[key] @@ -158,7 +165,6 @@ func sanitizeName(name string) string { } func findIcon(r route.HTTPRoute, req *http.Request, uri string) (icon []byte, status int, errMsg string) { - // FIXME: invalidate cache on route change key := r.TargetName() icon, ok := loadIconCache(key) if ok { diff --git a/internal/homepage/homepage.go b/internal/homepage/homepage.go index dc455de..5e54fc3 100644 --- a/internal/homepage/homepage.go +++ b/internal/homepage/homepage.go @@ -1,7 +1,5 @@ package homepage -import "strings" - type ( //nolint:recvcheck Config map[string]Category @@ -39,13 +37,6 @@ func (c *Config) Clear() { *c = make(Config) } -var cleanName = strings.NewReplacer( - " ", "-", - "_", "-", - "(", "", - ")", "", -) - func (c Config) Add(item *Item) { if c[item.Category] == nil { c[item.Category] = make(Category, 0) diff --git a/internal/route/http.go b/internal/route/http.go index ef8c100..054421f 100755 --- a/internal/route/http.go +++ b/internal/route/http.go @@ -4,6 +4,7 @@ import ( "net/http" "github.com/rs/zerolog" + "github.com/yusing/go-proxy/internal/api/v1/favicon" "github.com/yusing/go-proxy/internal/common" "github.com/yusing/go-proxy/internal/docker" "github.com/yusing/go-proxy/internal/docker/idlewatcher" @@ -160,6 +161,8 @@ func (r *HTTPRoute) Start(parent task.Parent) E.Error { if common.PrometheusEnabled { r.task.OnCancel("metrics_cleanup", r.rp.UnregisterMetrics) } + + r.task.OnCancel("reset_favicon", func() { favicon.ResetIconCache(r) }) return nil }