mirror of
https://github.com/pomerium/pomerium.git
synced 2025-05-02 03:46:29 +02:00
31 lines
1.1 KiB
Go
31 lines
1.1 KiB
Go
package httputil // import "github.com/pomerium/pomerium/internal/httputil"
|
|
|
|
import (
|
|
stdlog "log"
|
|
"net/http"
|
|
"net/http/httputil"
|
|
"net/url"
|
|
|
|
"github.com/pomerium/pomerium/internal/log"
|
|
)
|
|
|
|
// HeaderForwardHost is the header key that identifies the original host requested
|
|
// by the client in the Host HTTP request header.
|
|
// https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Forwarded-Host
|
|
const HeaderForwardHost = "X-Forwarded-Host"
|
|
|
|
// NewReverseProxy returns a new ReverseProxy that routes
|
|
// URLs to the scheme, host, and base path provided in target,
|
|
// rewrites the Host header, and sets `X-Forwarded-Host`.
|
|
func NewReverseProxy(target *url.URL) *httputil.ReverseProxy {
|
|
reverseProxy := httputil.NewSingleHostReverseProxy(target)
|
|
sublogger := log.With().Str("reverse-proxy", target.Host).Logger()
|
|
reverseProxy.ErrorLog = stdlog.New(&log.StdLogWrapper{Logger: &sublogger}, "", 0)
|
|
director := reverseProxy.Director
|
|
reverseProxy.Director = func(req *http.Request) {
|
|
req.Header.Add(HeaderForwardHost, req.Host)
|
|
director(req)
|
|
req.Host = target.Host
|
|
}
|
|
return reverseProxy
|
|
}
|