From c42937053c01ad1074cc6e70561e60a21d551579 Mon Sep 17 00:00:00 2001 From: qydysky Date: Tue, 6 Aug 2024 04:06:18 +0000 Subject: [PATCH] 1 --- README.md | 4 ++++ config.go | 3 +++ dealer/dealer.go | 1 + dealer/uri.go | 7 +++++++ http.go | 8 ++++++-- main.go | 12 ++++++++++++ ws.go | 5 +++++ 7 files changed, 38 insertions(+), 2 deletions(-) create mode 100644 dealer/uri.go diff --git a/README.md b/README.md index 80da30a..e06b17d 100755 --- 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 具体处理哪个头 diff --git a/config.go b/config.go index 211bc96..8b21049 100755 --- 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...) } diff --git a/dealer/dealer.go b/dealer/dealer.go index e6e02a7..37c5a52 100644 --- a/dealer/dealer.go +++ b/dealer/dealer.go @@ -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 index 0000000..461bc2f --- /dev/null +++ b/dealer/uri.go @@ -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 b5eddb2..b8ab00a 100644 --- 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 c2a37aa..14e89c4 100755 --- 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 e515aca..144e152 100644 --- 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))) -- 2.39.2