pomerium/internal/httputil/proxy.go
Bobby DeSimone d3d60d1055 all: support route scoped sessions
Signed-off-by: Bobby DeSimone <bobbydesimone@gmail.com>
2019-11-06 17:54:15 -08:00

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
}