Remove hop-by-hop headers from forward auth response
This commit is contained in:
parent
ab2c98d931
commit
c2938ff138
2 changed files with 55 additions and 0 deletions
|
@ -73,6 +73,7 @@ func Forward(config *types.Forward, w http.ResponseWriter, r *http.Request, next
|
||||||
log.Debugf("Remote error %s. StatusCode: %d", config.Address, forwardResponse.StatusCode)
|
log.Debugf("Remote error %s. StatusCode: %d", config.Address, forwardResponse.StatusCode)
|
||||||
|
|
||||||
utils.CopyHeaders(w.Header(), forwardResponse.Header)
|
utils.CopyHeaders(w.Header(), forwardResponse.Header)
|
||||||
|
utils.RemoveHeaders(w.Header(), forward.HopHeaders...)
|
||||||
|
|
||||||
// Grab the location header, if any.
|
// Grab the location header, if any.
|
||||||
redirectURL, err := forwardResponse.Location()
|
redirectURL, err := forwardResponse.Location()
|
||||||
|
|
|
@ -13,6 +13,7 @@ import (
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
"github.com/urfave/negroni"
|
"github.com/urfave/negroni"
|
||||||
|
"github.com/vulcand/oxy/forward"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestForwardAuthFail(t *testing.T) {
|
func TestForwardAuthFail(t *testing.T) {
|
||||||
|
@ -122,6 +123,59 @@ func TestForwardAuthRedirect(t *testing.T) {
|
||||||
assert.NotEmpty(t, string(body), "there should be something in the body")
|
assert.NotEmpty(t, string(body), "there should be something in the body")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestForwardAuthRemoveHopByHopHeaders(t *testing.T) {
|
||||||
|
authTs := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
headers := w.Header()
|
||||||
|
for _, header := range forward.HopHeaders {
|
||||||
|
if header == forward.TransferEncoding {
|
||||||
|
headers.Add(header, "identity")
|
||||||
|
} else {
|
||||||
|
headers.Add(header, "test")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
http.Redirect(w, r, "http://example.com/redirect-test", http.StatusFound)
|
||||||
|
}))
|
||||||
|
defer authTs.Close()
|
||||||
|
|
||||||
|
authMiddleware, err := NewAuthenticator(&types.Auth{
|
||||||
|
Forward: &types.Forward{
|
||||||
|
Address: authTs.URL,
|
||||||
|
},
|
||||||
|
}, &tracing.Tracing{})
|
||||||
|
assert.NoError(t, err, "there should be no error")
|
||||||
|
|
||||||
|
handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
fmt.Fprintln(w, "traefik")
|
||||||
|
})
|
||||||
|
n := negroni.New(authMiddleware)
|
||||||
|
n.UseHandler(handler)
|
||||||
|
ts := httptest.NewServer(n)
|
||||||
|
defer ts.Close()
|
||||||
|
|
||||||
|
client := &http.Client{
|
||||||
|
CheckRedirect: func(r *http.Request, via []*http.Request) error {
|
||||||
|
return http.ErrUseLastResponse
|
||||||
|
},
|
||||||
|
}
|
||||||
|
req := testhelpers.MustNewRequest(http.MethodGet, ts.URL, nil)
|
||||||
|
res, err := client.Do(req)
|
||||||
|
assert.NoError(t, err, "there should be no error")
|
||||||
|
assert.Equal(t, http.StatusFound, res.StatusCode, "they should be equal")
|
||||||
|
|
||||||
|
for _, header := range forward.HopHeaders {
|
||||||
|
assert.Equal(t, "", res.Header.Get(header), "hop-by-hop header '%s' mustn't be set", header)
|
||||||
|
}
|
||||||
|
|
||||||
|
location, err := res.Location()
|
||||||
|
assert.NoError(t, err, "there should be no error")
|
||||||
|
assert.Equal(t, "http://example.com/redirect-test", location.String(), "they should be equal")
|
||||||
|
|
||||||
|
body, err := ioutil.ReadAll(res.Body)
|
||||||
|
assert.NoError(t, err, "there should be no error")
|
||||||
|
assert.NotEmpty(t, string(body), "there should be something in the body")
|
||||||
|
}
|
||||||
|
|
||||||
func TestForwardAuthFailResponseHeaders(t *testing.T) {
|
func TestForwardAuthFailResponseHeaders(t *testing.T) {
|
||||||
authTs := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
authTs := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||||
cookie := &http.Cookie{Name: "example", Value: "testing", Path: "/"}
|
cookie := &http.Cookie{Name: "example", Value: "testing", Path: "/"}
|
||||||
|
|
Loading…
Reference in a new issue