From 662e8c7b17e623f78fefa2d166eed59d83534c09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E4=B8=9C=E9=BE=99?= 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 adca51675..1df09e303 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 318b6c08b..900b94e2e 100644 --- a/transport/http/codec_test.go +++ b/transport/http/codec_test.go @@ -110,6 +110,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),