]> 127.0.0.1 Git - front/.git/commitdiff
1 v0.1.20240806040859
authorqydysky <qydysky@foxmail.com>
Tue, 6 Aug 2024 04:06:18 +0000 (04:06 +0000)
committerGitHub <noreply@github.com>
Tue, 6 Aug 2024 04:06:18 +0000 (04:06 +0000)
README.md
config.go
dealer/dealer.go
dealer/uri.go [new file with mode: 0644]
http.go
main.go
ws.go

index 80da30a50f75d7bf4d1b0d13a6e9c5f52263999e..e06b17dad94c061af963d42de0d449e3d7b3cfc2 100755 (executable)
--- a/README.md
+++ b/README.md
@@ -71,6 +71,10 @@ setting:
                 - key: string header头
                 - matchExp: string
 - dealer:
+    - reqUri:[] 请求后端前,路径处理器
+        - action: string 可选`replace`。
+        - matchExp: string `replace`时结合value进行替换
+        - value: string `replace`时结合matchExp进行替换。
     - reqHeader:[] 请求后端前,请求头处理器
         - action: string 可选`replace`、`add`、`del`、`set`。
         - key: string 具体处理哪个头
index 211bc969b6317c2abeed60d0fbe36821c179d58a..8b210499ffce0a8ad50209f560159b02f225cc68 100755 (executable)
--- a/config.go
+++ b/config.go
@@ -357,6 +357,9 @@ func (t *Back) getFiliterResHeader() *filiter.Header {
                return &t.Filiter.ResHeader
        }
 }
+func (t *Back) getDealerReqUri() []dealer.UriDealer {
+       return append(t.route.Dealer.ReqUri, t.Dealer.ReqUri...)
+}
 func (t *Back) getDealerReqHeader() []dealer.HeaderDealer {
        return append(t.route.Dealer.ReqHeader, t.Dealer.ReqHeader...)
 }
index e6e02a7eb062c87abc0e3d288fc4d5c7a0df76f7..37c5a524c871aab741fe25c83f33913398634782 100644 (file)
@@ -1,6 +1,7 @@
 package dealer
 
 type Dealer struct {
+       ReqUri    []UriDealer    `json:"reqUri"`
        ReqHeader []HeaderDealer `json:"reqHeader"`
        ResHeader []HeaderDealer `json:"resHeader"`
 }
diff --git a/dealer/uri.go b/dealer/uri.go
new file mode 100644 (file)
index 0000000..461bc2f
--- /dev/null
@@ -0,0 +1,7 @@
+package dealer
+
+type UriDealer struct {
+       Action   string `json:"action"`
+       MatchExp string `json:"matchExp"`
+       Value    string `json:"value"`
+}
diff --git a/http.go b/http.go
index b5eddb2be11ab79fcb26734c46ccd87af2e152f1..b8ab00a5d7258c76ae5c82a8e45b0d2f02412dab 100644 (file)
--- a/http.go
+++ b/http.go
@@ -7,7 +7,6 @@ import (
        "errors"
        "fmt"
        "io"
-       "path"
        "net/http"
        "time"
        _ "unsafe"
@@ -32,11 +31,16 @@ func httpDealer(ctx context.Context, w http.ResponseWriter, r *http.Request, rou
 
                url := chosenBack.To
                if chosenBack.PathAdd() {
-                       url += path.Base(r.RequestURI)
+                       url += r.RequestURI
                }
 
                url = "http" + url
 
+               if e := dealUri(&url, chosenBack.getDealerReqUri()); e != nil {
+                       logger.Warn(`W:`, fmt.Sprintf(logFormat, r.RemoteAddr, chosenBack.route.config.Addr, routePath, chosenBack.Name, "BLOCK", e, time.Since(opT)))
+                       return ErrDealReqUri
+               }
+
                req, e := http.NewRequestWithContext(ctx, r.Method, url, r.Body)
                if e != nil {
                        return ErrReqCreFail
diff --git a/main.go b/main.go
index c2a37aa2ef3bb76b851457ebc1992415173a89e7..14e89c4cdf761d06866e57a3ac651f917126e4a2 100755 (executable)
--- a/main.go
+++ b/main.go
@@ -129,6 +129,17 @@ func loadConfig(ctx context.Context, buf []byte, configF File, configS *[]Config
        return md5k, nil
 }
 
+func dealUri(s *string, app []dealer.UriDealer) (e error) {
+       for _, v := range app {
+               switch v.Action {
+               case `replace`:
+                       *s = regexp.MustCompile(v.MatchExp).ReplaceAllString(*s, v.Value)
+               default:
+               }
+       }
+       return
+}
+
 func copyHeader(s, t http.Header, app []dealer.HeaderDealer) error {
        sm := (map[string][]string)(s)
        tm := (map[string][]string)(t)
@@ -186,6 +197,7 @@ var (
        ErrAllBacksFail    = errors.New("ErrAllBacksFail")
        ErrBackFail        = errors.New("ErrBackFail")
        ErrNoRoute         = errors.New("ErrNoRoute")
+       ErrDealReqUri      = errors.New("ErrDealReqUri")
        ErrDealReqHeader   = errors.New("ErrDealReqHeader")
        ErrDealResHeader   = errors.New("ErrDealResHeader")
        ErrCerVerify       = errors.New("ErrCerVerify")
diff --git a/ws.go b/ws.go
index e515acae63b9c5686557e63fbbececc7e96af03f..144e152fa144a86e2471fd40edeba51b97eaf884 100644 (file)
--- a/ws.go
+++ b/ws.go
@@ -53,6 +53,11 @@ func wsDealer(ctx context.Context, w http.ResponseWriter, r *http.Request, route
                        return ErrDealReqHeader
                }
 
+               if e := dealUri(&url, chosenBack.getDealerReqUri()); e != nil {
+                       logger.Warn(`W:`, fmt.Sprintf(errFormat, r.RemoteAddr, chosenBack.route.config.Addr, routePath, chosenBack.Name, e, time.Since(opT)))
+                       return ErrDealReqUri
+               }
+
                conn, resp, e = DialContext(ctx, url, reqHeader, chosenBack)
                if e != nil && !errors.Is(e, context.Canceled) {
                        logger.Warn(`W:`, fmt.Sprintf(errFormat, r.RemoteAddr, chosenBack.route.config.Addr, routePath, chosenBack.Name, e, time.Since(opT)))