Ctrl K
ComunidadGuías…

pkg/prom/redirect.go

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
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
}