From d4f188a91959c68bf9494e74ea7e54bd6c196550 Mon Sep 17 00:00:00 2001 From: qydysky Date: Thu, 17 Apr 2025 07:20:52 +0000 Subject: [PATCH] 1 --- README.md | 2 +- config.go | 18 ++++++++++------- config_test.go | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 64 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 3807337..9b9afa5 100755 --- a/README.md +++ b/README.md @@ -76,7 +76,7 @@ config: - *matchRule*: string 匹配规则,默认`prefix`。 `prefix`:当未匹配到时,返回最近的/匹配, `all`:当未匹配到时,返回404 - reqIdLoop: uint 请求id环大小,用于日志识别请求,默认`1000` - *copyBlocks*: int 转发的块数量,默认`1000` -- *retryBlocks*: {} 重试, 当停用时,分配仅进行一次。当所有块都在使用中时,跳过。当请求没有`Content-Length`时,跳过。 +- *retryBlocks*: {} 重试, 当停用时,不进行重试。其他情况:1.当所有块都在使用中时,不进行重试。2.当请求没有`Content-Length`时,将会重试。 - *size*: string 重试的块大小,默认`1M` - *num*: int 重试的块数量,默认`0`,为`0`时停用重试 - *tls*: {} 启用tls, 默认空 diff --git a/config.go b/config.go index b73c637..5ad0106 100755 --- a/config.go +++ b/config.go @@ -252,14 +252,15 @@ func (t *Config) SwapSign(ctx context.Context, logger Logger) { // repack var ( - reqBuf []byte - reqBufUsed bool - reqAllRead bool - delayBody io.ReadCloser + reqBuf []byte + reqBufUsed bool + reqAllRead bool + reqContentLength string = r.Header.Get("Content-Length") + delayBody io.ReadCloser ) if t.RetryBlocksI != nil && r.Body != nil { - if contentLength := r.Header.Get("Content-Length"); contentLength != "" { - if n, e := strconv.Atoi(contentLength); e == nil && n < t.RetryBlocks.size { + if reqContentLength != "" { + if n, e := strconv.Atoi(reqContentLength); e == nil && n < t.RetryBlocks.size { var putBack func() var e error reqBuf, putBack, e = t.RetryBlocksI.Get() @@ -335,9 +336,12 @@ func (t *Config) SwapSign(ctx context.Context, logger Logger) { break } - if v, ok := e.(ErrCanRetry); !reqBufUsed || !ok || !v.CanRetry { + if v, ok := e.(ErrCanRetry); !ok || !v.CanRetry { // some err can't retry break + } else if reqContentLength != "" && !reqBufUsed { + // has body but buf no allow reuse + break } logger.Debug(`T:`, fmt.Sprintf(logFormatWithBack, reqId, r.RemoteAddr, route.config.Addr, routePath, backP.Name, "ErrCanRetry", e)) diff --git a/config_test.go b/config_test.go index 9d98a00..cdcae87 100644 --- a/config_test.go +++ b/config_test.go @@ -311,3 +311,55 @@ func Test_Cookie(t *testing.T) { } // t.Log(r.Response.Header) } + +func Test_Retry(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + pweb.New(&http.Server{ + Addr: "127.0.0.1:19002", + }).Handle(map[string]func(http.ResponseWriter, *http.Request){ + `/`: func(w http.ResponseWriter, r *http.Request) { + io.Copy(w, r.Body) + }, + }) + + conf := &Config{ + RetryBlocks: RetryBlocks{ + Num: 10, + Size: "3B", + }, + Addr: "127.0.0.1:19000", + Routes: []Route{ + { + Path: []string{"/"}, + PathAdd: true, + RollRule: "order", + Backs: []Back{ + { + Name: "1", + To: "://127.0.0.1:19001", + Weight: 1, + }, + { + Name: "1", + To: "://127.0.0.1:19002", + Weight: 1, + }, + }, + }, + }, + } + + go conf.Run(ctx, logger) + + time.Sleep(time.Second) + + r := reqf.New() + if e := r.Reqf(reqf.Rval{ + Url: "http://127.0.0.1:19000/", + // PostStr: "1", + }); e != nil { + t.Fatal() + } +} -- 2.39.2