From b1e60de34ac0e4deba32c670f20a17087e85256b Mon Sep 17 00:00:00 2001 From: fancl Date: Tue, 6 Jun 2023 18:14:00 +0800 Subject: [PATCH] change request reader --- pkg/request/client.go | 5 +---- pkg/request/client_test.go | 14 ++++++++++++++ pkg/request/request.go | 17 +++++++++++------ 3 files changed, 26 insertions(+), 10 deletions(-) create mode 100644 pkg/request/client_test.go diff --git a/pkg/request/client.go b/pkg/request/client.go index 5d3c312..2fe6634 100644 --- a/pkg/request/client.go +++ b/pkg/request/client.go @@ -1,7 +1,6 @@ package request import ( - "bytes" "io" "net/http" "net/http/cookiejar" @@ -92,17 +91,15 @@ func (client *Client) Delete(urlPath string) *Request { func (client *Client) execute(r *Request) (res *http.Response, err error) { var ( n int - buf []byte reader io.Reader ) if r.contentType == "" && r.body != nil { r.contentType = r.detectContentType(r.body) } if r.body != nil { - if buf, err = r.readRequestBody(r.contentType, r.body); err != nil { + if reader, err = r.readRequestBody(r.contentType, r.body); err != nil { return } - reader = bytes.NewReader(buf) } if r.rawRequest, err = http.NewRequest(r.method, r.uri, reader); err != nil { return diff --git a/pkg/request/client_test.go b/pkg/request/client_test.go new file mode 100644 index 0000000..723123a --- /dev/null +++ b/pkg/request/client_test.go @@ -0,0 +1,14 @@ +package request + +import ( + "bytes" + "testing" +) + +func TestClient_execute(t *testing.T) { + c := New() + buf := []byte("Hello") + c.Post("https://ip.nspix.com/geo"). + SetBody(bytes.NewReader(buf)). + Do() +} diff --git a/pkg/request/request.go b/pkg/request/request.go index 253f903..7136831 100644 --- a/pkg/request/request.go +++ b/pkg/request/request.go @@ -1,6 +1,7 @@ package request import ( + "bytes" "context" "encoding/json" "encoding/xml" @@ -63,16 +64,15 @@ func (r *Request) detectContentType(body interface{}) string { return contentType } -func (r *Request) readRequestBody(contentType string, body any) (buf []byte, err error) { +func (r *Request) readRequestBody(contentType string, body any) (reader io.Reader, err error) { var ( - ok bool - s string - reader io.Reader + ok bool + s string + buf []byte ) kind := reflect.Indirect(reflect.ValueOf(body)).Type().Kind() if reader, ok = r.body.(io.Reader); ok { - buf, err = io.ReadAll(reader) - goto __end + return reader, nil } if buf, ok = r.body.([]byte); ok { goto __end @@ -91,6 +91,11 @@ func (r *Request) readRequestBody(contentType string, body any) (buf []byte, err } err = fmt.Errorf("unmarshal content type %s", contentType) __end: + if err == nil { + if len(buf) > 0 { + return bytes.NewReader(buf), nil + } + } return }