mirror of https://github.com/gin-gonic/gin.git
Merge fc1a19e6cc
into e46bd52185
This commit is contained in:
commit
4d0879a82a
15
context.go
15
context.go
|
@ -87,9 +87,18 @@ type Context struct {
|
||||||
// or PUT body parameters.
|
// or PUT body parameters.
|
||||||
formCache url.Values
|
formCache url.Values
|
||||||
|
|
||||||
// SameSite allows a server to define a cookie attribute making it impossible for
|
// sameSite allows a server to define a cookie attribute making it impossible for
|
||||||
// the browser to send this cookie along with cross-site requests.
|
// the browser to send this cookie along with cross-site requests.
|
||||||
sameSite http.SameSite
|
sameSite http.SameSite
|
||||||
|
|
||||||
|
// jsonRender the JSON renderer currently used. The default value is render.JSON,
|
||||||
|
// which is used to get the JSON rendering type when executing the c.JSON function.
|
||||||
|
jsonRender func(data any) render.Render
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetJSONRender set the current JSON render
|
||||||
|
func (c *Context) SetJSONRender(jsonRender func(data any) render.Render) {
|
||||||
|
c.jsonRender = jsonRender
|
||||||
}
|
}
|
||||||
|
|
||||||
/************************************/
|
/************************************/
|
||||||
|
@ -109,6 +118,8 @@ func (c *Context) reset() {
|
||||||
c.queryCache = nil
|
c.queryCache = nil
|
||||||
c.formCache = nil
|
c.formCache = nil
|
||||||
c.sameSite = 0
|
c.sameSite = 0
|
||||||
|
// registering a default JSON renderer
|
||||||
|
c.jsonRender = render.NewJSON
|
||||||
*c.params = (*c.params)[:0]
|
*c.params = (*c.params)[:0]
|
||||||
*c.skippedNodes = (*c.skippedNodes)[:0]
|
*c.skippedNodes = (*c.skippedNodes)[:0]
|
||||||
}
|
}
|
||||||
|
@ -1095,7 +1106,7 @@ func (c *Context) JSONP(code int, obj any) {
|
||||||
// JSON serializes the given struct as JSON into the response body.
|
// JSON serializes the given struct as JSON into the response body.
|
||||||
// It also sets the Content-Type as "application/json".
|
// It also sets the Content-Type as "application/json".
|
||||||
func (c *Context) JSON(code int, obj any) {
|
func (c *Context) JSON(code int, obj any) {
|
||||||
c.Render(code, render.JSON{Data: obj})
|
c.Render(code, c.jsonRender(obj))
|
||||||
}
|
}
|
||||||
|
|
||||||
// AsciiJSON serializes the given struct as JSON into the response body with unicode to ASCII string.
|
// AsciiJSON serializes the given struct as JSON into the response body with unicode to ASCII string.
|
||||||
|
|
|
@ -9,6 +9,7 @@ import (
|
||||||
"context"
|
"context"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"github.com/gin-gonic/gin/render"
|
||||||
"html/template"
|
"html/template"
|
||||||
"io"
|
"io"
|
||||||
"io/fs"
|
"io/fs"
|
||||||
|
@ -166,7 +167,7 @@ func TestSaveUploadedFileWithPermission(t *testing.T) {
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
mw.Close()
|
mw.Close()
|
||||||
c, _ := CreateTestContext(httptest.NewRecorder())
|
c, _ := CreateTestContext(httptest.NewRecorder())
|
||||||
c.Request, _ = http.NewRequest("POST", "/", buf)
|
c.Request, _ = http.NewRequest(http.MethodPost,, "/", buf)
|
||||||
c.Request.Header.Set("Content-Type", mw.FormDataContentType())
|
c.Request.Header.Set("Content-Type", mw.FormDataContentType())
|
||||||
f, err := c.FormFile("file")
|
f, err := c.FormFile("file")
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
@ -187,7 +188,7 @@ func TestSaveUploadedFileWithPermissionFailed(t *testing.T) {
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
mw.Close()
|
mw.Close()
|
||||||
c, _ := CreateTestContext(httptest.NewRecorder())
|
c, _ := CreateTestContext(httptest.NewRecorder())
|
||||||
c.Request, _ = http.NewRequest("POST", "/", buf)
|
c.Request, _ = http.NewRequest(http.MethodPost, "/", buf)
|
||||||
c.Request.Header.Set("Content-Type", mw.FormDataContentType())
|
c.Request.Header.Set("Content-Type", mw.FormDataContentType())
|
||||||
f, err := c.FormFile("file")
|
f, err := c.FormFile("file")
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
@ -3123,3 +3124,31 @@ func TestContextNext(t *testing.T) {
|
||||||
assert.True(t, exists)
|
assert.True(t, exists)
|
||||||
assert.Equal(t, "value3", value)
|
assert.Equal(t, "value3", value)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// MyJSON customizing JSON rendering
|
||||||
|
type MyJSON struct {
|
||||||
|
Data any
|
||||||
|
render.JSON
|
||||||
|
}
|
||||||
|
|
||||||
|
// Render rewrite the Render function
|
||||||
|
func (r MyJSON) Render(w http.ResponseWriter) error {
|
||||||
|
_, err := w.Write([]byte("test"))
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewMyJSON(data any) render.Render {
|
||||||
|
return &MyJSON{Data: data}
|
||||||
|
}
|
||||||
|
|
||||||
|
// TestCustomJSONRender the test uses a custom JSON render.
|
||||||
|
// The final result is that the user can customize the JSON render without affecting the original function.
|
||||||
|
func TestCustomJSONRender(t *testing.T) {
|
||||||
|
w := httptest.NewRecorder()
|
||||||
|
c, _ := CreateTestContext(w)
|
||||||
|
c.SetJSONRender(NewMyJSON)
|
||||||
|
|
||||||
|
c.JSON(http.StatusCreated, H{"foo": "bar", "html": "<b>"})
|
||||||
|
|
||||||
|
t.Log(w.Body.String())
|
||||||
|
}
|
||||||
|
|
|
@ -19,6 +19,10 @@ type JSON struct {
|
||||||
Data any
|
Data any
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func NewJSON(data any) Render {
|
||||||
|
return &JSON{Data: data}
|
||||||
|
}
|
||||||
|
|
||||||
// IndentedJSON contains the given interface object.
|
// IndentedJSON contains the given interface object.
|
||||||
type IndentedJSON struct {
|
type IndentedJSON struct {
|
||||||
Data any
|
Data any
|
||||||
|
|
Loading…
Reference in New Issue