From 60465ccca2daf587f089b48ecd49670c35437ee1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E5=BC=A0=E4=B8=9C=E9=BE=99?= <zhangdl1995@outlook.com>
Date: Wed, 27 Apr 2022 20:16:13 +0800
Subject: [PATCH] fix(transport/http): responseEncoder should not write any
 data when it need to write nil (#1945)

* fix(transport/http): responseEncoder should not write any data when it need to write nil

* test(transport/http): adjust the test of response encoder encode nil value

* fix(transport/http): remove content-type setting
---
 transport/http/codec.go      |  4 ++++
 transport/http/codec_test.go | 22 ++++++++++++++++++++++
 2 files changed, 26 insertions(+)

diff --git a/transport/http/codec.go b/transport/http/codec.go
index bda318398..67a237390 100644
--- a/transport/http/codec.go
+++ b/transport/http/codec.go
@@ -42,6 +42,10 @@ func DefaultRequestDecoder(r *http.Request, v interface{}) error {
 
 // DefaultResponseEncoder encodes the object to the HTTP response.
 func DefaultResponseEncoder(w http.ResponseWriter, r *http.Request, v interface{}) error {
+	if v == nil {
+		_, err := w.Write(nil)
+		return err
+	}
 	codec, _ := CodecForRequest(r, "Accept")
 	data, err := codec.Marshal(v)
 	if err != nil {
diff --git a/transport/http/codec_test.go b/transport/http/codec_test.go
index ad77eeb62..562f55dec 100644
--- a/transport/http/codec_test.go
+++ b/transport/http/codec_test.go
@@ -100,6 +100,28 @@ func TestDefaultResponseEncoderWithError(t *testing.T) {
 	}
 }
 
+func TestDefaultResponseEncoderEncodeNil(t *testing.T) {
+	w := &mockResponseWriter{StatusCode: 204, header: make(nethttp.Header)}
+	req1 := &nethttp.Request{
+		Header: make(nethttp.Header),
+	}
+	req1.Header.Set("Content-Type", "application/json")
+
+	err := DefaultResponseEncoder(w, req1, nil)
+	if err != nil {
+		t.Errorf("expected no error, got %v", err)
+	}
+	if !reflect.DeepEqual("", w.Header().Get("Content-Type")) {
+		t.Errorf("expected empty string, got %v", w.Header().Get("Content-Type"))
+	}
+	if !reflect.DeepEqual(204, w.StatusCode) {
+		t.Errorf("expected %v, got %v", 204, w.StatusCode)
+	}
+	if w.Data != nil {
+		t.Errorf("expected nil, got %v", w.Data)
+	}
+}
+
 func TestCodecForRequest(t *testing.T) {
 	req1 := &nethttp.Request{
 		Header: make(nethttp.Header),