fix: infinite loop in forwarded header middleware.
Co-authored-by: kevinpollet <pollet.kevin@gmail.com>
This commit is contained in:
parent
4cabea069d
commit
bf4a578bbb
2 changed files with 71 additions and 1 deletions
|
@ -104,9 +104,10 @@ func isWebsocketRequest(req *http.Request) bool {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
h = h[pos:]
|
h = h[pos+1:]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return containsHeader(connection, "upgrade") && containsHeader(upgrade, "websocket")
|
return containsHeader(connection, "upgrade") && containsHeader(upgrade, "websocket")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3,6 +3,7 @@ package forwardedheaders
|
||||||
import (
|
import (
|
||||||
"crypto/tls"
|
"crypto/tls"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
"net/http/httptest"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
|
@ -299,3 +300,71 @@ func TestServeHTTP(t *testing.T) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func Test_isWebsocketRequest(t *testing.T) {
|
||||||
|
testCases := []struct {
|
||||||
|
desc string
|
||||||
|
connectionHeader string
|
||||||
|
upgradeHeader string
|
||||||
|
assert assert.BoolAssertionFunc
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
desc: "connection Header multiple values middle",
|
||||||
|
connectionHeader: "foo,upgrade,bar",
|
||||||
|
upgradeHeader: "websocket",
|
||||||
|
assert: assert.True,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
desc: "connection Header multiple values end",
|
||||||
|
connectionHeader: "foo,bar,upgrade",
|
||||||
|
upgradeHeader: "websocket",
|
||||||
|
assert: assert.True,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
desc: "connection Header multiple values begin",
|
||||||
|
connectionHeader: "upgrade,foo,bar",
|
||||||
|
upgradeHeader: "websocket",
|
||||||
|
assert: assert.True,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
desc: "connection Header no upgrade",
|
||||||
|
connectionHeader: "foo,bar",
|
||||||
|
upgradeHeader: "websocket",
|
||||||
|
assert: assert.False,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
desc: "connection Header empty",
|
||||||
|
connectionHeader: "",
|
||||||
|
upgradeHeader: "websocket",
|
||||||
|
assert: assert.False,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
desc: "no header values",
|
||||||
|
connectionHeader: "foo,bar",
|
||||||
|
upgradeHeader: "foo,bar",
|
||||||
|
assert: assert.False,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
desc: "upgrade header multiple values",
|
||||||
|
connectionHeader: "upgrade",
|
||||||
|
upgradeHeader: "foo,bar,websocket",
|
||||||
|
assert: assert.True,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, test := range testCases {
|
||||||
|
test := test
|
||||||
|
t.Run(test.desc, func(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
req := httptest.NewRequest(http.MethodGet, "http://localhost", nil)
|
||||||
|
|
||||||
|
req.Header.Set(connection, test.connectionHeader)
|
||||||
|
req.Header.Set(upgrade, test.upgradeHeader)
|
||||||
|
|
||||||
|
ok := isWebsocketRequest(req)
|
||||||
|
|
||||||
|
test.assert(t, ok)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue