context_test TestContextClientIP

This commit is contained in:
yiranzai 2021-04-21 10:05:59 +08:00
parent 16691a36ca
commit 936c45de44
2 changed files with 13 additions and 30 deletions

View File

@ -1392,14 +1392,10 @@ func TestContextAbortWithError(t *testing.T) {
assert.True(t, c.IsAborted()) assert.True(t, c.IsAborted())
} }
func resetTrustedCIDRs(c *Context) {
c.engine.trustedCIDRs, _ = c.engine.prepareTrustedCIDRs()
}
func TestContextClientIP(t *testing.T) { func TestContextClientIP(t *testing.T) {
c, _ := CreateTestContext(httptest.NewRecorder()) c, _ := CreateTestContext(httptest.NewRecorder())
c.Request, _ = http.NewRequest("POST", "/", nil) c.Request, _ = http.NewRequest("POST", "/", nil)
resetTrustedCIDRs(c) c.engine.trustedCIDRs, _ = c.engine.prepareTrustedCIDRs()
resetContextForClientIPTests(c) resetContextForClientIPTests(c)
// Legacy tests (validating that the defaults don't break the // Legacy tests (validating that the defaults don't break the
@ -1428,57 +1424,47 @@ func TestContextClientIP(t *testing.T) {
resetContextForClientIPTests(c) resetContextForClientIPTests(c)
// No trusted proxies // No trusted proxies
c.engine.TrustedProxies = []string{} _ = c.engine.SetTrustedProxies([]string{})
resetTrustedCIDRs(c)
c.engine.RemoteIPHeaders = []string{"X-Forwarded-For"} c.engine.RemoteIPHeaders = []string{"X-Forwarded-For"}
assert.Equal(t, "40.40.40.40", c.ClientIP()) assert.Equal(t, "40.40.40.40", c.ClientIP())
// Last proxy is trusted, but the RemoteAddr is not // Last proxy is trusted, but the RemoteAddr is not
c.engine.TrustedProxies = []string{"30.30.30.30"} _ = c.engine.SetTrustedProxies([]string{"30.30.30.30"})
resetTrustedCIDRs(c)
assert.Equal(t, "40.40.40.40", c.ClientIP()) assert.Equal(t, "40.40.40.40", c.ClientIP())
// Only trust RemoteAddr // Only trust RemoteAddr
c.engine.TrustedProxies = []string{"40.40.40.40"} _ = c.engine.SetTrustedProxies([]string{"40.40.40.40"})
resetTrustedCIDRs(c)
assert.Equal(t, "20.20.20.20", c.ClientIP()) assert.Equal(t, "20.20.20.20", c.ClientIP())
// All steps are trusted // All steps are trusted
c.engine.TrustedProxies = []string{"40.40.40.40", "30.30.30.30", "20.20.20.20"} _ = c.engine.SetTrustedProxies([]string{"40.40.40.40", "30.30.30.30", "20.20.20.20"})
resetTrustedCIDRs(c)
assert.Equal(t, "20.20.20.20", c.ClientIP()) assert.Equal(t, "20.20.20.20", c.ClientIP())
// Use CIDR // Use CIDR
c.engine.TrustedProxies = []string{"40.40.25.25/16", "30.30.30.30"} _ = c.engine.SetTrustedProxies([]string{"40.40.25.25/16", "30.30.30.30"})
resetTrustedCIDRs(c)
assert.Equal(t, "20.20.20.20", c.ClientIP()) assert.Equal(t, "20.20.20.20", c.ClientIP())
// Use hostname that resolves to all the proxies // Use hostname that resolves to all the proxies
c.engine.TrustedProxies = []string{"foo"} _ = c.engine.SetTrustedProxies([]string{"foo"})
resetTrustedCIDRs(c)
assert.Equal(t, "40.40.40.40", c.ClientIP()) assert.Equal(t, "40.40.40.40", c.ClientIP())
// Use hostname that returns an error // Use hostname that returns an error
c.engine.TrustedProxies = []string{"bar"} _ = c.engine.SetTrustedProxies([]string{"bar"})
resetTrustedCIDRs(c)
assert.Equal(t, "40.40.40.40", c.ClientIP()) assert.Equal(t, "40.40.40.40", c.ClientIP())
// X-Forwarded-For has a non-IP element // X-Forwarded-For has a non-IP element
c.engine.TrustedProxies = []string{"40.40.40.40"} _ = c.engine.SetTrustedProxies([]string{"40.40.40.40"})
resetTrustedCIDRs(c)
c.Request.Header.Set("X-Forwarded-For", " blah ") c.Request.Header.Set("X-Forwarded-For", " blah ")
assert.Equal(t, "40.40.40.40", c.ClientIP()) assert.Equal(t, "40.40.40.40", c.ClientIP())
// Result from LookupHost has non-IP element. This should never // Result from LookupHost has non-IP element. This should never
// happen, but we should test it to make sure we handle it // happen, but we should test it to make sure we handle it
// gracefully. // gracefully.
c.engine.TrustedProxies = []string{"baz"} _ = c.engine.SetTrustedProxies([]string{"baz"})
resetTrustedCIDRs(c)
c.Request.Header.Set("X-Forwarded-For", " 30.30.30.30 ") c.Request.Header.Set("X-Forwarded-For", " 30.30.30.30 ")
assert.Equal(t, "40.40.40.40", c.ClientIP()) assert.Equal(t, "40.40.40.40", c.ClientIP())
c.engine.TrustedProxies = []string{"40.40.40.40"} _ = c.engine.SetTrustedProxies([]string{"40.40.40.40"})
resetTrustedCIDRs(c)
c.Request.Header.Del("X-Forwarded-For") c.Request.Header.Del("X-Forwarded-For")
c.engine.RemoteIPHeaders = []string{"X-Forwarded-For", "X-Real-IP"} c.engine.RemoteIPHeaders = []string{"X-Forwarded-For", "X-Real-IP"}
assert.Equal(t, "10.10.10.10", c.ClientIP()) assert.Equal(t, "10.10.10.10", c.ClientIP())

7
gin.go
View File

@ -368,7 +368,7 @@ func (engine *Engine) prepareTrustedCIDRs() ([]*net.IPNet, error) {
// SetTrustedProxies set Engine.TrustedProxies // SetTrustedProxies set Engine.TrustedProxies
func (engine *Engine) SetTrustedProxies(trustedProxies []string) error { func (engine *Engine) SetTrustedProxies(trustedProxies []string) error {
engine.ForwardedByClientIP = true //engine.ForwardedByClientIP = true
engine.TrustedProxies = trustedProxies engine.TrustedProxies = trustedProxies
return engine.parseTrustedProxies() return engine.parseTrustedProxies()
} }
@ -376,11 +376,8 @@ func (engine *Engine) SetTrustedProxies(trustedProxies []string) error {
// parseTrustedProxies parse Engine.TrustedProxies to Engine.trustedCIDRs // parseTrustedProxies parse Engine.TrustedProxies to Engine.trustedCIDRs
func (engine *Engine) parseTrustedProxies() error { func (engine *Engine) parseTrustedProxies() error {
trustedCIDRs, err := engine.prepareTrustedCIDRs() trustedCIDRs, err := engine.prepareTrustedCIDRs()
if err != nil {
return err
}
engine.trustedCIDRs = trustedCIDRs engine.trustedCIDRs = trustedCIDRs
return nil return err
} }
// parseIP parse a string representation of an IP and returns a net.IP with the // parseIP parse a string representation of an IP and returns a net.IP with the