]> 127.0.0.1 Git - front/.git/commitdiff
1 v0.1.20241009015120
authorqydysky <qydysky@foxmail.com>
Wed, 9 Oct 2024 01:49:16 +0000 (01:49 +0000)
committerGitHub <noreply@github.com>
Wed, 9 Oct 2024 01:49:16 +0000 (01:49 +0000)
config.go
http.go
local.go
main.go
ws.go

index 0e171bd977731a5cfd00f82d0594964ad6d56894..6b0cd58c7ca243d72f0c6ba11ae8ed7d4519566b 100755 (executable)
--- 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 fa4307da3c53860835a4bda356b9cf1e894dc9df..b3b880803efffa53af0f1efdb17a814404f4fa9d 100644 (file)
--- 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)
 
index 2e35bc26205de0a7ea58d69a4e3346bf37f3680e..e94f4e0fd8f475cabb8e28331440627007cc2536 100644 (file)
--- 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 82d461cf566cfcd1905347440d900c45e88607fe..a7ffa5d625d3e67294188d28d04d63a0b503d11c 100755 (executable)
--- 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 6891adc0d7797edf1269fbf5198b2ac2b9b4f461..2ddebcd294c0f5fed00b1a4ea090b2fbb82c7586 100644 (file)
--- 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()