From 14536e9abcc6e063f0d1000d3935f396c6a822be Mon Sep 17 00:00:00 2001 From: eyasliu Date: Tue, 12 Jan 2021 18:08:50 +0800 Subject: [PATCH 1/7] add http client middleware feature --- net/ghttp/ghttp_client_config.go | 1 + net/ghttp/ghttp_client_middleware.go | 72 +++++++++++++++++++++++++++ net/ghttp/ghttp_client_request.go | 60 ++++++++++++++++++----- net/ghttp/ghttp_unit_client_test.go | 73 ++++++++++++++++++++++++++++ 4 files changed, 195 insertions(+), 11 deletions(-) create mode 100644 net/ghttp/ghttp_client_middleware.go diff --git a/net/ghttp/ghttp_client_config.go b/net/ghttp/ghttp_client_config.go index 207cfe868..2710ecb01 100644 --- a/net/ghttp/ghttp_client_config.go +++ b/net/ghttp/ghttp_client_config.go @@ -33,6 +33,7 @@ type Client struct { browserMode bool // Whether auto saving and sending cookie content. retryCount int // Retry count when request fails. retryInterval time.Duration // Retry interval when request fails. + middlewareHandler []ClientHandlerFunc // Interceptor handlers } // NewClient creates and returns a new HTTP client object. diff --git a/net/ghttp/ghttp_client_middleware.go b/net/ghttp/ghttp_client_middleware.go new file mode 100644 index 000000000..b8f7ede3b --- /dev/null +++ b/net/ghttp/ghttp_client_middleware.go @@ -0,0 +1,72 @@ +package ghttp + +import ( + "github.com/gogf/gf/errors/gerror" + "net/http" +) + +const gfHttpClientMiddlewareKey = "__gfHttpClientMiddlewareKey" + +var gfHttpClientMiddlewareAbort = gerror.New("http request abort") + +// Use Add middleware to client +func (c *Client) Use(handlers ...ClientHandlerFunc) *Client { + newClient := c + if c.parent == nil { + newClient = c.Clone() + } + + newClient.middlewareHandler = append(newClient.middlewareHandler, handlers...) + return newClient +} + +// MiddlewareNext call next middleware +// this is should only be call in ClientHandlerFunc +func (c *Client) MiddlewareNext(req *http.Request) (*ClientResponse, error) { + m, ok := req.Context().Value(gfHttpClientMiddlewareKey).(*clientMiddleware) + if ok { + resp, err := m.Next(c, req) + return resp, err + } + return c.callRequest(req) +} + +// MiddlewareAbort stop call after all middleware, so it will not send http request +// this is should only be call in ClientHandlerFunc +func (c *Client) MiddlewareAbort(req *http.Request) (*ClientResponse, error) { + m := req.Context().Value(gfHttpClientMiddlewareKey).(*clientMiddleware) + m.Abort() + return m.resp, m.err +} + +type ClientHandlerFunc = func(c *Client, r *http.Request) (*ClientResponse, error) + +// clientMiddleware is the plugin for http client request workflow management. +type clientMiddleware struct { + handlers []ClientHandlerFunc // mdl handlers + handlerIndex int // current handler index + abort bool // abort call after handlers + resp *ClientResponse // save resp + err error // save err +} + +// Next call next middleware handler, if abort, +func (m *clientMiddleware) Next(c *Client, req *http.Request) (resp *ClientResponse, err error) { + if m.abort { + return m.resp, m.err + } + if m.handlerIndex < len(m.handlers) { + m.handlerIndex++ + resp, err = m.handlers[m.handlerIndex](c, req) + m.resp = resp + m.err = err + } + return +} + +func (m *clientMiddleware) Abort() { + m.abort = true + if m.err == nil { + m.err = gfHttpClientMiddlewareAbort + } +} diff --git a/net/ghttp/ghttp_client_request.go b/net/ghttp/ghttp_client_request.go index ceb6007ef..02c3849b3 100644 --- a/net/ghttp/ghttp_client_request.go +++ b/net/ghttp/ghttp_client_request.go @@ -8,6 +8,7 @@ package ghttp import ( "bytes" + "context" "errors" "fmt" "github.com/gogf/gf/internal/json" @@ -82,14 +83,8 @@ func (c *Client) Trace(url string, data ...interface{}) (*ClientResponse, error) return c.DoRequest("TRACE", url, data...) } -// DoRequest sends request with given HTTP method and data and returns the response object. -// Note that the response object MUST be closed if it'll be never used. -// -// Note that it uses "multipart/form-data" as its Content-Type if it contains file uploading, -// else it uses "application/x-www-form-urlencoded". It also automatically detects the post -// content for JSON format, and for that it automatically sets the Content-Type as -// "application/json". -func (c *Client) DoRequest(method, url string, data ...interface{}) (resp *ClientResponse, err error) { +// prepareRequest verify params and return http request +func (c *Client) prepareRequest(method, url string, data ...interface{}) (req *http.Request, err error) { method = strings.ToUpper(method) if len(c.prefix) > 0 { url = c.prefix + gstr.Trim(url) @@ -123,7 +118,6 @@ func (c *Client) DoRequest(method, url string, data ...interface{}) (resp *Clien param = BuildParams(data[0]) } } - var req *http.Request if method == "GET" { // It appends the parameters to the url if http method is GET. if param != "" { @@ -203,6 +197,8 @@ func (c *Client) DoRequest(method, url string, data ...interface{}) (resp *Clien // Context. if c.ctx != nil { req = req.WithContext(c.ctx) + } else { + req = req.WithContext(context.Background()) } // Custom header. if len(c.header) > 0 { @@ -232,6 +228,11 @@ func (c *Client) DoRequest(method, url string, data ...interface{}) (resp *Clien if len(c.authUser) > 0 { req.SetBasicAuth(c.authUser, c.authPass) } + return req, nil +} + +// callRequest send http request, return *ClientResponse and error +func (c *Client) callRequest(req *http.Request) (resp *ClientResponse, err error) { resp = &ClientResponse{ request: req, } @@ -250,12 +251,49 @@ func (c *Client) DoRequest(method, url string, data ...interface{}) (resp *Clien c.retryCount-- time.Sleep(c.retryInterval) } else { - return resp, err + //return resp, err + break } } else { break } } + return resp, err +} + +// DoRequest sends request with given HTTP method and data and returns the response object. +// Note that the response object MUST be closed if it'll be never used. +// +// Note that it uses "multipart/form-data" as its Content-Type if it contains file uploading, +// else it uses "application/x-www-form-urlencoded". It also automatically detects the post +// content for JSON format, and for that it automatically sets the Content-Type as +// "application/json". +func (c *Client) DoRequest(method, url string, data ...interface{}) (resp *ClientResponse, err error) { + req, err := c.prepareRequest(method, url, data...) + if err != nil { + return nil, err + } + + if len(c.middlewareHandler) > 0 { + mdlHandlers := make([]ClientHandlerFunc, 0, len(c.middlewareHandler) + 1) + mdlHandlers = append(mdlHandlers, c.middlewareHandler...) + + // last call internal handler + mdlHandlers = append(mdlHandlers, func(cli *Client, r *http.Request) (*ClientResponse, error) { + return cli.callRequest(r) + }) + + // call middleware + ctx := context.WithValue(req.Context(), gfHttpClientMiddlewareKey, &clientMiddleware{ + handlers: mdlHandlers, + handlerIndex: -1, + }) + req = req.WithContext(ctx) + resp, err = c.MiddlewareNext(req) + } else { + resp, err = c.callRequest(req) + } + // Auto saving cookie content. if c.browserMode { @@ -268,5 +306,5 @@ func (c *Client) DoRequest(method, url string, data ...interface{}) (resp *Clien } } } - return resp, nil + return resp, err } diff --git a/net/ghttp/ghttp_unit_client_test.go b/net/ghttp/ghttp_unit_client_test.go index e48340209..d8137eac0 100644 --- a/net/ghttp/ghttp_unit_client_test.go +++ b/net/ghttp/ghttp_unit_client_test.go @@ -7,11 +7,14 @@ package ghttp_test import ( + "bytes" "context" "fmt" "github.com/gogf/gf/debug/gdebug" "github.com/gogf/gf/os/gfile" "github.com/gogf/gf/util/guid" + "io/ioutil" + "net/http" "testing" "time" @@ -332,3 +335,73 @@ func Test_Client_File_And_Param(t *testing.T) { t.Assert(c.PostContent("/", data), data["json"].(string)+gfile.GetContents(path)) }) } + +func Test_Client_Middleware(t *testing.T) { + p, _ := ports.PopRand() + s := g.Server(p) + isServerHandler := false + respStr := "test resp str" + s.BindHandler("/", func(r *ghttp.Request) { + isServerHandler = true + r.Response.Write(respStr) + }) + s.SetPort(p) + s.SetDumpRouterMap(false) + s.Start() + defer s.Shutdown() + + time.Sleep(100 * time.Millisecond) + + gtest.C(t, func(t *gtest.T) { + str := "" + str2 := "resp body" + c := ghttp.NewClient().SetPrefix(fmt.Sprintf("http://127.0.0.1:%d", p)).Use(func(c *ghttp.Client, r *http.Request) (resp *ghttp.ClientResponse, err error) { + str += "a" + resp, err = c.MiddlewareNext(r) + str += "b" + return + }).Use(func(c *ghttp.Client, r *http.Request) (resp *ghttp.ClientResponse, err error) { + str += "c" + resp, err = c.MiddlewareNext(r) + str += "d" + return + }).Use(func(c *ghttp.Client, r *http.Request) (resp *ghttp.ClientResponse, err error) { + str += "e" + resp, err = c.MiddlewareNext(r) + resp.Response.Body = ioutil.NopCloser(bytes.NewBufferString(str2)) + str += "f" + return + }) + + resp, err := c.Get("/") + t.Assert(str, "acefdb") + t.Assert(err, nil) + t.Assert(resp.ReadAllString(), str2) + t.Assert(isServerHandler, true) + + // test abort, abort will not send + str3 := "" + c = ghttp.NewClient().SetPrefix(fmt.Sprintf("http://127.0.0.1:%d", p)).Use(func(c *ghttp.Client, r *http.Request) (resp *ghttp.ClientResponse, err error) { + str3 += "a" + resp, err = c.MiddlewareNext(r) + str3 += "b" + return + }).Use(func(c *ghttp.Client, r *http.Request) (*ghttp.ClientResponse, error) { + str3 += "c" + resp, err := c.MiddlewareAbort(r) + str3 += "d" + resp, err = c.MiddlewareNext(r) + str3 += "e" + return resp, err + }).Use(func(c *ghttp.Client, r *http.Request) (resp *ghttp.ClientResponse, err error) { + str3 += "f" + resp, err = c.MiddlewareNext(r) + str3 += "g" + return + }) + resp, err = c.Get("/") + t.Assert(str3, "acdeb") + t.Assert(err.Error(), "http request abort") + t.Assert(resp, nil) + }) +} \ No newline at end of file From c07c74bf1b4e3ee9771da4557238840b049f34c8 Mon Sep 17 00:00:00 2001 From: eyasliu Date: Tue, 12 Jan 2021 19:01:33 +0800 Subject: [PATCH 2/7] fix lint --- net/ghttp/ghttp_client_middleware.go | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/net/ghttp/ghttp_client_middleware.go b/net/ghttp/ghttp_client_middleware.go index b8f7ede3b..b775f45f6 100644 --- a/net/ghttp/ghttp_client_middleware.go +++ b/net/ghttp/ghttp_client_middleware.go @@ -5,9 +5,9 @@ import ( "net/http" ) -const gfHttpClientMiddlewareKey = "__gfHttpClientMiddlewareKey" +const gfHTTPClientMiddlewareKey = "__gfHttpClientMiddlewareKey" -var gfHttpClientMiddlewareAbort = gerror.New("http request abort") +var gfHTTPClientMiddlewareAbort = gerror.New("http request abort") // Use Add middleware to client func (c *Client) Use(handlers ...ClientHandlerFunc) *Client { @@ -23,7 +23,7 @@ func (c *Client) Use(handlers ...ClientHandlerFunc) *Client { // MiddlewareNext call next middleware // this is should only be call in ClientHandlerFunc func (c *Client) MiddlewareNext(req *http.Request) (*ClientResponse, error) { - m, ok := req.Context().Value(gfHttpClientMiddlewareKey).(*clientMiddleware) + m, ok := req.Context().Value(gfHTTPClientMiddlewareKey).(*clientMiddleware) if ok { resp, err := m.Next(c, req) return resp, err @@ -34,11 +34,12 @@ func (c *Client) MiddlewareNext(req *http.Request) (*ClientResponse, error) { // MiddlewareAbort stop call after all middleware, so it will not send http request // this is should only be call in ClientHandlerFunc func (c *Client) MiddlewareAbort(req *http.Request) (*ClientResponse, error) { - m := req.Context().Value(gfHttpClientMiddlewareKey).(*clientMiddleware) + m := req.Context().Value(gfHTTPClientMiddlewareKey).(*clientMiddleware) m.Abort() return m.resp, m.err } +// ClientHandlerFunc middleware handler func type ClientHandlerFunc = func(c *Client, r *http.Request) (*ClientResponse, error) // clientMiddleware is the plugin for http client request workflow management. @@ -67,6 +68,6 @@ func (m *clientMiddleware) Next(c *Client, req *http.Request) (resp *ClientRespo func (m *clientMiddleware) Abort() { m.abort = true if m.err == nil { - m.err = gfHttpClientMiddlewareAbort + m.err = gfHTTPClientMiddlewareAbort } } From f9905f2bb5cacffcba336904a4d767fa0d835c02 Mon Sep 17 00:00:00 2001 From: eyasliu Date: Tue, 12 Jan 2021 19:09:45 +0800 Subject: [PATCH 3/7] gofmt code --- net/ghttp/ghttp_client_config.go | 22 +++++++++++----------- net/ghttp/ghttp_client_request.go | 5 ++--- net/ghttp/ghttp_unit_client_test.go | 2 +- 3 files changed, 14 insertions(+), 15 deletions(-) diff --git a/net/ghttp/ghttp_client_config.go b/net/ghttp/ghttp_client_config.go index 2710ecb01..06e3e7ea7 100644 --- a/net/ghttp/ghttp_client_config.go +++ b/net/ghttp/ghttp_client_config.go @@ -22,17 +22,17 @@ import ( // Client is the HTTP client for HTTP request management. type Client struct { - http.Client // Underlying HTTP Client. - ctx context.Context // Context for each request. - parent *Client // Parent http client, this is used for chaining operations. - header map[string]string // Custom header map. - cookies map[string]string // Custom cookie map. - prefix string // Prefix for request. - authUser string // HTTP basic authentication: user. - authPass string // HTTP basic authentication: pass. - browserMode bool // Whether auto saving and sending cookie content. - retryCount int // Retry count when request fails. - retryInterval time.Duration // Retry interval when request fails. + http.Client // Underlying HTTP Client. + ctx context.Context // Context for each request. + parent *Client // Parent http client, this is used for chaining operations. + header map[string]string // Custom header map. + cookies map[string]string // Custom cookie map. + prefix string // Prefix for request. + authUser string // HTTP basic authentication: user. + authPass string // HTTP basic authentication: pass. + browserMode bool // Whether auto saving and sending cookie content. + retryCount int // Retry count when request fails. + retryInterval time.Duration // Retry interval when request fails. middlewareHandler []ClientHandlerFunc // Interceptor handlers } diff --git a/net/ghttp/ghttp_client_request.go b/net/ghttp/ghttp_client_request.go index 02c3849b3..9706af4db 100644 --- a/net/ghttp/ghttp_client_request.go +++ b/net/ghttp/ghttp_client_request.go @@ -275,7 +275,7 @@ func (c *Client) DoRequest(method, url string, data ...interface{}) (resp *Clien } if len(c.middlewareHandler) > 0 { - mdlHandlers := make([]ClientHandlerFunc, 0, len(c.middlewareHandler) + 1) + mdlHandlers := make([]ClientHandlerFunc, 0, len(c.middlewareHandler)+1) mdlHandlers = append(mdlHandlers, c.middlewareHandler...) // last call internal handler @@ -284,7 +284,7 @@ func (c *Client) DoRequest(method, url string, data ...interface{}) (resp *Clien }) // call middleware - ctx := context.WithValue(req.Context(), gfHttpClientMiddlewareKey, &clientMiddleware{ + ctx := context.WithValue(req.Context(), gfHTTPClientMiddlewareKey, &clientMiddleware{ handlers: mdlHandlers, handlerIndex: -1, }) @@ -294,7 +294,6 @@ func (c *Client) DoRequest(method, url string, data ...interface{}) (resp *Clien resp, err = c.callRequest(req) } - // Auto saving cookie content. if c.browserMode { now := time.Now() diff --git a/net/ghttp/ghttp_unit_client_test.go b/net/ghttp/ghttp_unit_client_test.go index d8137eac0..42a3ed5f8 100644 --- a/net/ghttp/ghttp_unit_client_test.go +++ b/net/ghttp/ghttp_unit_client_test.go @@ -404,4 +404,4 @@ func Test_Client_Middleware(t *testing.T) { t.Assert(err.Error(), "http request abort") t.Assert(resp, nil) }) -} \ No newline at end of file +} From 1fee3eb5f07acd97e084beedc3fe741d8fe6bdb3 Mon Sep 17 00:00:00 2001 From: eyasliu Date: Fri, 15 Jan 2021 13:58:16 +0800 Subject: [PATCH 4/7] fix review change --- net/ghttp/ghttp_client_middleware.go | 22 ++++++++++++---------- net/ghttp/ghttp_client_request.go | 4 +++- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/net/ghttp/ghttp_client_middleware.go b/net/ghttp/ghttp_client_middleware.go index b775f45f6..294336c21 100644 --- a/net/ghttp/ghttp_client_middleware.go +++ b/net/ghttp/ghttp_client_middleware.go @@ -7,8 +7,6 @@ import ( const gfHTTPClientMiddlewareKey = "__gfHttpClientMiddlewareKey" -var gfHTTPClientMiddlewareAbort = gerror.New("http request abort") - // Use Add middleware to client func (c *Client) Use(handlers ...ClientHandlerFunc) *Client { newClient := c @@ -25,7 +23,7 @@ func (c *Client) Use(handlers ...ClientHandlerFunc) *Client { func (c *Client) MiddlewareNext(req *http.Request) (*ClientResponse, error) { m, ok := req.Context().Value(gfHTTPClientMiddlewareKey).(*clientMiddleware) if ok { - resp, err := m.Next(c, req) + resp, err := m.Next(req) return resp, err } return c.callRequest(req) @@ -34,9 +32,12 @@ func (c *Client) MiddlewareNext(req *http.Request) (*ClientResponse, error) { // MiddlewareAbort stop call after all middleware, so it will not send http request // this is should only be call in ClientHandlerFunc func (c *Client) MiddlewareAbort(req *http.Request) (*ClientResponse, error) { - m := req.Context().Value(gfHTTPClientMiddlewareKey).(*clientMiddleware) - m.Abort() - return m.resp, m.err + m, ok := req.Context().Value(gfHTTPClientMiddlewareKey).(*clientMiddleware) + if ok { + m.Abort() + return m.resp, m.err + } + return nil, gerror.New("http request abort") } // ClientHandlerFunc middleware handler func @@ -44,6 +45,7 @@ type ClientHandlerFunc = func(c *Client, r *http.Request) (*ClientResponse, erro // clientMiddleware is the plugin for http client request workflow management. type clientMiddleware struct { + client *Client // http client handlers []ClientHandlerFunc // mdl handlers handlerIndex int // current handler index abort bool // abort call after handlers @@ -52,13 +54,13 @@ type clientMiddleware struct { } // Next call next middleware handler, if abort, -func (m *clientMiddleware) Next(c *Client, req *http.Request) (resp *ClientResponse, err error) { - if m.abort { +func (m *clientMiddleware) Next(req *http.Request) (resp *ClientResponse, err error) { + if m.abort || m.err != nil { return m.resp, m.err } if m.handlerIndex < len(m.handlers) { m.handlerIndex++ - resp, err = m.handlers[m.handlerIndex](c, req) + resp, err = m.handlers[m.handlerIndex](m.client, req) m.resp = resp m.err = err } @@ -68,6 +70,6 @@ func (m *clientMiddleware) Next(c *Client, req *http.Request) (resp *ClientRespo func (m *clientMiddleware) Abort() { m.abort = true if m.err == nil { - m.err = gfHTTPClientMiddlewareAbort + m.err = gerror.New("http request abort") } } diff --git a/net/ghttp/ghttp_client_request.go b/net/ghttp/ghttp_client_request.go index 9706af4db..56942dc47 100644 --- a/net/ghttp/ghttp_client_request.go +++ b/net/ghttp/ghttp_client_request.go @@ -231,7 +231,8 @@ func (c *Client) prepareRequest(method, url string, data ...interface{}) (req *h return req, nil } -// callRequest send http request, return *ClientResponse and error +// callRequest sends request with give http.Request, and returns the responses object. +// Note that the response object MUST be closed if it'll be never used. func (c *Client) callRequest(req *http.Request) (resp *ClientResponse, err error) { resp = &ClientResponse{ request: req, @@ -285,6 +286,7 @@ func (c *Client) DoRequest(method, url string, data ...interface{}) (resp *Clien // call middleware ctx := context.WithValue(req.Context(), gfHTTPClientMiddlewareKey, &clientMiddleware{ + client: c, handlers: mdlHandlers, handlerIndex: -1, }) From 5b17108f717c9984e19187fd4e9f6a1f33ad11ed Mon Sep 17 00:00:00 2001 From: eyasliu Date: Fri, 15 Jan 2021 18:43:28 +0800 Subject: [PATCH 5/7] trigger CI --- net/ghttp/ghttp_unit_client_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/net/ghttp/ghttp_unit_client_test.go b/net/ghttp/ghttp_unit_client_test.go index 42a3ed5f8..f951c858a 100644 --- a/net/ghttp/ghttp_unit_client_test.go +++ b/net/ghttp/ghttp_unit_client_test.go @@ -340,10 +340,10 @@ func Test_Client_Middleware(t *testing.T) { p, _ := ports.PopRand() s := g.Server(p) isServerHandler := false - respStr := "test resp str" + //respStr := "test resp str" s.BindHandler("/", func(r *ghttp.Request) { isServerHandler = true - r.Response.Write(respStr) + //r.Response.Write(respStr) }) s.SetPort(p) s.SetDumpRouterMap(false) From c5145dc4f60a9ff591a5bdfaf36bdf0ac8a04deb Mon Sep 17 00:00:00 2001 From: eyasliu Date: Sun, 17 Jan 2021 17:26:53 +0800 Subject: [PATCH 6/7] remove abort, actually the abort is unuse --- net/ghttp/ghttp_client_middleware.go | 22 +--------------------- 1 file changed, 1 insertion(+), 21 deletions(-) diff --git a/net/ghttp/ghttp_client_middleware.go b/net/ghttp/ghttp_client_middleware.go index 294336c21..c121ef66b 100644 --- a/net/ghttp/ghttp_client_middleware.go +++ b/net/ghttp/ghttp_client_middleware.go @@ -1,7 +1,6 @@ package ghttp import ( - "github.com/gogf/gf/errors/gerror" "net/http" ) @@ -29,17 +28,6 @@ func (c *Client) MiddlewareNext(req *http.Request) (*ClientResponse, error) { return c.callRequest(req) } -// MiddlewareAbort stop call after all middleware, so it will not send http request -// this is should only be call in ClientHandlerFunc -func (c *Client) MiddlewareAbort(req *http.Request) (*ClientResponse, error) { - m, ok := req.Context().Value(gfHTTPClientMiddlewareKey).(*clientMiddleware) - if ok { - m.Abort() - return m.resp, m.err - } - return nil, gerror.New("http request abort") -} - // ClientHandlerFunc middleware handler func type ClientHandlerFunc = func(c *Client, r *http.Request) (*ClientResponse, error) @@ -48,14 +36,13 @@ type clientMiddleware struct { client *Client // http client handlers []ClientHandlerFunc // mdl handlers handlerIndex int // current handler index - abort bool // abort call after handlers resp *ClientResponse // save resp err error // save err } // Next call next middleware handler, if abort, func (m *clientMiddleware) Next(req *http.Request) (resp *ClientResponse, err error) { - if m.abort || m.err != nil { + if m.err != nil { return m.resp, m.err } if m.handlerIndex < len(m.handlers) { @@ -66,10 +53,3 @@ func (m *clientMiddleware) Next(req *http.Request) (resp *ClientResponse, err er } return } - -func (m *clientMiddleware) Abort() { - m.abort = true - if m.err == nil { - m.err = gerror.New("http request abort") - } -} From 76768373374a1b498df616841dcb8ca9b5f65049 Mon Sep 17 00:00:00 2001 From: eyasliu Date: Sun, 17 Jan 2021 18:05:29 +0800 Subject: [PATCH 7/7] fix abort test --- net/ghttp/ghttp_unit_client_test.go | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/net/ghttp/ghttp_unit_client_test.go b/net/ghttp/ghttp_unit_client_test.go index f951c858a..baf13d09b 100644 --- a/net/ghttp/ghttp_unit_client_test.go +++ b/net/ghttp/ghttp_unit_client_test.go @@ -10,14 +10,16 @@ import ( "bytes" "context" "fmt" - "github.com/gogf/gf/debug/gdebug" - "github.com/gogf/gf/os/gfile" - "github.com/gogf/gf/util/guid" "io/ioutil" "net/http" "testing" "time" + "github.com/gogf/gf/debug/gdebug" + "github.com/gogf/gf/errors/gerror" + "github.com/gogf/gf/os/gfile" + "github.com/gogf/gf/util/guid" + "github.com/gogf/gf/frame/g" "github.com/gogf/gf/net/ghttp" "github.com/gogf/gf/test/gtest" @@ -340,10 +342,8 @@ func Test_Client_Middleware(t *testing.T) { p, _ := ports.PopRand() s := g.Server(p) isServerHandler := false - //respStr := "test resp str" s.BindHandler("/", func(r *ghttp.Request) { isServerHandler = true - //r.Response.Write(respStr) }) s.SetPort(p) s.SetDumpRouterMap(false) @@ -381,6 +381,7 @@ func Test_Client_Middleware(t *testing.T) { // test abort, abort will not send str3 := "" + abortStr := "abort request" c = ghttp.NewClient().SetPrefix(fmt.Sprintf("http://127.0.0.1:%d", p)).Use(func(c *ghttp.Client, r *http.Request) (resp *ghttp.ClientResponse, err error) { str3 += "a" resp, err = c.MiddlewareNext(r) @@ -388,11 +389,7 @@ func Test_Client_Middleware(t *testing.T) { return }).Use(func(c *ghttp.Client, r *http.Request) (*ghttp.ClientResponse, error) { str3 += "c" - resp, err := c.MiddlewareAbort(r) - str3 += "d" - resp, err = c.MiddlewareNext(r) - str3 += "e" - return resp, err + return nil, gerror.New(abortStr) }).Use(func(c *ghttp.Client, r *http.Request) (resp *ghttp.ClientResponse, err error) { str3 += "f" resp, err = c.MiddlewareNext(r) @@ -400,8 +397,8 @@ func Test_Client_Middleware(t *testing.T) { return }) resp, err = c.Get("/") - t.Assert(str3, "acdeb") - t.Assert(err.Error(), "http request abort") + t.Assert(str3, "acb") + t.Assert(err.Error(), abortStr) t.Assert(resp, nil) }) }