From 76fc1ef4603f8ca7a2c574154600d08fd80f814c Mon Sep 17 00:00:00 2001 From: Vee Zhang Date: Wed, 1 Sep 2021 19:33:33 +0800 Subject: [PATCH] httpx.Error response without body (#982) * httpx.Error support response without body * fix doc --- CONTRIBUTING.md | 2 +- rest/httpx/responses.go | 5 +++++ rest/httpx/responses_test.go | 43 +++++++++++++++++++++++++----------- 3 files changed, 36 insertions(+), 14 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index f539c3c3..3741b663 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -90,7 +90,7 @@ After that, run these local verifications before submitting pull request to pred fail of continuous integration. * Format the code with `gofmt` -* Run the test with data race enabled `go test -race ./…` +* Run the test with data race enabled `go test -race ./...` ## Code Review diff --git a/rest/httpx/responses.go b/rest/httpx/responses.go index a9dadeb3..644e3583 100644 --- a/rest/httpx/responses.go +++ b/rest/httpx/responses.go @@ -25,6 +25,11 @@ func Error(w http.ResponseWriter, err error) { } code, body := errorHandler(err) + if body == nil { + w.WriteHeader(code) + return + } + e, ok := body.(error) if ok { http.Error(w, e.Error(), code) diff --git a/rest/httpx/responses_test.go b/rest/httpx/responses_test.go index 71f57648..869e1b67 100644 --- a/rest/httpx/responses_test.go +++ b/rest/httpx/responses_test.go @@ -25,17 +25,19 @@ func TestError(t *testing.T) { ) tests := []struct { - name string - input string - errorHandler func(error) (int, interface{}) - expectBody string - expectCode int + name string + input string + errorHandler func(error) (int, interface{}) + expectHaveBody bool + expectBody string + expectCode int }{ { - name: "default error handler", - input: body, - expectBody: body, - expectCode: http.StatusBadRequest, + name: "default error handler", + input: body, + expectHaveBody: true, + expectBody: body, + expectCode: http.StatusBadRequest, }, { name: "customized error handler return string", @@ -43,8 +45,9 @@ func TestError(t *testing.T) { errorHandler: func(err error) (int, interface{}) { return http.StatusForbidden, err.Error() }, - expectBody: wrappedBody, - expectCode: http.StatusForbidden, + expectHaveBody: true, + expectBody: wrappedBody, + expectCode: http.StatusForbidden, }, { name: "customized error handler return error", @@ -52,8 +55,19 @@ func TestError(t *testing.T) { errorHandler: func(err error) (int, interface{}) { return http.StatusForbidden, err }, - expectBody: body, - expectCode: http.StatusForbidden, + expectHaveBody: true, + expectBody: body, + expectCode: http.StatusForbidden, + }, + { + name: "customized error handler return nil", + input: body, + errorHandler: func(err error) (int, interface{}) { + return http.StatusForbidden, nil + }, + expectHaveBody: false, + expectBody: "", + expectCode: http.StatusForbidden, }, } @@ -75,6 +89,7 @@ func TestError(t *testing.T) { } Error(&w, errors.New(test.input)) assert.Equal(t, test.expectCode, w.code) + assert.Equal(t, test.expectHaveBody, w.haveBody) assert.Equal(t, test.expectBody, strings.TrimSpace(w.builder.String())) }) } @@ -122,6 +137,7 @@ func TestWriteJsonLessWritten(t *testing.T) { type tracedResponseWriter struct { headers map[string][]string builder strings.Builder + haveBody bool code int lessWritten bool timeout bool @@ -140,6 +156,7 @@ func (w *tracedResponseWriter) Write(bytes []byte) (n int, err error) { if w.lessWritten { n -= 1 } + w.haveBody = true return }