]> 127.0.0.1 Git - front/.git/commitdiff
1 v0.1.20240305012843
authorqydysky <qydysky@foxmail.com>
Tue, 5 Mar 2024 01:28:23 +0000 (09:28 +0800)
committerqydysky <qydysky@foxmail.com>
Tue, 5 Mar 2024 01:28:23 +0000 (09:28 +0800)
README.md
config.go
main.go

index 8870a66b59a363428a61ff551cfa6bd8a44a8c28..2738cd5623ac2d86874e683d98b3a03835940c6a 100755 (executable)
--- a/README.md
+++ b/README.md
     - 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在地址前
             - 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时将覆盖值。
index 37674ecdaffb53550d62a3a72fe22274ec96fee0..f51e9a80777a4ed38cfabf6385c025588c6c032c 100755 (executable)
--- 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 bdf875cb6737f3aba63ae74aaea59f20538de133..528dd2aa3e549502a1d372de37923ac5af3bc57b 100755 (executable)
--- 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)