From b52a1a1588f8af4e6d1e2a711adbae42d11bb59d Mon Sep 17 00:00:00 2001 From: Dmitry Kutakov Date: Mon, 25 Nov 2019 03:45:53 +0100 Subject: [PATCH 1/2] allow empty headers on DataFromReader (#2121) --- context_test.go | 17 +++++++++++++++++ render/reader.go | 3 +++ render/reader_test.go | 23 +++++++++++++++++++++++ 3 files changed, 43 insertions(+) create mode 100644 render/reader_test.go diff --git a/context_test.go b/context_test.go index f7bb0f51..18709d3d 100644 --- a/context_test.go +++ b/context_test.go @@ -1799,6 +1799,23 @@ func TestContextRenderDataFromReader(t *testing.T) { assert.Equal(t, extraHeaders["Content-Disposition"], w.Header().Get("Content-Disposition")) } +func TestContextRenderDataFromReaderNoHeaders(t *testing.T) { + w := httptest.NewRecorder() + c, _ := CreateTestContext(w) + + body := "#!PNG some raw data" + reader := strings.NewReader(body) + contentLength := int64(len(body)) + contentType := "image/png" + + c.DataFromReader(http.StatusOK, contentLength, contentType, reader, nil) + + assert.Equal(t, http.StatusOK, w.Code) + assert.Equal(t, body, w.Body.String()) + assert.Equal(t, contentType, w.Header().Get("Content-Type")) + assert.Equal(t, fmt.Sprintf("%d", contentLength), w.Header().Get("Content-Length")) +} + type TestResponseRecorder struct { *httptest.ResponseRecorder closeChannel chan bool diff --git a/render/reader.go b/render/reader.go index 502d9398..d5282e49 100644 --- a/render/reader.go +++ b/render/reader.go @@ -22,6 +22,9 @@ type Reader struct { func (r Reader) Render(w http.ResponseWriter) (err error) { r.WriteContentType(w) if r.ContentLength >= 0 { + if r.Headers == nil { + r.Headers = map[string]string{} + } r.Headers["Content-Length"] = strconv.FormatInt(r.ContentLength, 10) } r.writeHeaders(w, r.Headers) diff --git a/render/reader_test.go b/render/reader_test.go new file mode 100644 index 00000000..3930f51d --- /dev/null +++ b/render/reader_test.go @@ -0,0 +1,23 @@ +// Copyright 2019 Gin Core Team. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package render + +import ( + "net/http/httptest" + "strings" + "testing" + + "github.com/stretchr/testify/require" +) + +func TestReaderRenderNoHeaders(t *testing.T) { + content := "test" + r := Reader{ + ContentLength: int64(len(content)), + Reader: strings.NewReader(content), + } + err := r.Render(httptest.NewRecorder()) + require.NoError(t, err) +} From 3737520f17457b8a06a35f612607cb4799e53a67 Mon Sep 17 00:00:00 2001 From: BradyBromley <51128276+BradyBromley@users.noreply.github.com> Date: Sun, 24 Nov 2019 19:03:36 -0800 Subject: [PATCH 2/2] Changed wording for clarity in README.md (#2122) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 8aa50509..3f2d3c2c 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ [![Open Source Helpers](https://www.codetriage.com/gin-gonic/gin/badges/users.svg)](https://www.codetriage.com/gin-gonic/gin) [![Release](https://img.shields.io/github/release/gin-gonic/gin.svg?style=flat-square)](https://github.com/gin-gonic/gin/releases) -Gin is a web framework written in Go (Golang). It features a martini-like API with much better performance, up to 40 times faster thanks to [httprouter](https://github.com/julienschmidt/httprouter). If you need performance and good productivity, you will love Gin. +Gin is a web framework written in Go (Golang). It features a martini-like API with performance that is up to 40 times faster thanks to [httprouter](https://github.com/julienschmidt/httprouter). If you need performance and good productivity, you will love Gin. ## Contents