Skip to content

Commit 63cb328

Browse files
authored
fix(net/ghttp): update response message handling in MiddlewareHandlerResponse (#4162)
1 parent a3b3c65 commit 63cb328

24 files changed

+274
-101
lines changed

.github/workflows/golangci-lint.yml

+2-1
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ jobs:
3030
strategy:
3131
matrix:
3232
go-version: [ 'stable' ]
33+
3334
name: golang-ci-lint
3435
runs-on: ubuntu-latest
3536
steps:
@@ -43,7 +44,7 @@ jobs:
4344
uses: golangci/golangci-lint-action@v6
4445
with:
4546
# Required: specify the golangci-lint version without the patch version to always use the latest patch.
46-
version: v1.62.2
47+
version: v1.64.5
4748
only-new-issues: true
4849
skip-cache: true
4950
github-token: ${{ secrets.GITHUB_TOKEN }}

cmd/gf/internal/cmd/genpbentity/genpbentity.go

+7-1
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ type (
3939
g.Meta `name:"pbentity" config:"{CGenPbEntityConfig}" brief:"{CGenPbEntityBrief}" eg:"{CGenPbEntityEg}" ad:"{CGenPbEntityAd}"`
4040
Path string `name:"path" short:"p" brief:"{CGenPbEntityBriefPath}" d:"manifest/protobuf/pbentity"`
4141
Package string `name:"package" short:"k" brief:"{CGenPbEntityBriefPackage}"`
42+
GoPackage string `name:"goPackage" short:"g" brief:"{CGenPbEntityBriefGoPackage}"`
4243
Link string `name:"link" short:"l" brief:"{CGenPbEntityBriefLink}"`
4344
Tables string `name:"tables" short:"t" brief:"{CGenPbEntityBriefTables}"`
4445
Prefix string `name:"prefix" short:"f" brief:"{CGenPbEntityBriefPrefix}"`
@@ -113,6 +114,7 @@ CONFIGURATION SUPPORT
113114
`
114115
CGenPbEntityBriefPath = `directory path for generated files storing`
115116
CGenPbEntityBriefPackage = `package path for all entity proto files`
117+
CGenPbEntityBriefGoPackage = `go package path for all entity proto files`
116118
CGenPbEntityBriefLink = `database configuration, the same as the ORM configuration of GoFrame`
117119
CGenPbEntityBriefTables = `generate models only for given tables, multiple table names separated with ','`
118120
CGenPbEntityBriefPrefix = `add specified prefix for all entity names and entity proto files`
@@ -239,6 +241,7 @@ func init() {
239241
`CGenPbEntityAd`: CGenPbEntityAd,
240242
`CGenPbEntityBriefPath`: CGenPbEntityBriefPath,
241243
`CGenPbEntityBriefPackage`: CGenPbEntityBriefPackage,
244+
`CGenPbEntityBriefGoPackage`: CGenPbEntityBriefGoPackage,
242245
`CGenPbEntityBriefLink`: CGenPbEntityBriefLink,
243246
`CGenPbEntityBriefTables`: CGenPbEntityBriefTables,
244247
`CGenPbEntityBriefPrefix`: CGenPbEntityBriefPrefix,
@@ -379,10 +382,13 @@ func generatePbEntityContentFile(ctx context.Context, in CGenPbEntityInternalInp
379382
}
380383
}
381384
}
385+
if in.GoPackage == "" {
386+
in.GoPackage = in.Package
387+
}
382388
entityContent := gstr.ReplaceByMap(getTplPbEntityContent(""), g.MapStrStr{
383389
"{Imports}": packageImportsArray.Join("\n"),
384390
"{PackageName}": gfile.Basename(in.Package),
385-
"{GoPackage}": in.Package,
391+
"{GoPackage}": in.GoPackage,
386392
"{OptionContent}": in.Option,
387393
"{EntityMessage}": entityMessageDefine,
388394
})

contrib/config/polaris/polaris.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ func (c *Client) doUpdate(ctx context.Context) (err error) {
147147
return gerror.New("config file is empty")
148148
}
149149
var j *gjson.Json
150-
if j, err = gjson.DecodeToJson([]byte(c.client.GetContent())); err != nil {
150+
if j, err = gjson.LoadContent([]byte(c.client.GetContent())); err != nil {
151151
return gerror.Wrap(err, `parse config map item from polaris failed`)
152152
}
153153
c.value.Set(j)

net/ghttp/ghttp_middleware_handler_response.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,6 @@ func MiddlewareHandlerResponse(r *Request) {
6262
msg = err.Error()
6363
} else {
6464
if r.Response.Status > 0 && r.Response.Status != http.StatusOK {
65-
msg = http.StatusText(r.Response.Status)
6665
switch r.Response.Status {
6766
case http.StatusNotFound:
6867
code = gcode.CodeNotFound
@@ -77,6 +76,7 @@ func MiddlewareHandlerResponse(r *Request) {
7776
} else {
7877
code = gcode.CodeOK
7978
}
79+
msg = code.Message()
8080
}
8181

8282
r.Response.WriteJson(DefaultHandlerResponse{

net/ghttp/ghttp_request_param.go

+10-10
Original file line numberDiff line numberDiff line change
@@ -268,28 +268,28 @@ func (r *Request) parseForm() {
268268
if r.ContentLength == 0 {
269269
return
270270
}
271+
271272
if contentType := r.Header.Get("Content-Type"); contentType != "" {
272-
var (
273-
err error
274-
repeatableRead = true
275-
)
276-
if gstr.Contains(contentType, "multipart/") {
273+
var isMultiPartRequest = gstr.Contains(contentType, "multipart/")
274+
var isFormRequest = gstr.Contains(contentType, "form")
275+
var err error
276+
277+
if !isMultiPartRequest {
277278
// To avoid big memory consuming.
278279
// The `multipart/` type form always contains binary data, which is not necessary read twice.
279-
repeatableRead = false
280+
r.MakeBodyRepeatableRead(true)
281+
}
282+
if isMultiPartRequest {
280283
// multipart/form-data, multipart/mixed
281284
if err = r.ParseMultipartForm(r.Server.config.FormParsingMemory); err != nil {
282285
panic(gerror.WrapCode(gcode.CodeInvalidRequest, err, "r.ParseMultipartForm failed"))
283286
}
284-
} else if gstr.Contains(contentType, "form") {
287+
} else if isFormRequest {
285288
// application/x-www-form-urlencoded
286289
if err = r.Request.ParseForm(); err != nil {
287290
panic(gerror.WrapCode(gcode.CodeInvalidRequest, err, "r.Request.ParseForm failed"))
288291
}
289292
}
290-
if repeatableRead {
291-
r.MakeBodyRepeatableRead(true)
292-
}
293293
if len(r.PostForm) > 0 {
294294
// Parse the form data using united parsing way.
295295
params := ""

net/ghttp/ghttp_request_param_request.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ func (r *Request) doGetRequestStruct(pointer interface{}, mapping ...map[string]
183183
return data, nil
184184
}
185185
// `in` Tag Struct values.
186-
if err = r.mergeInTagStructValue(data, pointer); err != nil {
186+
if err = r.mergeInTagStructValue(data); err != nil {
187187
return data, nil
188188
}
189189

@@ -239,7 +239,7 @@ func (r *Request) mergeDefaultStructValue(data map[string]interface{}, pointer i
239239
}
240240

241241
// mergeInTagStructValue merges the request parameters with header or cookie values from struct `in` tag definition.
242-
func (r *Request) mergeInTagStructValue(data map[string]interface{}, pointer interface{}) error {
242+
func (r *Request) mergeInTagStructValue(data map[string]interface{}) error {
243243
fields := r.serveHandler.Handler.Info.ReqStructFields
244244
if len(fields) > 0 {
245245
var (

net/ghttp/ghttp_server_service_handler.go

-17
Original file line numberDiff line numberDiff line change
@@ -282,20 +282,3 @@ func createRouterFunc(funcInfo handlerFuncInfo) func(r *Request) {
282282
}
283283
}
284284
}
285-
286-
// trimGeneric removes type definitions string from response type name if generic
287-
func trimGeneric(structName string) string {
288-
var (
289-
leftBraceIndex = strings.LastIndex(structName, "[") // for generic, it is faster to start at the end than at the beginning
290-
rightBraceIndex = strings.LastIndex(structName, "]")
291-
)
292-
if leftBraceIndex == -1 || rightBraceIndex == -1 {
293-
// not found '[' or ']'
294-
return structName
295-
} else if leftBraceIndex+1 == rightBraceIndex {
296-
// may be a slice, because generic is '[X]', not '[]'
297-
// to be compatible with bad return parameter type: []XxxRes
298-
return structName
299-
}
300-
return structName[:leftBraceIndex]
301-
}

net/ghttp/ghttp_z_unit_feature_openapi_swagger_test.go

+5-5
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ func Test_OpenApi_Swagger(t *testing.T) {
5959
c := g.Client()
6060
c.SetPrefix(fmt.Sprintf("http://127.0.0.1:%d", s.GetListenedPort()))
6161

62-
t.Assert(c.GetContent(ctx, "/test?age=18&name=john"), `{"code":0,"message":"","data":{"Id":1,"Age":18,"Name":"john"}}`)
62+
t.Assert(c.GetContent(ctx, "/test?age=18&name=john"), `{"code":0,"message":"OK","data":{"Id":1,"Age":18,"Name":"john"}}`)
6363
t.Assert(c.GetContent(ctx, "/test/error"), `{"code":50,"message":"error","data":{"Id":1,"Age":0,"Name":""}}`)
6464

6565
t.Assert(gstr.Contains(c.GetContent(ctx, "/swagger/"), `API Reference`), true)
@@ -116,9 +116,9 @@ func Test_OpenApi_Multiple_Methods_Swagger(t *testing.T) {
116116
c.SetPrefix(fmt.Sprintf("http://127.0.0.1:%d", s.GetListenedPort()))
117117

118118
// Only works on GET & POST methods.
119-
t.Assert(c.GetContent(ctx, "/test?age=18&name=john"), `{"code":0,"message":"","data":{"Id":1,"Age":18,"Name":"john"}}`)
119+
t.Assert(c.GetContent(ctx, "/test?age=18&name=john"), `{"code":0,"message":"OK","data":{"Id":1,"Age":18,"Name":"john"}}`)
120120
t.Assert(c.GetContent(ctx, "/test/error"), `{"code":50,"message":"error","data":{"Id":1,"Age":0,"Name":""}}`)
121-
t.Assert(c.PostContent(ctx, "/test?age=18&name=john"), `{"code":0,"message":"","data":{"Id":1,"Age":18,"Name":"john"}}`)
121+
t.Assert(c.PostContent(ctx, "/test?age=18&name=john"), `{"code":0,"message":"OK","data":{"Id":1,"Age":18,"Name":"john"}}`)
122122
t.Assert(c.PostContent(ctx, "/test/error"), `{"code":50,"message":"error","data":{"Id":1,"Age":0,"Name":""}}`)
123123

124124
// Not works on other methods.
@@ -176,9 +176,9 @@ func Test_OpenApi_Method_All_Swagger(t *testing.T) {
176176
c := g.Client()
177177
c.SetPrefix(fmt.Sprintf("http://127.0.0.1:%d", s.GetListenedPort()))
178178

179-
t.Assert(c.GetContent(ctx, "/test?age=18&name=john"), `{"code":0,"message":"","data":{"Id":1,"Age":18,"Name":"john"}}`)
179+
t.Assert(c.GetContent(ctx, "/test?age=18&name=john"), `{"code":0,"message":"OK","data":{"Id":1,"Age":18,"Name":"john"}}`)
180180
t.Assert(c.GetContent(ctx, "/test/error"), `{"code":50,"message":"error","data":{"Id":1,"Age":0,"Name":""}}`)
181-
t.Assert(c.PostContent(ctx, "/test?age=18&name=john"), `{"code":0,"message":"","data":{"Id":1,"Age":18,"Name":"john"}}`)
181+
t.Assert(c.PostContent(ctx, "/test?age=18&name=john"), `{"code":0,"message":"OK","data":{"Id":1,"Age":18,"Name":"john"}}`)
182182
t.Assert(c.PostContent(ctx, "/test/error"), `{"code":50,"message":"error","data":{"Id":1,"Age":0,"Name":""}}`)
183183

184184
t.Assert(gstr.Contains(c.GetContent(ctx, "/swagger/"), `API Reference`), true)

net/ghttp/ghttp_z_unit_feature_request_struct_test.go

+36
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,42 @@ func Test_Params_ParseForm(t *testing.T) {
115115
})
116116
}
117117

118+
// https://github.com/gogf/gf/pull/4143
119+
func Test_Params_ParseForm_FixMakeBodyRepeatableRead(t *testing.T) {
120+
type User struct {
121+
Id int
122+
Name string
123+
}
124+
s := g.Server(guid.S())
125+
s.BindHandler("/parse-form", func(r *ghttp.Request) {
126+
var user *User
127+
if err := r.ParseForm(&user); err != nil {
128+
r.Response.WriteExit(err)
129+
}
130+
hasBody := len(r.GetBody()) > 0
131+
r.Response.WriteExit(hasBody)
132+
})
133+
s.SetDumpRouterMap(false)
134+
s.Start()
135+
defer s.Shutdown()
136+
137+
time.Sleep(100 * time.Millisecond)
138+
gtest.C(t, func(t *gtest.T) {
139+
c := g.Client()
140+
c.SetPrefix(fmt.Sprintf("http://127.0.0.1:%d", s.GetListenedPort()))
141+
t.Assert(c.GetContent(ctx, "/parse-form"), `false`)
142+
t.Assert(c.GetContent(ctx, "/parse-form", g.Map{
143+
"id": 1,
144+
"name": "john",
145+
}), false)
146+
t.Assert(c.PostContent(ctx, "/parse-form"), `false`)
147+
t.Assert(c.PostContent(ctx, "/parse-form", g.Map{
148+
"id": 1,
149+
"name": "john",
150+
}), true)
151+
})
152+
}
153+
118154
func Test_Params_ComplexJsonStruct(t *testing.T) {
119155
type ItemEnv struct {
120156
Type string

net/ghttp/ghttp_z_unit_feature_router_strict_test.go

+24-24
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ func Test_Router_Handler_Strict_WithObject(t *testing.T) {
5656
client := g.Client()
5757
client.SetPrefix(fmt.Sprintf("http://127.0.0.1:%d", s.GetListenedPort()))
5858

59-
t.Assert(client.GetContent(ctx, "/test?age=18&name=john"), `{"code":0,"message":"","data":{"Id":1,"Age":18,"Name":"john"}}`)
59+
t.Assert(client.GetContent(ctx, "/test?age=18&name=john"), `{"code":0,"message":"OK","data":{"Id":1,"Age":18,"Name":"john"}}`)
6060
t.Assert(client.GetContent(ctx, "/test/error"), `{"code":50,"message":"error","data":{"Id":1,"Age":0,"Name":""}}`)
6161
})
6262
}
@@ -153,8 +153,8 @@ func Test_Router_Handler_Strict_WithObjectAndMeta(t *testing.T) {
153153
client.SetPrefix(fmt.Sprintf("http://127.0.0.1:%d", s.GetListenedPort()))
154154

155155
t.Assert(client.GetContent(ctx, "/"), `{"code":65,"message":"Not Found","data":null}`)
156-
t.Assert(client.GetContent(ctx, "/custom-test1?age=18&name=john"), `{"code":0,"message":"","data":{"Id":1,"Age":18}}`)
157-
t.Assert(client.GetContent(ctx, "/custom-test2?age=18&name=john"), `{"code":0,"message":"","data":{"Id":1,"Name":"john"}}`)
156+
t.Assert(client.GetContent(ctx, "/custom-test1?age=18&name=john"), `{"code":0,"message":"OK","data":{"Id":1,"Age":18}}`)
157+
t.Assert(client.GetContent(ctx, "/custom-test2?age=18&name=john"), `{"code":0,"message":"OK","data":{"Id":1,"Name":"john"}}`)
158158
t.Assert(client.PostContent(ctx, "/custom-test2?age=18&name=john"), `{"code":65,"message":"Not Found","data":null}`)
159159
})
160160
}
@@ -184,17 +184,17 @@ func Test_Router_Handler_Strict_Group_Bind(t *testing.T) {
184184
client.SetPrefix(fmt.Sprintf("http://127.0.0.1:%d", s.GetListenedPort()))
185185

186186
t.Assert(client.GetContent(ctx, "/"), `{"code":65,"message":"Not Found","data":null}`)
187-
t.Assert(client.GetContent(ctx, "/api/v1/custom-test1?age=18&name=john"), `{"code":0,"message":"","data":{"Id":1,"Age":18}}`)
188-
t.Assert(client.GetContent(ctx, "/api/v1/custom-test2?age=18&name=john"), `{"code":0,"message":"","data":{"Id":1,"Name":"john"}}`)
187+
t.Assert(client.GetContent(ctx, "/api/v1/custom-test1?age=18&name=john"), `{"code":0,"message":"OK","data":{"Id":1,"Age":18}}`)
188+
t.Assert(client.GetContent(ctx, "/api/v1/custom-test2?age=18&name=john"), `{"code":0,"message":"OK","data":{"Id":1,"Name":"john"}}`)
189189
t.Assert(client.PostContent(ctx, "/api/v1/custom-test2?age=18&name=john"), `{"code":65,"message":"Not Found","data":null}`)
190190

191-
t.Assert(client.GetContent(ctx, "/api/v1/custom-test3?age=18&name=john"), `{"code":0,"message":"","data":{"Id":1,"Age":18}}`)
192-
t.Assert(client.GetContent(ctx, "/api/v1/custom-test4?age=18&name=john"), `{"code":0,"message":"","data":{"Id":1,"Name":"john"}}`)
191+
t.Assert(client.GetContent(ctx, "/api/v1/custom-test3?age=18&name=john"), `{"code":0,"message":"OK","data":{"Id":1,"Age":18}}`)
192+
t.Assert(client.GetContent(ctx, "/api/v1/custom-test4?age=18&name=john"), `{"code":0,"message":"OK","data":{"Id":1,"Name":"john"}}`)
193193

194-
t.Assert(client.GetContent(ctx, "/api/v2/custom-test1?age=18&name=john"), `{"code":0,"message":"","data":{"Id":1,"Age":18}}`)
195-
t.Assert(client.GetContent(ctx, "/api/v2/custom-test2?age=18&name=john"), `{"code":0,"message":"","data":{"Id":1,"Name":"john"}}`)
196-
t.Assert(client.GetContent(ctx, "/api/v2/custom-test3?age=18&name=john"), `{"code":0,"message":"","data":{"Id":1,"Age":18}}`)
197-
t.Assert(client.GetContent(ctx, "/api/v2/custom-test4?age=18&name=john"), `{"code":0,"message":"","data":{"Id":1,"Name":"john"}}`)
194+
t.Assert(client.GetContent(ctx, "/api/v2/custom-test1?age=18&name=john"), `{"code":0,"message":"OK","data":{"Id":1,"Age":18}}`)
195+
t.Assert(client.GetContent(ctx, "/api/v2/custom-test2?age=18&name=john"), `{"code":0,"message":"OK","data":{"Id":1,"Name":"john"}}`)
196+
t.Assert(client.GetContent(ctx, "/api/v2/custom-test3?age=18&name=john"), `{"code":0,"message":"OK","data":{"Id":1,"Age":18}}`)
197+
t.Assert(client.GetContent(ctx, "/api/v2/custom-test4?age=18&name=john"), `{"code":0,"message":"OK","data":{"Id":1,"Name":"john"}}`)
198198
})
199199
}
200200

@@ -251,7 +251,7 @@ func Test_Issue1708(t *testing.T) {
251251
`
252252
t.Assert(
253253
client.PostContent(ctx, "/test", content),
254-
`{"code":0,"message":"","data":{"page":0,"size":0,"targetType":"topic","targetId":10785,"test":[[{"name":"123"}]]}}`,
254+
`{"code":0,"message":"OK","data":{"page":0,"size":0,"targetType":"topic","targetId":10785,"test":[[{"name":"123"}]]}}`,
255255
)
256256
})
257257
}
@@ -295,7 +295,7 @@ func Test_Custom_Slice_Type_Attribute(t *testing.T) {
295295
`
296296
t.Assert(
297297
client.PostContent(ctx, "/test", content),
298-
`{"code":0,"message":"","data":{"Content":"{\"Id\":1,\"List\":{\"key\":[\"a\",\"b\",\"c\"]}}"}}`,
298+
`{"code":0,"message":"OK","data":{"Content":"{\"Id\":1,\"List\":{\"key\":[\"a\",\"b\",\"c\"]}}"}}`,
299299
)
300300
})
301301
}
@@ -370,12 +370,12 @@ func Test_Router_Handler_Strict_WithGeneric(t *testing.T) {
370370
client := g.Client()
371371
client.SetPrefix(fmt.Sprintf("http://127.0.0.1:%d", s.GetListenedPort()))
372372

373-
t.Assert(client.GetContent(ctx, "/test1?age=1"), `{"code":0,"message":"","data":{"Age":{"Test":1}}}`)
374-
t.Assert(client.GetContent(ctx, "/test1_slice?age=1"), `{"code":0,"message":"","data":[{"Age":{"Test":1}}]}`)
375-
t.Assert(client.GetContent(ctx, "/test2?age=2"), `{"code":0,"message":"","data":{"Test":2}}`)
376-
t.Assert(client.GetContent(ctx, "/test2_slice?age=2"), `{"code":0,"message":"","data":[{"Test":2}]}`)
377-
t.Assert(client.GetContent(ctx, "/test3?age=3"), `{"code":0,"message":"","data":{"Test":3}}`)
378-
t.Assert(client.GetContent(ctx, "/test3_slice?age=3"), `{"code":0,"message":"","data":[{"Test":3}]}`)
373+
t.Assert(client.GetContent(ctx, "/test1?age=1"), `{"code":0,"message":"OK","data":{"Age":{"Test":1}}}`)
374+
t.Assert(client.GetContent(ctx, "/test1_slice?age=1"), `{"code":0,"message":"OK","data":[{"Age":{"Test":1}}]}`)
375+
t.Assert(client.GetContent(ctx, "/test2?age=2"), `{"code":0,"message":"OK","data":{"Test":2}}`)
376+
t.Assert(client.GetContent(ctx, "/test2_slice?age=2"), `{"code":0,"message":"OK","data":[{"Test":2}]}`)
377+
t.Assert(client.GetContent(ctx, "/test3?age=3"), `{"code":0,"message":"OK","data":{"Test":3}}`)
378+
t.Assert(client.GetContent(ctx, "/test3_slice?age=3"), `{"code":0,"message":"OK","data":[{"Test":3}]}`)
379379
})
380380
}
381381

@@ -415,7 +415,7 @@ func Test_Router_Handler_Strict_ParameterCaseSensitive(t *testing.T) {
415415
for i := 0; i < 1000; i++ {
416416
t.Assert(
417417
client.PostContent(ctx, "/api/111", `{"Path":"222"}`),
418-
`{"code":0,"message":"","data":{"Path":"222"}}`,
418+
`{"code":0,"message":"OK","data":{"Path":"222"}}`,
419419
)
420420
}
421421
})
@@ -474,10 +474,10 @@ func Test_JsonRawMessage_Issue3449(t *testing.T) {
474474
},
475475
}
476476

477-
expect1 := `{"code":0,"message":"","data":{"name":"test","jsonRaw":[{"jkey1":"11","jkey2":"12"},{"jkey1":"21","jkey2":"22"}]}}`
477+
expect1 := `{"code":0,"message":"OK","data":{"name":"test","jsonRaw":[{"jkey1":"11","jkey2":"12"},{"jkey1":"21","jkey2":"22"}]}}`
478478
t.Assert(client.PostContent(ctx, "/test", data), expect1)
479479

480-
expect2 := `{"code":0,"message":"","data":{"name":"test","jsonRaw":{"jkey1":"11","jkey2":"12"}}}`
480+
expect2 := `{"code":0,"message":"OK","data":{"name":"test","jsonRaw":{"jkey1":"11","jkey2":"12"}}}`
481481
t.Assert(client.PostContent(ctx, "/test", map[string]any{
482482
"Name": "test",
483483
"jsonRaw": v1,
@@ -524,13 +524,13 @@ func Test_NullString_Issue3465(t *testing.T) {
524524
"name": "null",
525525
}
526526

527-
expect1 := `{"code":0,"message":"","data":{"name":["null"]}}`
527+
expect1 := `{"code":0,"message":"OK","data":{"name":["null"]}}`
528528
t.Assert(client.GetContent(ctx, "/test", data1), expect1)
529529

530530
data2 := map[string]any{
531531
"name": []string{"null", "null"},
532532
}
533-
expect2 := `{"code":0,"message":"","data":{"name":["null","null"]}}`
533+
expect2 := `{"code":0,"message":"OK","data":{"name":["null","null"]}}`
534534
t.Assert(client.GetContent(ctx, "/test", data2), expect2)
535535

536536
})

0 commit comments

Comments
 (0)