api/router: avoid unneeded loops and fix path match (#1594)
* api/router: avoid unneeded loops and fix path match * if match found in google api path syntax, not try pcre loop * if path is not ending via $ sign, append it to pcre to avoid matching other strings like /api/account/register can be matched to /api/account * api: add tests and validations Signed-off-by: Vasiliy Tolstov <v.tolstov@unistack.org>
This commit is contained in:
@@ -45,6 +45,20 @@ func NewTestEndpoints() []*api.Endpoint {
|
||||
Body: "*",
|
||||
Handler: "rpc",
|
||||
},
|
||||
&api.Endpoint{
|
||||
Name: "Test.CallPcre",
|
||||
Path: []string{"^/api/v0/test/call/pcre/?$"},
|
||||
Method: []string{"POST"},
|
||||
Body: "*",
|
||||
Handler: "rpc",
|
||||
},
|
||||
&api.Endpoint{
|
||||
Name: "Test.CallPcreInvalid",
|
||||
Path: []string{"/api/v0/test/call/pcre/invalid/?"},
|
||||
Method: []string{"POST"},
|
||||
Body: "*",
|
||||
Handler: "rpc",
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
@@ -52,6 +66,8 @@ func NewTestEndpoints() []*api.Endpoint {
|
||||
|
||||
type TestService interface {
|
||||
Call(ctx context.Context, in *Request, opts ...client.CallOption) (*Response, error)
|
||||
CallPcre(ctx context.Context, in *Request, opts ...client.CallOption) (*Response, error)
|
||||
CallPcreInvalid(ctx context.Context, in *Request, opts ...client.CallOption) (*Response, error)
|
||||
}
|
||||
|
||||
type testService struct {
|
||||
@@ -76,15 +92,39 @@ func (c *testService) Call(ctx context.Context, in *Request, opts ...client.Call
|
||||
return out, nil
|
||||
}
|
||||
|
||||
func (c *testService) CallPcre(ctx context.Context, in *Request, opts ...client.CallOption) (*Response, error) {
|
||||
req := c.c.NewRequest(c.name, "Test.CallPcre", in)
|
||||
out := new(Response)
|
||||
err := c.c.Call(ctx, req, out, opts...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return out, nil
|
||||
}
|
||||
|
||||
func (c *testService) CallPcreInvalid(ctx context.Context, in *Request, opts ...client.CallOption) (*Response, error) {
|
||||
req := c.c.NewRequest(c.name, "Test.CallPcreInvalid", in)
|
||||
out := new(Response)
|
||||
err := c.c.Call(ctx, req, out, opts...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return out, nil
|
||||
}
|
||||
|
||||
// Server API for Test service
|
||||
|
||||
type TestHandler interface {
|
||||
Call(context.Context, *Request, *Response) error
|
||||
CallPcre(context.Context, *Request, *Response) error
|
||||
CallPcreInvalid(context.Context, *Request, *Response) error
|
||||
}
|
||||
|
||||
func RegisterTestHandler(s server.Server, hdlr TestHandler, opts ...server.HandlerOption) error {
|
||||
type test interface {
|
||||
Call(ctx context.Context, in *Request, out *Response) error
|
||||
CallPcre(ctx context.Context, in *Request, out *Response) error
|
||||
CallPcreInvalid(ctx context.Context, in *Request, out *Response) error
|
||||
}
|
||||
type Test struct {
|
||||
test
|
||||
@@ -97,6 +137,20 @@ func RegisterTestHandler(s server.Server, hdlr TestHandler, opts ...server.Handl
|
||||
Body: "*",
|
||||
Handler: "rpc",
|
||||
}))
|
||||
opts = append(opts, api.WithEndpoint(&api.Endpoint{
|
||||
Name: "Test.CallPcre",
|
||||
Path: []string{"^/api/v0/test/call/pcre/?$"},
|
||||
Method: []string{"POST"},
|
||||
Body: "*",
|
||||
Handler: "rpc",
|
||||
}))
|
||||
opts = append(opts, api.WithEndpoint(&api.Endpoint{
|
||||
Name: "Test.CallPcreInvalid",
|
||||
Path: []string{"/api/v0/test/call/pcre/invalid/?"},
|
||||
Method: []string{"POST"},
|
||||
Body: "*",
|
||||
Handler: "rpc",
|
||||
}))
|
||||
return s.Handle(s.NewHandler(&Test{h}, opts...))
|
||||
}
|
||||
|
||||
@@ -107,3 +161,11 @@ type testHandler struct {
|
||||
func (h *testHandler) Call(ctx context.Context, in *Request, out *Response) error {
|
||||
return h.TestHandler.Call(ctx, in, out)
|
||||
}
|
||||
|
||||
func (h *testHandler) CallPcre(ctx context.Context, in *Request, out *Response) error {
|
||||
return h.TestHandler.CallPcre(ctx, in, out)
|
||||
}
|
||||
|
||||
func (h *testHandler) CallPcreInvalid(ctx context.Context, in *Request, out *Response) error {
|
||||
return h.TestHandler.CallPcreInvalid(ctx, in, out)
|
||||
}
|
||||
|
Reference in New Issue
Block a user