Resolves 404 errors by correctly routing legacy requests when a path prefix is configured.
This commit is contained in:
parent
7624bbb6c1
commit
76051c47d9
3 changed files with 12 additions and 6 deletions
|
|
@ -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")
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue