Merge 501fc1e5236f90ab06639a449f536e125f815c9f into d16fdb15fa54ba898bf6f6ed757397282ed9e496

This commit is contained in:
mstmdev 2023-08-12 08:03:32 +09:00 committed by GitHub
commit d57706eb4d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 42 additions and 27 deletions

View File

@ -52,6 +52,11 @@ var (
jsonASCIIContentType = []string{"application/json"}
)
var (
leftSquareBracket = bytesconv.StringToBytes("[")
rightSquareBracket = bytesconv.StringToBytes("]")
)
// Render (JSON) writes data with custom ContentType.
func (r JSON) Render(w http.ResponseWriter) error {
return WriteJSON(w, r.Data)
@ -97,11 +102,8 @@ func (r SecureJSON) Render(w http.ResponseWriter) error {
return err
}
// if the jsonBytes is array values
if bytes.HasPrefix(jsonBytes, bytesconv.StringToBytes("[")) && bytes.HasSuffix(jsonBytes,
bytesconv.StringToBytes("]")) {
if _, err = w.Write(bytesconv.StringToBytes(r.Prefix)); err != nil {
return err
}
if bytes.HasPrefix(jsonBytes, leftSquareBracket) && bytes.HasSuffix(jsonBytes, rightSquareBracket) {
jsonBytes = append(bytesconv.StringToBytes(r.Prefix), jsonBytes...)
}
_, err = w.Write(jsonBytes)
return err
@ -124,25 +126,8 @@ func (r JsonpJSON) Render(w http.ResponseWriter) (err error) {
_, err = w.Write(ret)
return err
}
callback := template.JSEscapeString(r.Callback)
if _, err = w.Write(bytesconv.StringToBytes(callback)); err != nil {
return err
}
if _, err = w.Write(bytesconv.StringToBytes("(")); err != nil {
return err
}
if _, err = w.Write(ret); err != nil {
return err
}
if _, err = w.Write(bytesconv.StringToBytes(");")); err != nil {
return err
}
return nil
_, err = w.Write(bytesconv.StringToBytes(template.JSEscapeString(r.Callback) + "(" + bytesconv.BytesToString(ret) + ");"))
return err
}
// WriteContentType (JsonpJSON) writes Javascript ContentType.
@ -160,11 +145,11 @@ func (r AsciiJSON) Render(w http.ResponseWriter) (err error) {
var buffer bytes.Buffer
for _, r := range bytesconv.BytesToString(ret) {
cvt := string(r)
if r >= 128 {
cvt = fmt.Sprintf("\\u%04x", int64(r))
buffer.WriteString(fmt.Sprintf("\\u%04x", r))
} else {
buffer.WriteByte(byte(r))
}
buffer.WriteString(cvt)
}
_, err = w.Write(buffer.Bytes())

View File

@ -578,3 +578,33 @@ func TestRenderReaderNoContentLength(t *testing.T) {
assert.Equal(t, headers["Content-Disposition"], w.Header().Get("Content-Disposition"))
assert.Equal(t, headers["x-request-id"], w.Header().Get("x-request-id"))
}
func BenchmarkAsciiJSONRender(b *testing.B) {
data := getRenderData()
benchmarkRender(b, AsciiJSON{Data: data})
}
func BenchmarkJsonpJSONRender(b *testing.B) {
data := getRenderData()
benchmarkRender(b, JsonpJSON{Data: data})
}
func benchmarkRender(b *testing.B, r Render) {
w := httptest.NewRecorder()
b.ReportAllocs()
b.ResetTimer()
for i := 0; i < b.N; i++ {
err := r.Render(w)
if err != nil {
b.Errorf("test json render error =>%v", err)
}
}
}
func getRenderData() map[string]any {
data := map[string]any{
"cn": "<h1>你好 世界</h1>",
"en": "<h1>hello world</h1>",
}
return data
}