pkg/prom/redirect.go
Rama main · réplica de lectura del repositorio original.
package prom
import (
"errors"
"net/http"
"github.com/skyhook-io/radar/pkg/urlutil"
)
// SameOriginRedirectClient copies a client, preserving its transport and stricter
// redirect policy while refusing redirects that could expose configured headers.
func SameOriginRedirectClient(client *http.Client) *http.Client {
guarded := *client
guarded.CheckRedirect = func(next *http.Request, via []*http.Request) error {
if len(via) >= 10 {
return errors.New("stopped after 10 redirects")
}
if len(via) == 0 {
return errors.New("redirect has no original request")
}
origin, ok := urlutil.NormalizeOrigin(via[0].URL.String())
check := func() error {
destination, valid := urlutil.NormalizeOrigin(next.URL.String())
if !ok || !valid || destination != origin {
return errors.New("cross-origin redirect refused: configure the final backend URL directly")
}
return nil
}
if err := check(); err != nil {
return err
}
if client.CheckRedirect != nil {
if err := client.CheckRedirect(next, via); err != nil {
return err
}
}
// A caller policy may rewrite the destination request.
return check()
}
return &guarded
}