Updated urlbuilder X-Forwarded-Host logic
According to the Apache mod_proxy docs, X-Forwarded-Host can be a comma-separated list of hosts, to which each proxy appends the requested host. We want to grab only the first from this comma-separated list to get the original requested Host when building URLs. Docker-DCO-1.1-Signed-off-by: Josh Hawn <josh.hawn@docker.com> (github: jlhawn)
This commit is contained in:
parent
ecdf1f6daa
commit
2c7489e6b2
2 changed files with 20 additions and 1 deletions
|
@ -62,7 +62,12 @@ func NewURLBuilderFromRequest(r *http.Request) *URLBuilder {
|
||||||
host := r.Host
|
host := r.Host
|
||||||
forwardedHost := r.Header.Get("X-Forwarded-Host")
|
forwardedHost := r.Header.Get("X-Forwarded-Host")
|
||||||
if len(forwardedHost) > 0 {
|
if len(forwardedHost) > 0 {
|
||||||
host = forwardedHost
|
// According to the Apache mod_proxy docs, X-Forwarded-Host can be a
|
||||||
|
// comma-separated list of hosts, to which each proxy appends the
|
||||||
|
// requested host. We want to grab the first from this comma-separated
|
||||||
|
// list.
|
||||||
|
hosts := strings.SplitN(forwardedHost, ",", 2)
|
||||||
|
host = strings.TrimSpace(hosts[0])
|
||||||
}
|
}
|
||||||
|
|
||||||
basePath := routeDescriptorsMap[RouteNameBase].Path
|
basePath := routeDescriptorsMap[RouteNameBase].Path
|
||||||
|
|
|
@ -151,6 +151,12 @@ func TestBuilderFromRequest(t *testing.T) {
|
||||||
forwardedProtoHeader := make(http.Header, 1)
|
forwardedProtoHeader := make(http.Header, 1)
|
||||||
forwardedProtoHeader.Set("X-Forwarded-Proto", "https")
|
forwardedProtoHeader.Set("X-Forwarded-Proto", "https")
|
||||||
|
|
||||||
|
forwardedHostHeader1 := make(http.Header, 1)
|
||||||
|
forwardedHostHeader1.Set("X-Forwarded-Host", "first.example.com")
|
||||||
|
|
||||||
|
forwardedHostHeader2 := make(http.Header, 1)
|
||||||
|
forwardedHostHeader2.Set("X-Forwarded-Host", "first.example.com, proxy1.example.com")
|
||||||
|
|
||||||
testRequests := []struct {
|
testRequests := []struct {
|
||||||
request *http.Request
|
request *http.Request
|
||||||
base string
|
base string
|
||||||
|
@ -163,6 +169,14 @@ func TestBuilderFromRequest(t *testing.T) {
|
||||||
request: &http.Request{URL: u, Host: u.Host, Header: forwardedProtoHeader},
|
request: &http.Request{URL: u, Host: u.Host, Header: forwardedProtoHeader},
|
||||||
base: "https://example.com",
|
base: "https://example.com",
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
request: &http.Request{URL: u, Host: u.Host, Header: forwardedHostHeader1},
|
||||||
|
base: "http://first.example.com",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
request: &http.Request{URL: u, Host: u.Host, Header: forwardedHostHeader2},
|
||||||
|
base: "http://first.example.com",
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, tr := range testRequests {
|
for _, tr := range testRequests {
|
||||||
|
|
Loading…
Reference in a new issue