From 55e2c38cd8d7adca26c608b19cde1a3baf007a30 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E7=A5=A5=E8=B6=85?= Date: Sun, 17 Sep 2023 19:14:28 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AE=BF=E5=AE=A2IP=E8=AE=BE=E7=BD=AE=E4=B8=AD?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E5=A4=9A=E4=B8=AA=E8=AF=B7=E6=B1=82=E6=8A=A5?= =?UTF-8?q?=E5=A4=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/serverconfigs/http_remote_addr_config.go | 34 ++++++++++++++++++- .../http_remote_addr_config_test.go | 13 ++++++- 2 files changed, 45 insertions(+), 2 deletions(-) diff --git a/pkg/serverconfigs/http_remote_addr_config.go b/pkg/serverconfigs/http_remote_addr_config.go index 54f93d5..a3ba1de 100644 --- a/pkg/serverconfigs/http_remote_addr_config.go +++ b/pkg/serverconfigs/http_remote_addr_config.go @@ -25,18 +25,40 @@ type HTTPRemoteAddrConfig struct { RequestHeaderName string `yaml:"requestHeaderName" json:"requestHeaderName"` // 请求报头名称(type = requestHeader时生效) - isEmpty bool + isEmpty bool + values []string + hasValues bool } // Init 初始化 func (this *HTTPRemoteAddrConfig) Init() error { this.Value = strings.TrimSpace(this.Value) + this.isEmpty = false if len(this.Value) == 0 { this.isEmpty = true } else if regexp.MustCompile(`\s+`).ReplaceAllString(this.Value, "") == "${remoteAddr}" { this.isEmpty = true } + // values + this.values = []string{} + var headerVarReg = regexp.MustCompile(`(\$\{header\.)([\w-,]+)(})`) + if headerVarReg.MatchString(this.Value) { + var subMatches = headerVarReg.FindStringSubmatch(this.Value) + if len(subMatches) > 3 { + var prefix = subMatches[1] + var headerNamesString = subMatches[2] + var suffix = subMatches[3] + for _, headerName := range strings.Split(headerNamesString, ",") { + headerName = strings.TrimSpace(headerName) + if len(headerName) > 0 { + this.values = append(this.values, prefix+headerName+suffix) + } + } + } + } + this.hasValues = len(this.values) > 1 // MUST be 1, not 0 + return nil } @@ -44,3 +66,13 @@ func (this *HTTPRemoteAddrConfig) Init() error { func (this *HTTPRemoteAddrConfig) IsEmpty() bool { return this.isEmpty } + +// Values 可能的值变量 +func (this *HTTPRemoteAddrConfig) Values() []string { + return this.values +} + +// HasValues 检查是否有一组值 +func (this *HTTPRemoteAddrConfig) HasValues() bool { + return this.hasValues +} diff --git a/pkg/serverconfigs/http_remote_addr_config_test.go b/pkg/serverconfigs/http_remote_addr_config_test.go index f9f61dc..a46f607 100644 --- a/pkg/serverconfigs/http_remote_addr_config_test.go +++ b/pkg/serverconfigs/http_remote_addr_config_test.go @@ -8,7 +8,7 @@ import ( ) func TestHTTPRemoteAddrConfig_IsEmpty(t *testing.T) { - a := assert.NewAssertion(t) + var a = assert.NewAssertion(t) { var config = &HTTPRemoteAddrConfig{} @@ -52,3 +52,14 @@ func TestHTTPRemoteAddrConfig_IsEmpty(t *testing.T) { a.IsFalse(config.IsEmpty()) } } + +func TestHTTPRemoteAddrConfig_Values(t *testing.T) { + for _, value := range []string{"${remoteAddr}", "${header.x-real-ip}", "${header.x-client-ip,x-real-ip,x-forwarded-for}"} { + var config = &HTTPRemoteAddrConfig{Value: value} + err := config.Init() + if err != nil { + t.Fatal(err) + } + t.Log(value, "=>", config.Values()) + } +}