From 9026fd2c132896229bba92d408a23416bd561fce Mon Sep 17 00:00:00 2001 From: huangqian Date: Wed, 11 May 2022 23:58:36 +0800 Subject: [PATCH 1/7] add gClient ExampleNew function, include normal New Example, bad MultiConn New Example and Recommend MultiConn New Example --- net/gclient/gclient_z_example_test.go | 73 +++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) diff --git a/net/gclient/gclient_z_example_test.go b/net/gclient/gclient_z_example_test.go index 70e7c46f50d..ade8f672abf 100644 --- a/net/gclient/gclient_z_example_test.go +++ b/net/gclient/gclient_z_example_test.go @@ -9,6 +9,9 @@ package gclient_test import ( "context" "fmt" + "github.com/gogf/gf/v2/net/gclient" + "github.com/gogf/gf/v2/os/gctx" + "net/http" "time" "github.com/gogf/gf/v2/frame/g" @@ -98,6 +101,76 @@ func init() { time.Sleep(time.Millisecond * 500) } +func ExampleNew() { + var ( + ctx = gctx.New() + client = gclient.New() + ) + + if r, err := client.Get(ctx, "http://127.0.0.1:8999/var/json"); err != nil { + panic(err) + } else { + defer r.Close() + fmt.Println(r.ReadAllString()) + } + + // Output: + // {"id":1,"name":"john"} +} + +func ExampleNew_MultiConn_BadExamle() { + var ( + ctx = gctx.New() + ) + + // When you want to make a concurrent request, The following code is a bad example. + // See ExampleNew_MultiConn_Recommend for a better way. + for i := 0; i < 5; i++ { + go func() { + c := g.Client() + defer c.CloseIdleConnections() + r, err := c.Get(ctx, "http://127.0.0.1:8999/var/json") + defer r.Close() + if err != nil { + fmt.Println(err) + } else { + fmt.Println(r.StatusCode) + } + }() + } +} + +func ExampleNew_MultiConn_Recommend() { + var ( + ctx = gctx.New() + client = gclient.New() + ) + + // controls the maximum idle(keep-alive) connections to keep per-host + client.Transport.(*http.Transport).MaxIdleConnsPerHost = 5 + + for i := 0; i < 5; i++ { + go func() { + if r, err := client.Get(ctx, "http://127.0.0.1:8999/var/json"); err != nil { + panic(err) + } else { + defer r.Close() + // Make sure call the ReadAllString() Funcion, Otherwise the program will block here + fmt.Println(r.ReadAllString()) + } + }() + } + + time.Sleep(time.Second * 1) + + // Output: + //{"id":1,"name":"john"} + //{"id":1,"name":"john"} + //{"id":1,"name":"john"} + //{"id":1,"name":"john"} + //{"id":1,"name":"john"} +} + func ExampleClient_Header() { var ( url = "http://127.0.0.1:8999/header" From 273b81d60feb094be0ad4eef4d57c4b9f5a4b73d Mon Sep 17 00:00:00 2001 From: huangqian Date: Thu, 12 May 2022 00:22:10 +0800 Subject: [PATCH 2/7] little fix --- net/gclient/gclient_z_example_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/net/gclient/gclient_z_example_test.go b/net/gclient/gclient_z_example_test.go index ade8f672abf..db2274154d0 100644 --- a/net/gclient/gclient_z_example_test.go +++ b/net/gclient/gclient_z_example_test.go @@ -118,7 +118,7 @@ func ExampleNew() { // {"id":1,"name":"john"} } -func ExampleNew_MultiConn_BadExamle() { +func ExampleNew_MultiConn_BadExample() { var ( ctx = gctx.New() ) @@ -127,7 +127,7 @@ func ExampleNew_MultiConn_BadExamle() { // See ExampleNew_MultiConn_Recommend for a better way. for i := 0; i < 5; i++ { go func() { - c := g.Client() + c := gclient.New() defer c.CloseIdleConnections() r, err := c.Get(ctx, "http://127.0.0.1:8999/var/json") defer r.Close() From baf4cc1d1c07369b5f21441dd2f39396a5102c89 Mon Sep 17 00:00:00 2001 From: huangqian Date: Thu, 12 May 2022 12:48:37 +0800 Subject: [PATCH 3/7] remove bad example and little fix --- net/gclient/gclient_z_example_test.go | 26 ++------------------------ 1 file changed, 2 insertions(+), 24 deletions(-) diff --git a/net/gclient/gclient_z_example_test.go b/net/gclient/gclient_z_example_test.go index db2274154d0..f96ffb4c451 100644 --- a/net/gclient/gclient_z_example_test.go +++ b/net/gclient/gclient_z_example_test.go @@ -118,32 +118,10 @@ func ExampleNew() { // {"id":1,"name":"john"} } -func ExampleNew_MultiConn_BadExample() { - var ( - ctx = gctx.New() - ) - - // When you want to make a concurrent request, The following code is a bad example. - // See ExampleNew_MultiConn_Recommend for a better way. - for i := 0; i < 5; i++ { - go func() { - c := gclient.New() - defer c.CloseIdleConnections() - r, err := c.Get(ctx, "http://127.0.0.1:8999/var/json") - defer r.Close() - if err != nil { - fmt.Println(err) - } else { - fmt.Println(r.StatusCode) - } - }() - } -} - func ExampleNew_MultiConn_Recommend() { var ( ctx = gctx.New() - client = gclient.New() + client = g.Client() ) // controls the maximum idle(keep-alive) connections to keep per-host @@ -154,9 +132,9 @@ func ExampleNew_MultiConn_Recommend() { if r, err := client.Get(ctx, "http://127.0.0.1:8999/var/json"); err != nil { panic(err) } else { - defer r.Close() // Make sure call the ReadAllString() Funcion, Otherwise the program will block here fmt.Println(r.ReadAllString()) + r.Close() } }() } From 17fc1ce1748e7eddf5ebd29907d807fd3a6e2edc Mon Sep 17 00:00:00 2001 From: huangqian Date: Thu, 12 May 2022 20:08:24 +0800 Subject: [PATCH 4/7] Call ReadAll() function in Close() of gClient --- net/gclient/gclient_response.go | 1 + net/gclient/gclient_z_example_test.go | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/net/gclient/gclient_response.go b/net/gclient/gclient_response.go index dd3a3815fe3..53e0067f85b 100644 --- a/net/gclient/gclient_response.go +++ b/net/gclient/gclient_response.go @@ -75,5 +75,6 @@ func (r *Response) Close() error { return nil } r.Response.Close = true + r.ReadAll() return r.Response.Body.Close() } diff --git a/net/gclient/gclient_z_example_test.go b/net/gclient/gclient_z_example_test.go index f96ffb4c451..d6f7d513163 100644 --- a/net/gclient/gclient_z_example_test.go +++ b/net/gclient/gclient_z_example_test.go @@ -132,7 +132,6 @@ func ExampleNew_MultiConn_Recommend() { if r, err := client.Get(ctx, "http://127.0.0.1:8999/var/json"); err != nil { panic(err) } else { - // Make sure call the ReadAllString() Funcion, Otherwise the program will block here fmt.Println(r.ReadAllString()) r.Close() } From c7cf72e7bcfaae7279f17a97437c645b30a7f963 Mon Sep 17 00:00:00 2001 From: huangqian Date: Thu, 12 May 2022 23:22:30 +0800 Subject: [PATCH 5/7] fix gClien Close() --- net/gclient/gclient_response.go | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/net/gclient/gclient_response.go b/net/gclient/gclient_response.go index 53e0067f85b..84fef34d837 100644 --- a/net/gclient/gclient_response.go +++ b/net/gclient/gclient_response.go @@ -71,10 +71,8 @@ func (r *Response) ReadAllString() string { // Close closes the response when it will never be used. func (r *Response) Close() error { - if r == nil || r.Response == nil || r.Response.Close { + if r == nil || r.Response == nil { return nil } - r.Response.Close = true - r.ReadAll() return r.Response.Body.Close() } From e27ca17b0e44739fb0b91783a93a82f7c458888e Mon Sep 17 00:00:00 2001 From: huangqian Date: Fri, 13 May 2022 06:47:48 +0800 Subject: [PATCH 6/7] exec CI --- net/gclient/gclient_z_example_test.go | 1 - 1 file changed, 1 deletion(-) diff --git a/net/gclient/gclient_z_example_test.go b/net/gclient/gclient_z_example_test.go index d6f7d513163..b122363668e 100644 --- a/net/gclient/gclient_z_example_test.go +++ b/net/gclient/gclient_z_example_test.go @@ -137,7 +137,6 @@ func ExampleNew_MultiConn_Recommend() { } }() } - time.Sleep(time.Second * 1) // Output: From f82f53f5f65ed8296a05f04836272b4c2fdcb9c8 Mon Sep 17 00:00:00 2001 From: huangqian Date: Fri, 13 May 2022 11:58:46 +0800 Subject: [PATCH 7/7] modify ExampleNew_MultiConn_Recommend function --- net/gclient/gclient_z_example_test.go | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/net/gclient/gclient_z_example_test.go b/net/gclient/gclient_z_example_test.go index b122363668e..230d57863f3 100644 --- a/net/gclient/gclient_z_example_test.go +++ b/net/gclient/gclient_z_example_test.go @@ -128,16 +128,13 @@ func ExampleNew_MultiConn_Recommend() { client.Transport.(*http.Transport).MaxIdleConnsPerHost = 5 for i := 0; i < 5; i++ { - go func() { - if r, err := client.Get(ctx, "http://127.0.0.1:8999/var/json"); err != nil { - panic(err) - } else { - fmt.Println(r.ReadAllString()) - r.Close() - } - }() + if r, err := client.Get(ctx, "http://127.0.0.1:8999/var/json"); err != nil { + panic(err) + } else { + fmt.Println(r.ReadAllString()) + r.Close() + } } - time.Sleep(time.Second * 1) // Output: //{"id":1,"name":"john"}