From: qydysky Date: Wed, 9 Oct 2024 01:49:16 +0000 (+0000) Subject: 1 X-Git-Tag: v0.1.20241009015120 X-Git-Url: http://127.0.0.1:8081/?a=commitdiff_plain;h=8537363ec4214c5da9debb90ea0ead76f3d9c31f;p=front%2F.git 1 --- diff --git a/config.go b/config.go index 0e171bd..6b0cd58 100755 --- a/config.go +++ b/config.go @@ -168,7 +168,7 @@ func (t *Config) SwapSign(ctx context.Context, logger Logger) { Deal(ctx context.Context, w http.ResponseWriter, r *http.Request, routePath string, chosenBack *Back, logger Logger, blocksi pslice.BlocksI[byte]) error } - for i := 0; i < len(backIs) && errors.Is(e, ErrAllBacksFail); i++ { + for i := 0; i < len(backIs); i++ { if !backIs[i].IsLive() { continue } @@ -180,6 +180,16 @@ func (t *Config) SwapSign(ctx context.Context, logger Logger) { } else { e = component2.Get[reqDealer]("http").Deal(r.Context(), w, r, routePath, backIs[i], logger, t.BlocksI) } + + // no err + if e == nil { + break + } + + // some err can retry + if v, ok := e.(ErrCanRetry); !ok || !v.CanRetry { + break + } } if e != nil { @@ -228,6 +238,18 @@ func (t *Config) SwapSign(ctx context.Context, logger Logger) { } } +type ErrCanRetry struct { + error + CanRetry bool +} + +func MarkRetry(e error) error { + return ErrCanRetry{ + error: e, + CanRetry: true, + } +} + type Route struct { config *Config `json:"-"` Path []string `json:"path"` diff --git a/http.go b/http.go index fa4307d..b3b8808 100644 --- a/http.go +++ b/http.go @@ -47,13 +47,15 @@ func (httpDealer) Deal(ctx context.Context, w http.ResponseWriter, r *http.Reque if e != nil { logger.Warn(`W:`, fmt.Sprintf(logFormat, r.RemoteAddr, chosenBack.route.config.Addr, routePath, chosenBack.Name, "Err", e, time.Since(opT))) chosenBack.Disable() - return ErrReqCreFail + return MarkRetry(ErrReqCreFail) } - if e := copyHeader(r.Header, req.Header, chosenBack.getDealerReqHeader()); e != nil { - logger.Warn(`W:`, fmt.Sprintf(logFormat, r.RemoteAddr, chosenBack.route.config.Addr, routePath, chosenBack.Name, "BLOCK", e, time.Since(opT))) - return ErrDealReqHeader - } + // if e := + copyHeader(r.Header, req.Header, chosenBack.getDealerReqHeader()) + // ; e != nil { + // logger.Warn(`W:`, fmt.Sprintf(logFormat, r.RemoteAddr, chosenBack.route.config.Addr, routePath, chosenBack.Name, "BLOCK", e, time.Since(opT))) + // return ErrDealReqHeader + // } customTransport := http.DefaultTransport.(*http.Transport).Clone() @@ -94,7 +96,7 @@ func (httpDealer) Deal(ctx context.Context, w http.ResponseWriter, r *http.Reque if e != nil && !errors.Is(e, ErrRedirect) && !errors.Is(e, context.Canceled) { logger.Warn(`W:`, fmt.Sprintf(logFormat, r.RemoteAddr, chosenBack.route.config.Addr, routePath, chosenBack.Name, "Err", e, time.Since(opT))) chosenBack.Disable() - return ErrResFail + return MarkRetry(ErrResFail) } if chosenBack.getErrToSec() != 0 && time.Since(opT).Seconds() > chosenBack.getErrToSec() { @@ -103,7 +105,7 @@ func (httpDealer) Deal(ctx context.Context, w http.ResponseWriter, r *http.Reque } if resp == nil { - return ErrResFail + return MarkRetry(ErrResFail) } if ok, e := chosenBack.getFiliterResHeader().Match(resp.Header); e != nil { @@ -111,7 +113,7 @@ func (httpDealer) Deal(ctx context.Context, w http.ResponseWriter, r *http.Reque } else if !ok { logger.Warn(`W:`, fmt.Sprintf(logFormat, r.RemoteAddr, chosenBack.route.config.Addr, routePath, chosenBack.Name, "BLOCK", ErrHeaderCheckFail, time.Since(opT))) w.Header().Add(header+"Error", ErrHeaderCheckFail.Error()) - return ErrHeaderCheckFail + return MarkRetry(ErrHeaderCheckFail) } logger.Debug(`T:`, fmt.Sprintf(logFormat, r.RemoteAddr, chosenBack.route.config.Addr, routePath, chosenBack.Name, r.Method, r.RequestURI, time.Since(opT))) @@ -136,10 +138,12 @@ func (httpDealer) Deal(ctx context.Context, w http.ResponseWriter, r *http.Reque w.Header().Add(header+"Info", cookie+";"+chosenBack.Name) - if e := copyHeader(resp.Header, w.Header(), chosenBack.getDealerResHeader()); e != nil { - logger.Warn(`W:`, fmt.Sprintf(logFormat, r.RemoteAddr, chosenBack.route.config.Addr, routePath, chosenBack.Name, "BLOCK", e, time.Since(opT))) - return ErrDealResHeader - } + // if e := + copyHeader(resp.Header, w.Header(), chosenBack.getDealerResHeader()) + // ; e != nil { + // logger.Warn(`W:`, fmt.Sprintf(logFormat, r.RemoteAddr, chosenBack.route.config.Addr, routePath, chosenBack.Name, "BLOCK", e, time.Since(opT))) + // return ErrDealResHeader + // } w.WriteHeader(resp.StatusCode) diff --git a/local.go b/local.go index 2e35bc2..e94f4e0 100644 --- a/local.go +++ b/local.go @@ -5,6 +5,7 @@ import ( "fmt" "net/http" "net/url" + "os" "time" _ "unsafe" @@ -33,7 +34,7 @@ func (localDealer) Deal(ctx context.Context, w http.ResponseWriter, r *http.Requ path := chosenBack.To if chosenBack.PathAdd() { if s, e := url.PathUnescape(r.URL.Path); e != nil { - logger.Warn(`W:`, fmt.Sprintf(logFormat, r.RemoteAddr, chosenBack.route.config.Addr, routePath, chosenBack.Name, "BLOCK", e, time.Since(opT))) + logger.Warn(`W:`, fmt.Sprintf(logFormat, r.RemoteAddr, chosenBack.route.config.Addr, routePath, chosenBack.Name, "Err", e, time.Since(opT))) return ErrDealReqUri } else { path += s @@ -41,13 +42,15 @@ func (localDealer) Deal(ctx context.Context, w http.ResponseWriter, r *http.Requ } if !pfile.New(path, 0, true).IsExist() { - return ErrReqDoFail + return MarkRetry(os.ErrNotExist) } - if e := copyHeader(http.Header{}, w.Header(), chosenBack.getDealerResHeader()); e != nil { - logger.Warn(`W:`, fmt.Sprintf(logFormat, r.RemoteAddr, chosenBack.route.config.Addr, routePath, chosenBack.Name, "BLOCK", e, time.Since(opT))) - return ErrDealResHeader - } + // if e := + copyHeader(http.Header{}, w.Header(), chosenBack.getDealerResHeader()) + // ; e != nil { + // logger.Warn(`W:`, fmt.Sprintf(logFormat, r.RemoteAddr, chosenBack.route.config.Addr, routePath, chosenBack.Name, "BLOCK", e, time.Since(opT))) + // return ErrDealResHeader + // } logger.Debug(`T:`, fmt.Sprintf(logFormat, r.RemoteAddr, chosenBack.route.config.Addr, routePath, chosenBack.Name, r.Method, r.RequestURI, time.Since(opT))) diff --git a/main.go b/main.go index 82d461c..a7ffa5d 100755 --- a/main.go +++ b/main.go @@ -139,7 +139,7 @@ func dealUri(s string, app []dealer.UriDealer) (t string) { return } -func copyHeader(s, t http.Header, app []dealer.HeaderDealer) error { +func copyHeader(s, t http.Header, app []dealer.HeaderDealer) { sm := (map[string][]string)(s) tm := (map[string][]string)(t) for k, v := range sm { @@ -174,7 +174,6 @@ func copyHeader(s, t http.Header, app []dealer.HeaderDealer) error { default: } } - return nil } var cookie = fmt.Sprintf("%p", &struct{}{}) diff --git a/ws.go b/ws.go index 6891adc..2ddebcd 100644 --- a/ws.go +++ b/ws.go @@ -61,17 +61,19 @@ func (wsDealer) Deal(ctx context.Context, w http.ResponseWriter, r *http.Request reqHeader := make(http.Header) - if e := copyHeader(r.Header, reqHeader, chosenBack.getDealerReqHeader()); e != nil { - logger.Warn(`W:`, fmt.Sprintf(errFormat, r.RemoteAddr, chosenBack.route.config.Addr, routePath, chosenBack.Name, e, time.Since(opT))) - return ErrDealReqHeader - } + // if e := + copyHeader(r.Header, reqHeader, chosenBack.getDealerReqHeader()) + // ; e != nil { + // logger.Warn(`W:`, fmt.Sprintf(errFormat, r.RemoteAddr, chosenBack.route.config.Addr, routePath, chosenBack.Name, e, time.Since(opT))) + // return ErrDealReqHeader + // } var e error 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))) chosenBack.Disable() - return ErrResFail + return MarkRetry(ErrResFail) } if chosenBack.getErrToSec() != 0 && time.Since(opT).Seconds() > chosenBack.getErrToSec() { @@ -81,7 +83,7 @@ func (wsDealer) Deal(ctx context.Context, w http.ResponseWriter, r *http.Request // } if conn == nil || resp == nil { - return ErrResFail + return MarkRetry(ErrResFail) } if pctx.Done(r.Context()) { @@ -93,7 +95,7 @@ func (wsDealer) Deal(ctx context.Context, w http.ResponseWriter, r *http.Request } else if !ok { logger.Warn(`W:`, fmt.Sprintf(errFormat, r.RemoteAddr, chosenBack.route.config.Addr, routePath, chosenBack.Name, ErrHeaderCheckFail, time.Since(opT))) w.Header().Add(header+"Error", ErrHeaderCheckFail.Error()) - return ErrHeaderCheckFail + return MarkRetry(ErrHeaderCheckFail) } logger.Debug(`T:`, fmt.Sprintf("%v > %v > %v ws ok %v", chosenBack.route.config.Addr, routePath, chosenBack.Name, time.Since(opT))) @@ -121,13 +123,15 @@ func (wsDealer) Deal(ctx context.Context, w http.ResponseWriter, r *http.Request defer conn.Close() resHeader := make(http.Header) - if e := copyHeader(resp.Header, resHeader, chosenBack.getDealerResHeader()); e != nil { - logger.Warn(`W:`, fmt.Sprintf(errFormat, r.RemoteAddr, chosenBack.route.config.Addr, routePath, chosenBack.Name, e, time.Since(opT))) - return ErrDealResHeader - } + // if e := + copyHeader(resp.Header, resHeader, chosenBack.getDealerResHeader()) + // ; e != nil { + // logger.Warn(`W:`, fmt.Sprintf(errFormat, r.RemoteAddr, chosenBack.route.config.Addr, routePath, chosenBack.Name, e, time.Since(opT))) + // return ErrDealResHeader + // } if req, e := Upgrade(w, r, resHeader); e != nil { - return ErrResDoFail + return MarkRetry(ErrResDoFail) } else { defer req.Close()