Skip to content

Commit

Permalink
Issue #122: Use local port for X-Forwarded-Port
Browse files Browse the repository at this point in the history
  • Loading branch information
magiconair committed Jun 30, 2016
1 parent b1be8fe commit d4f2e84
Show file tree
Hide file tree
Showing 2 changed files with 62 additions and 4 deletions.
19 changes: 17 additions & 2 deletions proxy/util.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import (
"log"
"net"
"net/http"
"strings"

"github.com/eBay/fabio/config"
"github.com/eBay/fabio/route"
Expand All @@ -19,7 +20,7 @@ import (
// * TLS connection: Set header with name from `cfg.TLSHeader` to `cfg.TLSHeaderValue`
//
func addHeaders(r *http.Request, cfg config.Proxy) error {
remoteIP, remotePort, err := net.SplitHostPort(r.RemoteAddr)
remoteIP, _, err := net.SplitHostPort(r.RemoteAddr)
if err != nil {
return errors.New("cannot parse " + r.RemoteAddr)
}
Expand Down Expand Up @@ -59,7 +60,7 @@ func addHeaders(r *http.Request, cfg config.Proxy) error {
}

if r.Header.Get("X-Forwarded-Port") == "" {
r.Header.Set("X-Forwarded-Port", remotePort)
r.Header.Set("X-Forwarded-Port", localPort(r))
}

fwd := r.Header.Get("Forwarded")
Expand Down Expand Up @@ -96,3 +97,17 @@ func target(r *http.Request) *route.Target {
}
return t
}

func localPort(r *http.Request) string {
if r == nil {
return ""
}
n := strings.Index(r.Host, ":")
if n > 0 && n < len(r.Host)-1 {
return r.Host[n+1:]
}
if r.TLS != nil {
return "443"
}
return "80"
}
47 changes: 45 additions & 2 deletions proxy/util_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -163,10 +163,31 @@ func TestAddHeaders(t *testing.T) {
"",
},

{"set X-Forwarded-Port",
{"set X-Forwarded-Port for HTTP",
&http.Request{RemoteAddr: "1.2.3.4:5555"},
config.Proxy{},
http.Header{"X-Forwarded-Port": {"5555"}},
http.Header{"X-Forwarded-Port": {"80"}},
"",
},

{"set X-Forwarded-Port for HTTPS",
&http.Request{RemoteAddr: "1.2.3.4:5555", TLS: &tls.ConnectionState{}},
config.Proxy{},
http.Header{"X-Forwarded-Port": {"443"}},
"",
},

{"set X-Forwarded-Port from Host",
&http.Request{RemoteAddr: "1.2.3.4:5555", Host: "5.6.7.8:1234"},
config.Proxy{},
http.Header{"X-Forwarded-Port": {"1234"}},
"",
},

{"set X-Forwarded-Port from Host for HTTPS",
&http.Request{RemoteAddr: "1.2.3.4:5555", Host: "5.6.7.8:1234", TLS: &tls.ConnectionState{}},
config.Proxy{},
http.Header{"X-Forwarded-Port": {"1234"}},
"",
},

Expand Down Expand Up @@ -217,3 +238,25 @@ func TestAddHeaders(t *testing.T) {
}
}
}

func TestLocalPort(t *testing.T) {
tests := []struct {
r *http.Request
port string
}{
{nil, ""},
{&http.Request{Host: ""}, "80"},
{&http.Request{Host: ":"}, "80"},
{&http.Request{Host: "1.2.3.4:5678"}, "5678"},
{&http.Request{Host: "1.2.3.4"}, "80"},
{&http.Request{Host: "1.2.3.4", TLS: &tls.ConnectionState{}}, "443"},
{&http.Request{Host: "1.2.3.4:"}, "80"},
{&http.Request{Host: "1.2.3.4:", TLS: &tls.ConnectionState{}}, "443"},
}

for i, tt := range tests {
if got, want := localPort(tt.r), tt.port; got != want {
t.Errorf("%d: got %q want %q", i, got, want)
}
}
}

0 comments on commit d4f2e84

Please sign in to comment.