fix(server): include path prefix in legacy API calls (#615) (#618)

Resolves 404 errors by correctly routing legacy requests when a path
prefix is configured.
This commit is contained in:
LDwise 2026-01-24 17:43:28 +08:00 committed by GitHub
parent 7624bbb6c1
commit 76051c47d9
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 12 additions and 6 deletions

View file

@ -8,6 +8,7 @@ import (
"net" "net"
"net/http" "net/http"
"net/url" "net/url"
"path"
"strings" "strings"
"time" "time"
@ -41,17 +42,19 @@ var (
type LegacyHandler struct { type LegacyHandler struct {
logger zerolog.Logger logger zerolog.Logger
serverAddr string serverAddr string
pathPrefix string
bannedIPs map[string]struct{} bannedIPs map[string]struct{}
sessionIPs map[string]string sessionIPs map[string]string
wsDialer *websocket.Dialer wsDialer *websocket.Dialer
} }
func New(serverAddr string) *LegacyHandler { func New(serverAddr, pathPrefix string) *LegacyHandler {
// Init // Init
return &LegacyHandler{ return &LegacyHandler{
logger: log.With().Str("module", "legacy").Logger(), logger: log.With().Str("module", "legacy").Logger(),
serverAddr: serverAddr, serverAddr: serverAddr,
pathPrefix: pathPrefix,
bannedIPs: make(map[string]struct{}), bannedIPs: make(map[string]struct{}),
sessionIPs: make(map[string]string), sessionIPs: make(map[string]string),
wsDialer: &websocket.Dialer{ wsDialer: &websocket.Dialer{
@ -102,7 +105,7 @@ func (h *LegacyHandler) Route(r types.Router) {
defer s.destroy() defer s.destroy()
// dial to the remote backend // dial to the remote backend
connBackend, _, err := h.wsDialer.Dial("ws://"+h.serverAddr+"/api/ws?token="+url.QueryEscape(s.token), nil) connBackend, _, err := h.wsDialer.Dial("ws://"+h.serverAddr+path.Join(s.pathPrefix, "/api/ws")+"?token="+url.QueryEscape(s.token), nil)
if err != nil { if err != nil {
h.logger.Error().Err(err).Msg("couldn't dial to the remote backend") h.logger.Error().Err(err).Msg("couldn't dial to the remote backend")

View file

@ -6,6 +6,7 @@ import (
"fmt" "fmt"
"io" "io"
"net/http" "net/http"
"path"
"strings" "strings"
"sync" "sync"
@ -35,6 +36,7 @@ type session struct {
logger zerolog.Logger logger zerolog.Logger
serverAddr string serverAddr string
pathPrefix string
id, ip string id, ip string
token string token string
@ -63,6 +65,7 @@ func (h *LegacyHandler) newSession(r *http.Request) *session {
h: h, h: h,
logger: h.logger, logger: h.logger,
serverAddr: h.serverAddr, serverAddr: h.serverAddr,
pathPrefix: h.pathPrefix,
client: &http.Client{ client: &http.Client{
Transport: transport, Transport: transport,
}, },
@ -70,8 +73,8 @@ func (h *LegacyHandler) newSession(r *http.Request) *session {
} }
} }
func (s *session) req(method, path string, headers http.Header, request io.Reader) (io.ReadCloser, http.Header, error) { func (s *session) req(method, reqPath string, headers http.Header, request io.Reader) (io.ReadCloser, http.Header, error) {
req, err := http.NewRequest(method, "http://"+s.serverAddr+path, request) req, err := http.NewRequest(method, "http://"+s.serverAddr+path.Join(s.pathPrefix, reqPath), request)
if err != nil { if err != nil {
return nil, nil, err return nil, nil, err
} }

View file

@ -134,7 +134,7 @@ func (manager *HttpManagerCtx) Start() {
}() }()
manager.logger.Info().Msgf("legacy proxy listening on %s", listener.Addr().String()) manager.logger.Info().Msgf("legacy proxy listening on %s", listener.Addr().String())
legacy.New(listener.Addr().String()).Route(manager.router) legacy.New(listener.Addr().String(), manager.config.PathPrefix).Route(manager.router)
} }
} else { } else {
go func() { go func() {
@ -146,7 +146,7 @@ func (manager *HttpManagerCtx) Start() {
// start legacy proxy if enabled // start legacy proxy if enabled
if viper.GetBool("legacy") { if viper.GetBool("legacy") {
legacy.New(manager.http.Addr).Route(manager.router) legacy.New(manager.http.Addr, manager.config.PathPrefix).Route(manager.router)
} }
} }
} }