瀏覽代碼

httpx.Error response without body (#982)

* httpx.Error support response without body

* fix doc
Vee Zhang 3 年之前
父節點
當前提交
76fc1ef460
共有 3 個文件被更改,包括 36 次插入14 次删除
  1. 1 1
      CONTRIBUTING.md
  2. 5 0
      rest/httpx/responses.go
  3. 30 13
      rest/httpx/responses_test.go

+ 1 - 1
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
 

+ 5 - 0
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)

+ 30 - 13
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
 }