From: qydysky Date: Tue, 5 Mar 2024 01:28:23 +0000 (+0800) Subject: 1 X-Git-Tag: v0.1.20240305012843 X-Git-Url: http://127.0.0.1:8081/?a=commitdiff_plain;h=d24b3b3085847f433c64ebad4833e5ce097de505;p=front%2F.git 1 --- diff --git a/README.md b/README.md index 8870a66..2738cd5 100755 --- a/README.md +++ b/README.md @@ -22,20 +22,20 @@ - path: string 路径 - splicing: int 当客户端支持cookie时,将会固定使用后端多少秒 - pathAdd: bool 将客户端访问的路径附加在path上 例:/api/req => /ws => /ws/api/req - - matchHeader: [] 将会附加到每个backs,匹配客户端请求头,只有都匹配才使用此后端, 可以动态增加/删除 + - matchHeader: [] 将会在back前匹配,匹配客户端请求头,只有都匹配才使用此路由, 可以动态增加/删除 - key: string 要匹配的header名 - matchExp: string 要匹配的正则式 - value: string 要匹配的值 - - reqHeader: [] 将会附加到每个backs,请求后端时,请求头处理器, 可以动态增加/删除 - - action: string 可选check、add、del、set。 + - reqHeader: [] 将会附加到每个backs前,请求后端时,请求头处理器, 可以动态增加/删除 + - action: string 可选check、replace、add、del、set。 - key: string 具体处理哪个头 - - matchExp: string check时,如不匹配将结束请求。 - - value: string check时,如不匹配将结束请求。add时将附加值。set时将覆盖值。 - - resHeader: [] 将会附加到每个backs,返回后端的响应时,请求头处理器, 可以动态增加/删除 + - matchExp: string check时,如不匹配将结束请求。replace时结合value进行替换 + - value: string check时,如不匹配将结束请求。replace时结合matchExp进行替换。add时将附加值。set时将覆盖值。 + - resHeader: [] 将会附加到每个backs前,返回后端的响应时,请求头处理器, 可以动态增加/删除 - action: string 可选check、add、del、set。 - key: string 具体处理哪个头 - - matchExp: string check时,如不匹配将结束请求。 - - value: string check时,如不匹配将结束请求。add时将附加值。set时将覆盖值。 + - matchExp: string check时,如不匹配将结束请求。replace时结合value进行替换 + - value: string check时,如不匹配将结束请求。replace时结合matchExp进行替换。add时将附加值。set时将覆盖值。 - backs: [] 后端, 可以动态增加/删除 - name: string 后端名称,将在日志中显示 - to: string 后端地址,例"s://www.baidu.com",会根据客户端自动添加http or ws在地址前 @@ -45,13 +45,13 @@ - key: string 要匹配的header名 - matchExp: string 要匹配的正则式 - value: string 要匹配的值 - - reqHeader: [] 请求后端时,请求头处理器, 可以动态增加/删除 - - action: string 可选check、add、del、set。 + - reqHeader: [] 将会附加到每个backs前,请求后端时,请求头处理器, 可以动态增加/删除 + - action: string 可选check、replace、add、del、set。 - key: string 具体处理哪个头 - - matchExp: string check时,如不匹配将结束请求。 - - value: string check时,如不匹配将结束请求。add时将附加值。set时将覆盖值。 - - resHeader: [] 返回后端的响应时,请求头处理器, 可以动态增加/删除 + - matchExp: string check时,如不匹配将结束请求。replace时结合value进行替换 + - value: string check时,如不匹配将结束请求。replace时结合matchExp进行替换。add时将附加值。set时将覆盖值。 + - resHeader: [] 将会附加到每个backs前,返回后端的响应时,请求头处理器, 可以动态增加/删除 - action: string 可选check、add、del、set。 - key: string 具体处理哪个头 - - matchExp: string check时,如不匹配将结束请求。 - - value: string check时,如不匹配将结束请求。add时将附加值。set时将覆盖值。 + - matchExp: string check时,如不匹配将结束请求。replace时结合value进行替换 + - value: string check时,如不匹配将结束请求。replace时结合matchExp进行替换。add时将附加值。set时将覆盖值。 diff --git a/config.go b/config.go index 37674ec..f51e9a8 100755 --- a/config.go +++ b/config.go @@ -72,9 +72,17 @@ func (t *Config) Run(ctx context.Context, logger Logger) { ctx1, done1 := pctx.WaitCtx(ctx) defer done1() + if !Matched(route.MatchHeader, r) { + w.WriteHeader(http.StatusNotFound) + } + var backIs []*Back if t, e := r.Cookie("_psign_" + cookie); e == nil { if backP, ok := route.backMap.Load(t.Value); ok && backP.(*Back).IsLive() && Matched(backP.(*Back).MatchHeader, r) { + backP.(*Back).PathAdd = route.PathAdd + backP.(*Back).Splicing = route.Splicing + backP.(*Back).ReqHeader = append(route.ReqHeader, backP.(*Back).ReqHeader...) + backP.(*Back).ResHeader = append(route.ResHeader, backP.(*Back).ResHeader...) for i := 0; i < backP.(*Back).Weight; i++ { backIs = append(backIs, backP.(*Back)) } @@ -86,7 +94,7 @@ func (t *Config) Run(ctx context.Context, logger Logger) { } if len(backIs) == 0 { - w.WriteHeader(http.StatusServiceUnavailable) + w.WriteHeader(http.StatusNotFound) return } @@ -157,11 +165,6 @@ func (t *Config) SwapSign(add func(*Route), del func(*Route), logger Logger) { t.Routes[i].SwapSign( func(b *Back) { logger.Info(`I:`, "后端加载", t.Routes[i].Path, b.Name) - b.PathAdd = t.Routes[i].PathAdd - b.Splicing = t.Routes[i].Splicing - b.MatchHeader = append(b.MatchHeader, t.Routes[i].MatchHeader...) - b.ReqHeader = append(b.ReqHeader, t.Routes[i].ReqHeader...) - b.ResHeader = append(b.ResHeader, t.Routes[i].ResHeader...) t.Routes[i].backMap.Store(b.Id(), b) }, func(b *Back) { @@ -241,6 +244,10 @@ func (t *Route) FiliterBackByRequest(r *http.Request) []*Back { var backLink []*Back for i := 0; i < len(t.Backs); i++ { if t.Backs[i].IsLive() && Matched(t.Backs[i].MatchHeader, r) { + t.Backs[i].PathAdd = t.PathAdd + t.Backs[i].Splicing = t.Splicing + t.Backs[i].ReqHeader = append(t.ReqHeader, t.Backs[i].ReqHeader...) + t.Backs[i].ResHeader = append(t.ResHeader, t.Backs[i].ResHeader...) for k := 0; k < t.Backs[i].Weight; k++ { backLink = append(backLink, &t.Backs[i]) } diff --git a/main.go b/main.go index bdf875c..528dd2a 100755 --- a/main.go +++ b/main.go @@ -332,8 +332,8 @@ func copyHeader(s, t http.Header, app []Header) error { return ErrHeaderCheckFail } case `replace`: - if va := t.Get(v.Key); va != "" { - t.Set(v.Key, regexp.MustCompile(v.MatchExp).ReplaceAllString(va, v.Value)) + if va, ok := tm[v.Key]; ok && len(va) != 0 { + tm[v.Key][0] = regexp.MustCompile(v.MatchExp).ReplaceAllString(va[0], v.Value) } case `set`: t.Set(v.Key, v.Value)