mirror of
https://github.com/gin-gonic/gin.git
synced 2025-05-22 20:30:44 +08:00
Merge c4e549a738a5e28e351cb43d9523620f3dc4b4dd into 674522db91d637d179c16c372d87756ea26fa089
This commit is contained in:
commit
13f6971801
@ -4,7 +4,10 @@
|
|||||||
|
|
||||||
package render
|
package render
|
||||||
|
|
||||||
import "net/http"
|
import (
|
||||||
|
"net/http"
|
||||||
|
"strconv"
|
||||||
|
)
|
||||||
|
|
||||||
// Data contains ContentType and bytes data.
|
// Data contains ContentType and bytes data.
|
||||||
type Data struct {
|
type Data struct {
|
||||||
@ -15,6 +18,9 @@ type Data struct {
|
|||||||
// Render (Data) writes data with custom ContentType.
|
// Render (Data) writes data with custom ContentType.
|
||||||
func (r Data) Render(w http.ResponseWriter) (err error) {
|
func (r Data) Render(w http.ResponseWriter) (err error) {
|
||||||
r.WriteContentType(w)
|
r.WriteContentType(w)
|
||||||
|
if len(r.Data) > 0 {
|
||||||
|
w.Header().Set("Content-Length", strconv.Itoa(len(r.Data)))
|
||||||
|
}
|
||||||
_, err = w.Write(r.Data)
|
_, err = w.Write(r.Data)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -8,6 +8,7 @@ import (
|
|||||||
"encoding/xml"
|
"encoding/xml"
|
||||||
"errors"
|
"errors"
|
||||||
"html/template"
|
"html/template"
|
||||||
|
"io"
|
||||||
"net"
|
"net"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/http/httptest"
|
"net/http/httptest"
|
||||||
@ -420,6 +421,36 @@ func TestRenderData(t *testing.T) {
|
|||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
assert.Equal(t, "#!PNG some raw data", w.Body.String())
|
assert.Equal(t, "#!PNG some raw data", w.Body.String())
|
||||||
assert.Equal(t, "image/png", w.Header().Get("Content-Type"))
|
assert.Equal(t, "image/png", w.Header().Get("Content-Type"))
|
||||||
|
assert.Equal(t, "19", w.Header().Get("Content-Length"))
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestRenderDataContentLength(t *testing.T) {
|
||||||
|
srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
size, err := strconv.Atoi(r.URL.Query().Get("size"))
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
data := Data{
|
||||||
|
ContentType: "application/octet-stream",
|
||||||
|
Data: make([]byte, size),
|
||||||
|
}
|
||||||
|
assert.NoError(t, data.Render(w))
|
||||||
|
}))
|
||||||
|
t.Cleanup(srv.Close)
|
||||||
|
|
||||||
|
for _, size := range []int{0, 1, 100, 100_000} {
|
||||||
|
t.Run(strconv.Itoa(size), func(t *testing.T) {
|
||||||
|
resp, err := http.Get(srv.URL + "?size=" + strconv.Itoa(size))
|
||||||
|
require.NoError(t, err)
|
||||||
|
defer resp.Body.Close()
|
||||||
|
|
||||||
|
assert.Equal(t, "application/octet-stream", resp.Header.Get("Content-Type"))
|
||||||
|
assert.EqualValues(t, strconv.Itoa(size), resp.Header.Get("Content-Length"))
|
||||||
|
|
||||||
|
actual, err := io.Copy(io.Discard, resp.Body)
|
||||||
|
require.NoError(t, err)
|
||||||
|
assert.EqualValues(t, size, actual)
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestRenderString(t *testing.T) {
|
func TestRenderString(t *testing.T) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user