mirror of
https://github.com/gin-gonic/gin.git
synced 2025-04-29 05:38:56 +08:00
If a caller passed in a map retained within the callers context as extraHeaders to gin.Context.DataFromReader() then a race to write the "Content-Lenght" header would occur. // globalHeader is passed to gin.Context.DataFromReader var globalHeaders = map[string]string{ "cache-control": "public, max-age=3600", } func (c *gin.Context) { //... // DataFromReader must not write to globalHeaders c.DataFromReader(code, contentLength, contentType, reader, globalHeaders) }
43 lines
1016 B
Go
43 lines
1016 B
Go
// 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"
|
|
"strconv"
|
|
"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)
|
|
}
|
|
|
|
func TestReaderRenderWithHeaders(t *testing.T) {
|
|
content := "test"
|
|
r := Reader{
|
|
ContentLength: int64(len(content)),
|
|
Reader: strings.NewReader(content),
|
|
Headers: map[string]string{
|
|
"Test-Content": "test/content",
|
|
},
|
|
}
|
|
recorder := httptest.NewRecorder()
|
|
err := r.Render(recorder)
|
|
require.NoError(t, err)
|
|
|
|
require.Contains(t, recorder.Header()["Content-Length"], strconv.FormatInt(r.ContentLength, 10))
|
|
|
|
require.Contains(t, recorder.Header()["Test-Content"], "test/content")
|
|
}
|