From 4a62d084a93fb50cb85ca62bc8620b041cdc1a4a Mon Sep 17 00:00:00 2001 From: kesonan Date: Tue, 2 Jul 2024 11:55:01 +0800 Subject: [PATCH] fix: disable array request body (#4220) --- .../pkg/parser/api/ast/servicestatement.go | 4 ++++ tools/goctl/pkg/parser/api/parser/analyzer.go | 10 +++++--- .../parser/api/parser/testdata/invalid.api | 23 +++++++++++++------ 3 files changed, 27 insertions(+), 10 deletions(-) diff --git a/tools/goctl/pkg/parser/api/ast/servicestatement.go b/tools/goctl/pkg/parser/api/ast/servicestatement.go index 05b6d3ae2e81..ba0b704d0d31 100644 --- a/tools/goctl/pkg/parser/api/ast/servicestatement.go +++ b/tools/goctl/pkg/parser/api/ast/servicestatement.go @@ -575,3 +575,7 @@ func (e *BodyExpr) Pos() token.Position { } func (e *BodyExpr) exprNode() {} + +func (e *BodyExpr) IsArrayType() bool { + return e.LBrack != nil +} diff --git a/tools/goctl/pkg/parser/api/parser/analyzer.go b/tools/goctl/pkg/parser/api/parser/analyzer.go index b47e7039ab3a..2b1c302a108e 100644 --- a/tools/goctl/pkg/parser/api/parser/analyzer.go +++ b/tools/goctl/pkg/parser/api/parser/analyzer.go @@ -268,14 +268,14 @@ func (a *Analyzer) fillService() error { } if astRoute.Route.Request != nil && astRoute.Route.Request.Body != nil { - requestType, err := a.getType(astRoute.Route.Request) + requestType, err := a.getType(astRoute.Route.Request, true) if err != nil { return err } route.RequestType = requestType } if astRoute.Route.Response != nil && astRoute.Route.Response.Body != nil { - responseType, err := a.getType(astRoute.Route.Response) + responseType, err := a.getType(astRoute.Route.Response, false) if err != nil { return err } @@ -404,8 +404,12 @@ func (a *Analyzer) findDefinedType(name string) (spec.Type, error) { return nil, fmt.Errorf("type %s not defined", name) } -func (a *Analyzer) getType(expr *ast.BodyStmt) (spec.Type, error) { +func (a *Analyzer) getType(expr *ast.BodyStmt, req bool) (spec.Type, error) { body := expr.Body + if req && body.IsArrayType() { + return nil, ast.SyntaxError(body.Pos(), "request body must be struct") + } + var tp spec.Type var err error var rawText = body.Format("") diff --git a/tools/goctl/pkg/parser/api/parser/testdata/invalid.api b/tools/goctl/pkg/parser/api/parser/testdata/invalid.api index db57c6f4582c..f14f2f67d1df 100644 --- a/tools/goctl/pkg/parser/api/parser/testdata/invalid.api +++ b/tools/goctl/pkg/parser/api/parser/testdata/invalid.api @@ -95,13 +95,6 @@ type Foo { Bar *map[[]int]string `json:"bar"` } ------ -// test case: map valu expected literal type -syntax = "v1" -type Foo { - Bar *map[string]{} `json:"bar"` -} - ----- // test case: invalid slice syntax = "v1" @@ -193,4 +186,20 @@ syntax = "v1" service example { @handler nestDemo post /example/nest (NestDemoReq) returns (NestDemoResp) +} + +----- +// test case: unsupported array object request body +syntax = "v1" +service example { + @handler nestDemo + post /example/nest ([]NestDemoReq) returns (NestDemoResp) +} + +----- + // test case: unsupported array request body +syntax = "v1" +service example { + @handler nestDemo2 + post /example/nest2 ([]string) returns (NestDemoResp) } \ No newline at end of file