37 lines
984 B
Go
37 lines
984 B
Go
package web
|
|
|
|
import (
|
|
"net/http"
|
|
"net/url"
|
|
)
|
|
|
|
// RelativeEndpoint takes a path component of URL and constructs a new URL using
|
|
// the host and port from the request combined the provided path.
|
|
func RelativeEndpoint(request *http.Request, endpoint string) string {
|
|
var result string
|
|
proto := "http"
|
|
host := request.Host
|
|
|
|
// If the request was received via TLS, use `https://` for the protocol
|
|
if request.TLS != nil {
|
|
proto = "https"
|
|
}
|
|
|
|
// Allow upstream proxies to specify the forwarded protocol. Allow this value
|
|
// to override our own guess.
|
|
if specifiedProto := request.Header.Get("X-Forwarded-Proto"); specifiedProto != "" {
|
|
proto = specifiedProto
|
|
}
|
|
|
|
// Default to "localhost" when no request.Host is provided. Otherwise requests
|
|
// with an empty `Host` produce results like `http:///acme/new-authz`
|
|
if request.Host == "" {
|
|
host = "localhost"
|
|
}
|
|
|
|
resultUrl := url.URL{Scheme: proto, Host: host, Path: endpoint}
|
|
result = resultUrl.String()
|
|
|
|
return result
|
|
}
|