- 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 具体处理哪个头
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...)
}
package dealer
type Dealer struct {
+ ReqUri []UriDealer `json:"reqUri"`
ReqHeader []HeaderDealer `json:"reqHeader"`
ResHeader []HeaderDealer `json:"resHeader"`
}
--- /dev/null
+package dealer
+
+type UriDealer struct {
+ Action string `json:"action"`
+ MatchExp string `json:"matchExp"`
+ Value string `json:"value"`
+}
"errors"
"fmt"
"io"
- "path"
"net/http"
"time"
_ "unsafe"
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
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)
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")
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)))