You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dubbo.apache.org by ba...@apache.org on 2020/08/09 12:48:12 UTC
[dubbo-go] branch 1.4 updated (0686ca9 -> ea86567)
This is an automated email from the ASF dual-hosted git repository.
baze pushed a change to branch 1.4
in repository https://gitbox.apache.org/repos/asf/dubbo-go.git.
from 0686ca9 Merge pull request #670 from zouyx/hotfix/fix1.4
new 8e85afd optimized code
new 13369bf use adapter model to modify restServer
new 9a9b3a7 remove adapter
new bcb0100 optimize header transmit in RestClient and RestServer
new f2949db add some comments
new 79bd56c modify some comments and when parsing parameters occurred error, return error immediately
new 6540c89 modify comments
new 4736cdc remove new function
new f580ed0 modify some comments
new d469144 modify some comments and modify some logger's message
new ca2538a optimized code
new a7174c3 let go_restful_server support same url and different methodType
new ea86567 format code
The 13 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
Summary of changes:
protocol/rest/client/client_impl/resty_client.go | 16 +-
protocol/rest/client/rest_client.go | 12 +-
protocol/rest/rest_invoker.go | 26 +-
protocol/rest/rest_protocol.go | 4 +-
protocol/rest/server/rest_server.go | 297 +++++++++++++++++++-
.../rest/server/server_impl/go_restful_server.go | 305 ++++++---------------
.../server_impl/go_restful_server_test.go} | 43 +--
7 files changed, 436 insertions(+), 267 deletions(-)
copy protocol/rest/{config/reader/rest_config_reader_test.go => server/server_impl/go_restful_server_test.go} (57%)
[dubbo-go] 12/13: let go_restful_server support same url and
different methodType
Posted by ba...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
baze pushed a commit to branch 1.4
in repository https://gitbox.apache.org/repos/asf/dubbo-go.git
commit a7174c3922ca3deb2a8c5515ea5468efd7aaac21
Author: Patrick <dr...@foxmail.com>
AuthorDate: Tue Jul 28 21:49:59 2020 +0800
let go_restful_server support same url and different methodType
---
.../rest/server/server_impl/go_restful_server.go | 24 ++++-----
.../server/server_impl/go_restful_server_test.go | 57 ++++++++++++++++++++++
2 files changed, 70 insertions(+), 11 deletions(-)
diff --git a/protocol/rest/server/server_impl/go_restful_server.go b/protocol/rest/server/server_impl/go_restful_server.go
index c7d971f..6fb9ee8 100644
--- a/protocol/rest/server/server_impl/go_restful_server.go
+++ b/protocol/rest/server/server_impl/go_restful_server.go
@@ -48,8 +48,8 @@ var filterSlice []restful.FilterFunction
// GoRestfulServer a rest server implement by go-restful
type GoRestfulServer struct {
- srv *http.Server
- container *restful.Container
+ srv *http.Server
+ ws *restful.WebService
}
// NewGoRestfulServer a constructor of GoRestfulServer
@@ -60,13 +60,17 @@ func NewGoRestfulServer() server.RestServer {
// Start go-restful server
// It will add all go-restful filters
func (grs *GoRestfulServer) Start(url common.URL) {
- grs.container = restful.NewContainer()
+ container := restful.NewContainer()
for _, filter := range filterSlice {
- grs.container.Filter(filter)
+ container.Filter(filter)
}
grs.srv = &http.Server{
- Handler: grs.container,
+ Handler: container,
}
+ grs.ws = &restful.WebService{}
+ grs.ws.Path("/")
+ grs.ws.SetDynamicRoutes(true)
+ container.Add(grs.ws)
ln, err := net.Listen("tcp", url.Location)
if err != nil {
panic(perrors.New(fmt.Sprintf("Restful Server start error:%v", err)))
@@ -83,23 +87,21 @@ func (grs *GoRestfulServer) Start(url common.URL) {
// Publish a http api in go-restful server
// The routeFunc should be invoked when the server receive a request
func (grs *GoRestfulServer) Deploy(restMethodConfig *config.RestMethodConfig, routeFunc func(request server.RestServerRequest, response server.RestServerResponse)) {
- ws := &restful.WebService{}
+
rf := func(req *restful.Request, resp *restful.Response) {
routeFunc(NewGoRestfulRequestAdapter(req), resp)
}
- ws.Path(restMethodConfig.Path).
+ grs.ws.Route(grs.ws.Method(restMethodConfig.MethodType).
Produces(strings.Split(restMethodConfig.Produces, ",")...).
Consumes(strings.Split(restMethodConfig.Consumes, ",")...).
- Route(ws.Method(restMethodConfig.MethodType).To(rf))
- grs.container.Add(ws)
-
+ Path(restMethodConfig.Path).To(rf))
}
// Delete a http api in go-restful server
func (grs *GoRestfulServer) UnDeploy(restMethodConfig *config.RestMethodConfig) {
ws := new(restful.WebService)
ws.Path(restMethodConfig.Path)
- err := grs.container.Remove(ws)
+ err := grs.ws.RemoveRoute(restMethodConfig.Path, restMethodConfig.MethodType)
if err != nil {
logger.Warnf("[Go restful] Remove web service error:%v", err)
}
diff --git a/protocol/rest/server/server_impl/go_restful_server_test.go b/protocol/rest/server/server_impl/go_restful_server_test.go
new file mode 100644
index 0000000..29a9ef8
--- /dev/null
+++ b/protocol/rest/server/server_impl/go_restful_server_test.go
@@ -0,0 +1,57 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package server_impl
+
+import (
+ "testing"
+)
+
+import (
+ "github.com/stretchr/testify/assert"
+)
+
+import (
+ "github.com/apache/dubbo-go/common"
+ "github.com/apache/dubbo-go/protocol/rest/config"
+ "github.com/apache/dubbo-go/protocol/rest/server"
+)
+
+func TestGoRestfulServerDeploySameUrl(t *testing.T) {
+ grs := NewGoRestfulServer()
+ url, err := common.NewURL("http://127.0.0.1:43121")
+ assert.NoError(t, err)
+ grs.Start(url)
+ rmc := &config.RestMethodConfig{
+ Produces: "*/*",
+ Consumes: "*/*",
+ MethodType: "POST",
+ Path: "/test",
+ }
+ f := func(request server.RestServerRequest, response server.RestServerResponse) {}
+ grs.Deploy(rmc, f)
+ rmc1 := &config.RestMethodConfig{
+ Produces: "*/*",
+ Consumes: "*/*",
+ MethodType: "GET",
+ Path: "/test",
+ }
+ grs.Deploy(rmc1, f)
+ grs.UnDeploy(rmc)
+ grs.UnDeploy(rmc1)
+ grs.Destroy()
+}
[dubbo-go] 05/13: add some comments
Posted by ba...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
baze pushed a commit to branch 1.4
in repository https://gitbox.apache.org/repos/asf/dubbo-go.git
commit f2949db91e69f536316a435eaa9433e539947bbe
Author: Patrick <dr...@foxmail.com>
AuthorDate: Wed Apr 1 20:04:31 2020 +0800
add some comments
---
protocol/rest/client/client_impl/resty_client.go | 1 +
protocol/rest/client/rest_client.go | 3 +++
protocol/rest/server/rest_server.go | 20 +++++++++++++---
.../rest/server/server_impl/go_restful_server.go | 27 ++++++++++++++++------
4 files changed, 41 insertions(+), 10 deletions(-)
diff --git a/protocol/rest/client/client_impl/resty_client.go b/protocol/rest/client/client_impl/resty_client.go
index 9e0c80c..bfd7445 100644
--- a/protocol/rest/client/client_impl/resty_client.go
+++ b/protocol/rest/client/client_impl/resty_client.go
@@ -40,6 +40,7 @@ func init() {
extension.SetRestClient(constant.DEFAULT_REST_CLIENT, NewRestyClient)
}
+// A rest client implement by Resty
type RestyClient struct {
client *resty.Client
}
diff --git a/protocol/rest/client/rest_client.go b/protocol/rest/client/rest_client.go
index 5be4bb3..47d17c6 100644
--- a/protocol/rest/client/rest_client.go
+++ b/protocol/rest/client/rest_client.go
@@ -22,11 +22,13 @@ import (
"time"
)
+// Some rest options
type RestOptions struct {
RequestTimeout time.Duration
ConnectTimeout time.Duration
}
+// Client request
type RestClientRequest struct {
Header http.Header
Location string
@@ -37,6 +39,7 @@ type RestClientRequest struct {
Body interface{}
}
+// User can implement this client interface to send request
type RestClient interface {
Do(request *RestClientRequest, res interface{}) error
}
diff --git a/protocol/rest/server/rest_server.go b/protocol/rest/server/rest_server.go
index 7fb0560..60f0dab 100644
--- a/protocol/rest/server/rest_server.go
+++ b/protocol/rest/server/rest_server.go
@@ -38,33 +38,47 @@ import (
)
type RestServer interface {
+ // start rest server
Start(url common.URL)
+ // deploy a http api
Deploy(restMethodConfig *rest_config.RestMethodConfig, routeFunc func(request RestServerRequest, response RestServerResponse))
+ // unDeploy a http api
UnDeploy(restMethodConfig *rest_config.RestMethodConfig)
+ // destroy rest server
Destroy()
}
// RestServerRequest interface
type RestServerRequest interface {
+ // Get the Ptr of http.Request
RawRequest() *http.Request
+ // Get the path parameter by name
PathParameter(name string) string
+ // Get the map of the path parameters
PathParameters() map[string]string
+ // Get the query parameter by name
QueryParameter(name string) string
+ // Get the map of query parameters
QueryParameters(name string) []string
+ // Get the body parameter of name
BodyParameter(name string) (string, error)
+ // Get the header parameter of name
HeaderParameter(name string) string
+ // ReadEntity checks the Accept header and reads the content into the entityPointer.
ReadEntity(entityPointer interface{}) error
}
// RestServerResponse interface
type RestServerResponse interface {
- Header() http.Header
- Write([]byte) (int, error)
- WriteHeader(statusCode int)
+ http.ResponseWriter
+ // WriteError writes the http status and the error string on the response. err can be nil.
+ // Return an error if writing was not succesful.
WriteError(httpStatus int, err error) (writeErr error)
+ // WriteEntity marshals the value using the representation denoted by the Accept Header.
WriteEntity(value interface{}) error
}
+// A route function will be invoked by http server
func GetRouteFunc(invoker protocol.Invoker, methodConfig *rest_config.RestMethodConfig) func(req RestServerRequest, resp RestServerResponse) {
return func(req RestServerRequest, resp RestServerResponse) {
var (
diff --git a/protocol/rest/server/server_impl/go_restful_server.go b/protocol/rest/server/server_impl/go_restful_server.go
index 9163d3a..00b644f 100644
--- a/protocol/rest/server/server_impl/go_restful_server.go
+++ b/protocol/rest/server/server_impl/go_restful_server.go
@@ -41,20 +41,24 @@ import (
)
func init() {
- extension.SetRestServer(constant.DEFAULT_REST_SERVER, GetNewGoRestfulServer)
+ extension.SetRestServer(constant.DEFAULT_REST_SERVER, NewGoRestfulServer)
}
var filterSlice []restful.FilterFunction
+// A rest server implement by go-restful
type GoRestfulServer struct {
srv *http.Server
container *restful.Container
}
-func NewGoRestfulServer() *GoRestfulServer {
+// A constructor of GoRestfulServer
+func NewGoRestfulServer() server.RestServer {
return &GoRestfulServer{}
}
+// Start go-restful server
+// It will add all go-restful filters
func (grs *GoRestfulServer) Start(url common.URL) {
grs.container = restful.NewContainer()
for _, filter := range filterSlice {
@@ -76,6 +80,8 @@ func (grs *GoRestfulServer) Start(url common.URL) {
}()
}
+// Publish a http api in go-restful server
+// The routeFunc should be invoked when the server receive a request
func (grs *GoRestfulServer) Deploy(restMethodConfig *config.RestMethodConfig, routeFunc func(request server.RestServerRequest, response server.RestServerResponse)) {
ws := new(restful.WebService)
rf := func(req *restful.Request, resp *restful.Response) {
@@ -89,6 +95,7 @@ func (grs *GoRestfulServer) Deploy(restMethodConfig *config.RestMethodConfig, ro
}
+// Delete a http api in go-restful server
func (grs *GoRestfulServer) UnDeploy(restMethodConfig *config.RestMethodConfig) {
ws := new(restful.WebService)
ws.Path(restMethodConfig.Path)
@@ -98,6 +105,7 @@ func (grs *GoRestfulServer) UnDeploy(restMethodConfig *config.RestMethodConfig)
}
}
+// Destroy the go-restful server
func (grs *GoRestfulServer) Destroy() {
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
@@ -107,11 +115,7 @@ func (grs *GoRestfulServer) Destroy() {
logger.Infof("[Go Restful] Server exiting")
}
-func GetNewGoRestfulServer() server.RestServer {
- return NewGoRestfulServer()
-}
-
-// Let user addFilter
+// Let user add the http server of go-restful
// addFilter should before config.Load()
func AddGoRestfulServerFilter(filterFuc restful.FilterFunction) {
filterSlice = append(filterSlice, filterFuc)
@@ -123,38 +127,47 @@ type GoRestfulRequestAdapter struct {
request *restful.Request
}
+// A constructor of GoRestfulRequestAdapter
func NewGoRestfulRequestAdapter(request *restful.Request) *GoRestfulRequestAdapter {
return &GoRestfulRequestAdapter{request: request}
}
+// A adapter function of server.RestServerRequest's RawRequest
func (grra *GoRestfulRequestAdapter) RawRequest() *http.Request {
return grra.request.Request
}
+// A adapter function of server.RestServerRequest's PathParameter
func (grra *GoRestfulRequestAdapter) PathParameter(name string) string {
return grra.request.PathParameter(name)
}
+// A adapter function of server.RestServerRequest's QueryParameter
func (grra *GoRestfulRequestAdapter) PathParameters() map[string]string {
return grra.request.PathParameters()
}
+// A adapter function of server.RestServerRequest's QueryParameters
func (grra *GoRestfulRequestAdapter) QueryParameter(name string) string {
return grra.request.QueryParameter(name)
}
+// A adapter function of server.RestServerRequest's QueryParameters
func (grra *GoRestfulRequestAdapter) QueryParameters(name string) []string {
return grra.request.QueryParameters(name)
}
+// A adapter function of server.RestServerRequest's BodyParameter
func (grra *GoRestfulRequestAdapter) BodyParameter(name string) (string, error) {
return grra.request.BodyParameter(name)
}
+// A adapter function of server.RestServerRequest's HeaderParameter
func (grra *GoRestfulRequestAdapter) HeaderParameter(name string) string {
return grra.request.HeaderParameter(name)
}
+// A adapter func of server.RestServerRequest's ReadEntity
func (grra *GoRestfulRequestAdapter) ReadEntity(entityPointer interface{}) error {
return grra.request.ReadEntity(entityPointer)
}
[dubbo-go] 11/13: optimized code
Posted by ba...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
baze pushed a commit to branch 1.4
in repository https://gitbox.apache.org/repos/asf/dubbo-go.git
commit ca2538a7e8c374678fda25b13f892eaee9112803
Author: Patrick <dr...@foxmail.com>
AuthorDate: Sat Apr 4 18:33:01 2020 +0800
optimized code
---
protocol/rest/server/rest_server.go | 10 ++++------
1 file changed, 4 insertions(+), 6 deletions(-)
diff --git a/protocol/rest/server/rest_server.go b/protocol/rest/server/rest_server.go
index 60a75bc..fbd6fb7 100644
--- a/protocol/rest/server/rest_server.go
+++ b/protocol/rest/server/rest_server.go
@@ -160,11 +160,10 @@ func getArgsInterfaceFromRequest(req RestServerRequest, methodConfig *rest_confi
}
m := make(map[string]interface{})
// TODO read as a slice
- if err := req.ReadEntity(&m); err == nil {
- argsMap[methodConfig.Body] = m
- } else {
+ if err := req.ReadEntity(&m); err != nil {
return nil, perrors.Errorf("[Go restful] Read body entity as map[string]interface{} error:%v", err)
}
+ argsMap[methodConfig.Body] = m
}
args := make([]interface{}, maxKey+1)
for k, v := range argsMap {
@@ -236,11 +235,10 @@ func assembleArgsFromBody(methodConfig *rest_config.RestMethodConfig, argsTypes
ni = n.Interface()
}
}
- if err := req.ReadEntity(&ni); err == nil {
- args[methodConfig.Body] = ni
- } else {
+ if err := req.ReadEntity(&ni); err != nil {
return perrors.Errorf("[Go restful] Read body entity error, error is %v", perrors.WithStack(err))
}
+ args[methodConfig.Body] = ni
}
return nil
}
[dubbo-go] 02/13: use adapter model to modify restServer
Posted by ba...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
baze pushed a commit to branch 1.4
in repository https://gitbox.apache.org/repos/asf/dubbo-go.git
commit 13369bf9a72e16ef657ccf6b27d269367dc37776
Author: Patrick <dr...@foxmail.com>
AuthorDate: Tue Mar 31 23:10:40 2020 +0800
use adapter model to modify restServer
---
protocol/rest/client/client_impl/resty_client.go | 2 +-
protocol/rest/client/rest_client.go | 4 +-
protocol/rest/rest_invoker.go | 3 +-
protocol/rest/rest_protocol.go | 4 +-
protocol/rest/server/rest_server.go | 261 ++++++++++++++++++-
.../rest/server/server_impl/go_restful_server.go | 287 +++++----------------
6 files changed, 335 insertions(+), 226 deletions(-)
diff --git a/protocol/rest/client/client_impl/resty_client.go b/protocol/rest/client/client_impl/resty_client.go
index aa6c231..af9637e 100644
--- a/protocol/rest/client/client_impl/resty_client.go
+++ b/protocol/rest/client/client_impl/resty_client.go
@@ -65,7 +65,7 @@ func NewRestyClient(restOption *client.RestOptions) client.RestClient {
}
}
-func (rc *RestyClient) Do(restRequest *client.RestRequest, res interface{}) error {
+func (rc *RestyClient) Do(restRequest *client.RestClientRequest, res interface{}) error {
r, err := rc.client.R().
SetHeader("Content-Type", restRequest.Consumes).
SetHeader("Accept", restRequest.Produces).
diff --git a/protocol/rest/client/rest_client.go b/protocol/rest/client/rest_client.go
index 7d020ab..3acccb5 100644
--- a/protocol/rest/client/rest_client.go
+++ b/protocol/rest/client/rest_client.go
@@ -26,7 +26,7 @@ type RestOptions struct {
ConnectTimeout time.Duration
}
-type RestRequest struct {
+type RestClientRequest struct {
Location string
Path string
Produces string
@@ -39,5 +39,5 @@ type RestRequest struct {
}
type RestClient interface {
- Do(request *RestRequest, res interface{}) error
+ Do(request *RestClientRequest, res interface{}) error
}
diff --git a/protocol/rest/rest_invoker.go b/protocol/rest/rest_invoker.go
index 0c82035..c8e3fea 100644
--- a/protocol/rest/rest_invoker.go
+++ b/protocol/rest/rest_invoker.go
@@ -78,8 +78,7 @@ func (ri *RestInvoker) Invoke(ctx context.Context, invocation protocol.Invocatio
if len(inv.Arguments()) > methodConfig.Body && methodConfig.Body >= 0 {
body = inv.Arguments()[methodConfig.Body]
}
-
- req := &client.RestRequest{
+ req := &client.RestClientRequest{
Location: ri.GetUrl().Location,
Produces: methodConfig.Produces,
Consumes: methodConfig.Consumes,
diff --git a/protocol/rest/rest_protocol.go b/protocol/rest/rest_protocol.go
index 47ecb60..e15eeb3 100644
--- a/protocol/rest/rest_protocol.go
+++ b/protocol/rest/rest_protocol.go
@@ -75,7 +75,9 @@ func (rp *RestProtocol) Export(invoker protocol.Invoker) protocol.Exporter {
}
rp.SetExporterMap(serviceKey, exporter)
restServer := rp.getServer(url, restServiceConfig.Server)
- restServer.Deploy(invoker, restServiceConfig.RestMethodConfigsMap)
+ for _, methodConfig := range restServiceConfig.RestMethodConfigsMap {
+ restServer.Deploy(methodConfig, server.GetRouteFunc(invoker, methodConfig))
+ }
return exporter
}
diff --git a/protocol/rest/server/rest_server.go b/protocol/rest/server/rest_server.go
index c10c98a..b7eb555 100644
--- a/protocol/rest/server/rest_server.go
+++ b/protocol/rest/server/rest_server.go
@@ -18,14 +18,269 @@
package server
import (
+ "context"
+ "net/http"
+ "reflect"
+ "strconv"
+ "strings"
+)
+
+import (
+ perrors "github.com/pkg/errors"
+)
+
+import (
"github.com/apache/dubbo-go/common"
+ "github.com/apache/dubbo-go/common/logger"
"github.com/apache/dubbo-go/protocol"
- "github.com/apache/dubbo-go/protocol/rest/config"
+ "github.com/apache/dubbo-go/protocol/invocation"
+ rest_config "github.com/apache/dubbo-go/protocol/rest/config"
)
type RestServer interface {
Start(url common.URL)
- Deploy(invoker protocol.Invoker, restMethodConfig map[string]*config.RestMethodConfig)
- UnDeploy(restMethodConfig map[string]*config.RestMethodConfig)
+ Deploy(restMethodConfig *rest_config.RestMethodConfig, routeFunc func(request RestServerRequest, response RestServerResponse))
+ UnDeploy(restMethodConfig *rest_config.RestMethodConfig)
Destroy()
}
+
+// RestServerRequest interface
+type RestServerRequest interface {
+ PathParameter(name string) string
+ PathParameters() map[string]string
+ QueryParameter(name string) string
+ QueryParameters(name string) []string
+ BodyParameter(name string) (string, error)
+ HeaderParameter(name string) string
+ ReadEntity(entityPointer interface{}) error
+}
+
+// RestServerResponse interface
+type RestServerResponse interface {
+ WriteError(httpStatus int, err error) (writeErr error)
+ WriteEntity(value interface{}) error
+}
+
+func GetRouteFunc(invoker protocol.Invoker, methodConfig *rest_config.RestMethodConfig) func(req RestServerRequest, resp RestServerResponse) {
+ return func(req RestServerRequest, resp RestServerResponse) {
+ var (
+ err error
+ args []interface{}
+ )
+ svc := common.ServiceMap.GetService(invoker.GetUrl().Protocol, strings.TrimPrefix(invoker.GetUrl().Path, "/"))
+ // get method
+ method := svc.Method()[methodConfig.MethodName]
+ argsTypes := method.ArgsType()
+ replyType := method.ReplyType()
+ if (len(argsTypes) == 1 || len(argsTypes) == 2 && replyType == nil) &&
+ argsTypes[0].String() == "[]interface {}" {
+ args = getArgsInterfaceFromRequest(req, methodConfig)
+ } else {
+ args = getArgsFromRequest(req, argsTypes, methodConfig)
+ }
+ result := invoker.Invoke(context.Background(), invocation.NewRPCInvocation(methodConfig.MethodName, args, make(map[string]string)))
+ if result.Error() != nil {
+ err = resp.WriteError(http.StatusInternalServerError, result.Error())
+ if err != nil {
+ logger.Errorf("[Go Restful] WriteError error:%v", err)
+ }
+ return
+ }
+ err = resp.WriteEntity(result.Result())
+ if err != nil {
+ logger.Errorf("[Go Restful] WriteEntity error:%v", err)
+ }
+ }
+}
+
+// when service function like GetUser(req []interface{}, rsp *User) error
+// use this method to get arguments
+func getArgsInterfaceFromRequest(req RestServerRequest, methodConfig *rest_config.RestMethodConfig) []interface{} {
+ argsMap := make(map[int]interface{}, 8)
+ maxKey := 0
+ for k, v := range methodConfig.PathParamsMap {
+ if maxKey < k {
+ maxKey = k
+ }
+ argsMap[k] = req.PathParameter(v)
+ }
+ for k, v := range methodConfig.QueryParamsMap {
+ if maxKey < k {
+ maxKey = k
+ }
+ params := req.QueryParameters(v)
+ if len(params) == 1 {
+ argsMap[k] = params[0]
+ } else {
+ argsMap[k] = params
+ }
+ }
+ for k, v := range methodConfig.HeadersMap {
+ if maxKey < k {
+ maxKey = k
+ }
+ argsMap[k] = req.HeaderParameter(v)
+ }
+ if methodConfig.Body >= 0 {
+ if maxKey < methodConfig.Body {
+ maxKey = methodConfig.Body
+ }
+ m := make(map[string]interface{})
+ // TODO read as a slice
+ if err := req.ReadEntity(&m); err != nil {
+ logger.Warnf("[Go restful] Read body entity as map[string]interface{} error:%v", perrors.WithStack(err))
+ } else {
+ argsMap[methodConfig.Body] = m
+ }
+ }
+ args := make([]interface{}, maxKey+1)
+ for k, v := range argsMap {
+ if k >= 0 {
+ args[k] = v
+ }
+ }
+ return args
+}
+
+// get arguments from server.RestServerRequest
+func getArgsFromRequest(req RestServerRequest, argsTypes []reflect.Type, methodConfig *rest_config.RestMethodConfig) []interface{} {
+ argsLength := len(argsTypes)
+ args := make([]interface{}, argsLength)
+ for i, t := range argsTypes {
+ args[i] = reflect.Zero(t).Interface()
+ }
+ assembleArgsFromPathParams(methodConfig, argsLength, argsTypes, req, args)
+ assembleArgsFromQueryParams(methodConfig, argsLength, argsTypes, req, args)
+ assembleArgsFromBody(methodConfig, argsTypes, req, args)
+ assembleArgsFromHeaders(methodConfig, req, argsLength, argsTypes, args)
+ return args
+}
+
+// assemble arguments from headers
+func assembleArgsFromHeaders(methodConfig *rest_config.RestMethodConfig, req RestServerRequest, argsLength int, argsTypes []reflect.Type, args []interface{}) {
+ for k, v := range methodConfig.HeadersMap {
+ param := req.HeaderParameter(v)
+ if k < 0 || k >= argsLength {
+ logger.Errorf("[Go restful] Header param parse error, the args:%v doesn't exist", k)
+ continue
+ }
+ t := argsTypes[k]
+ if t.Kind() == reflect.Ptr {
+ t = t.Elem()
+ }
+ if t.Kind() == reflect.String {
+ args[k] = param
+ } else {
+ logger.Errorf("[Go restful] Header param parse error, the args:%v of type isn't string", k)
+ }
+ }
+}
+
+// assemble arguments from body
+func assembleArgsFromBody(methodConfig *rest_config.RestMethodConfig, argsTypes []reflect.Type, req RestServerRequest, args []interface{}) {
+ if methodConfig.Body >= 0 && methodConfig.Body < len(argsTypes) {
+ t := argsTypes[methodConfig.Body]
+ kind := t.Kind()
+ if kind == reflect.Ptr {
+ t = t.Elem()
+ }
+ var ni interface{}
+ if t.String() == "[]interface {}" {
+ ni = make([]map[string]interface{}, 0)
+ } else if t.String() == "interface {}" {
+ ni = make(map[string]interface{})
+ } else {
+ n := reflect.New(t)
+ if n.CanInterface() {
+ ni = n.Interface()
+ }
+ }
+ if err := req.ReadEntity(&ni); err != nil {
+ logger.Errorf("[Go restful] Read body entity error:%v", err)
+ } else {
+ args[methodConfig.Body] = ni
+ }
+ }
+}
+
+// assemble arguments from query params
+func assembleArgsFromQueryParams(methodConfig *rest_config.RestMethodConfig, argsLength int, argsTypes []reflect.Type, req RestServerRequest, args []interface{}) {
+ var (
+ err error
+ param interface{}
+ i64 int64
+ )
+ for k, v := range methodConfig.QueryParamsMap {
+ if k < 0 || k >= argsLength {
+ logger.Errorf("[Go restful] Query param parse error, the args:%v doesn't exist", k)
+ continue
+ }
+ t := argsTypes[k]
+ kind := t.Kind()
+ if kind == reflect.Ptr {
+ t = t.Elem()
+ }
+ if kind == reflect.Slice {
+ param = req.QueryParameters(v)
+ } else if kind == reflect.String {
+ param = req.QueryParameter(v)
+ } else if kind == reflect.Int {
+ param, err = strconv.Atoi(req.QueryParameter(v))
+ } else if kind == reflect.Int32 {
+ i64, err = strconv.ParseInt(req.QueryParameter(v), 10, 32)
+ if err == nil {
+ param = int32(i64)
+ }
+ } else if kind == reflect.Int64 {
+ param, err = strconv.ParseInt(req.QueryParameter(v), 10, 64)
+ } else {
+ logger.Errorf("[Go restful] Query param parse error, the args:%v of type isn't int or string or slice", k)
+ continue
+ }
+ if err != nil {
+ logger.Errorf("[Go restful] Query param parse error, error is %v", err)
+ continue
+ }
+ args[k] = param
+ }
+}
+
+// assemble arguments from path params
+func assembleArgsFromPathParams(methodConfig *rest_config.RestMethodConfig, argsLength int, argsTypes []reflect.Type, req RestServerRequest, args []interface{}) {
+ var (
+ err error
+ param interface{}
+ i64 int64
+ )
+ for k, v := range methodConfig.PathParamsMap {
+ if k < 0 || k >= argsLength {
+ logger.Errorf("[Go restful] Path param parse error, the args:%v doesn't exist", k)
+ continue
+ }
+ t := argsTypes[k]
+ kind := t.Kind()
+ if kind == reflect.Ptr {
+ t = t.Elem()
+ }
+ if kind == reflect.Int {
+ param, err = strconv.Atoi(req.PathParameter(v))
+ } else if kind == reflect.Int32 {
+ i64, err = strconv.ParseInt(req.PathParameter(v), 10, 32)
+ if err == nil {
+ param = int32(i64)
+ }
+ } else if kind == reflect.Int64 {
+ param, err = strconv.ParseInt(req.PathParameter(v), 10, 64)
+ } else if kind == reflect.String {
+ param = req.PathParameter(v)
+ } else {
+ logger.Warnf("[Go restful] Path param parse error, the args:%v of type isn't int or string", k)
+ continue
+ }
+ if err != nil {
+ logger.Errorf("[Go restful] Path param parse error, error is %v", err)
+ continue
+ }
+ args[k] = param
+ }
+}
diff --git a/protocol/rest/server/server_impl/go_restful_server.go b/protocol/rest/server/server_impl/go_restful_server.go
index 812699b..3c81fe0 100644
--- a/protocol/rest/server/server_impl/go_restful_server.go
+++ b/protocol/rest/server/server_impl/go_restful_server.go
@@ -22,8 +22,6 @@ import (
"fmt"
"net"
"net/http"
- "reflect"
- "strconv"
"strings"
"time"
)
@@ -38,8 +36,6 @@ import (
"github.com/apache/dubbo-go/common/constant"
"github.com/apache/dubbo-go/common/extension"
"github.com/apache/dubbo-go/common/logger"
- "github.com/apache/dubbo-go/protocol"
- "github.com/apache/dubbo-go/protocol/invocation"
"github.com/apache/dubbo-go/protocol/rest/config"
"github.com/apache/dubbo-go/protocol/rest/server"
)
@@ -80,57 +76,27 @@ func (grs *GoRestfulServer) Start(url common.URL) {
}()
}
-func (grs *GoRestfulServer) Deploy(invoker protocol.Invoker, restMethodConfig map[string]*config.RestMethodConfig) {
- for methodName, config := range restMethodConfig {
- ws := new(restful.WebService)
- ws.Path(config.Path).
- Produces(strings.Split(config.Produces, ",")...).
- Consumes(strings.Split(config.Consumes, ",")...).
- Route(ws.Method(config.MethodType).To(getFunc(methodName, invoker, config)))
- grs.container.Add(ws)
+func (grs *GoRestfulServer) Deploy(restMethodConfig *config.RestMethodConfig, routeFunc func(request server.RestServerRequest, response server.RestServerResponse)) {
+ ws := new(restful.WebService)
+ rf := func(req *restful.Request, resp *restful.Response) {
+ respAdapter := NewGoRestfulResponseAdapter(resp)
+ reqAdapter := NewGoRestfulRequestAdapter(req)
+ routeFunc(reqAdapter, respAdapter)
}
+ ws.Path(restMethodConfig.Path).
+ Produces(strings.Split(restMethodConfig.Produces, ",")...).
+ Consumes(strings.Split(restMethodConfig.Consumes, ",")...).
+ Route(ws.Method(restMethodConfig.MethodType).To(rf))
+ grs.container.Add(ws)
}
-func getFunc(methodName string, invoker protocol.Invoker, config *config.RestMethodConfig) func(req *restful.Request, resp *restful.Response) {
- return func(req *restful.Request, resp *restful.Response) {
- var (
- err error
- args []interface{}
- )
- svc := common.ServiceMap.GetService(invoker.GetUrl().Protocol, strings.TrimPrefix(invoker.GetUrl().Path, "/"))
- // get method
- method := svc.Method()[methodName]
- argsTypes := method.ArgsType()
- replyType := method.ReplyType()
- if (len(argsTypes) == 1 || len(argsTypes) == 2 && replyType == nil) &&
- argsTypes[0].String() == "[]interface {}" {
- args = getArgsInterfaceFromRequest(req, config)
- } else {
- args = getArgsFromRequest(req, argsTypes, config)
- }
- result := invoker.Invoke(context.Background(), invocation.NewRPCInvocation(methodName, args, make(map[string]string)))
- if result.Error() != nil {
- err = resp.WriteError(http.StatusInternalServerError, result.Error())
- if err != nil {
- logger.Errorf("[Go Restful] WriteError error:%v", err)
- }
- return
- }
- err = resp.WriteEntity(result.Result())
- if err != nil {
- logger.Error("[Go Restful] WriteEntity error:%v", err)
- }
- }
-}
-func (grs *GoRestfulServer) UnDeploy(restMethodConfig map[string]*config.RestMethodConfig) {
- for _, config := range restMethodConfig {
- ws := new(restful.WebService)
- ws.Path(config.Path)
- err := grs.container.Remove(ws)
- if err != nil {
- logger.Warnf("[Go restful] Remove web service error:%v", err)
- }
+func (grs *GoRestfulServer) UnDeploy(restMethodConfig *config.RestMethodConfig) {
+ ws := new(restful.WebService)
+ ws.Path(restMethodConfig.Path)
+ err := grs.container.Remove(ws)
+ if err != nil {
+ logger.Warnf("[Go restful] Remove web service error:%v", err)
}
}
@@ -143,179 +109,66 @@ func (grs *GoRestfulServer) Destroy() {
logger.Infof("[Go Restful] Server exiting")
}
-func getArgsInterfaceFromRequest(req *restful.Request, config *config.RestMethodConfig) []interface{} {
- argsMap := make(map[int]interface{}, 8)
- maxKey := 0
- for k, v := range config.PathParamsMap {
- if maxKey < k {
- maxKey = k
- }
- argsMap[k] = req.PathParameter(v)
- }
- for k, v := range config.QueryParamsMap {
- if maxKey < k {
- maxKey = k
- }
- params := req.QueryParameters(v)
- if len(params) == 1 {
- argsMap[k] = params[0]
- } else {
- argsMap[k] = params
- }
- }
- for k, v := range config.HeadersMap {
- if maxKey < k {
- maxKey = k
- }
- argsMap[k] = req.HeaderParameter(v)
- }
- if config.Body >= 0 {
- if maxKey < config.Body {
- maxKey = config.Body
- }
- m := make(map[string]interface{})
- // TODO read as a slice
- if err := req.ReadEntity(&m); err != nil {
- logger.Warnf("[Go restful] Read body entity as map[string]interface{} error:%v", perrors.WithStack(err))
- } else {
- argsMap[config.Body] = m
- }
- }
- args := make([]interface{}, maxKey+1)
- for k, v := range argsMap {
- if k >= 0 {
- args[k] = v
- }
- }
- return args
+func GetNewGoRestfulServer() server.RestServer {
+ return NewGoRestfulServer()
}
-func getArgsFromRequest(req *restful.Request, argsTypes []reflect.Type, config *config.RestMethodConfig) []interface{} {
- argsLength := len(argsTypes)
- args := make([]interface{}, argsLength)
- for i, t := range argsTypes {
- args[i] = reflect.Zero(t).Interface()
- }
- var (
- err error
- param interface{}
- i64 int64
- )
- for k, v := range config.PathParamsMap {
- if k < 0 || k >= argsLength {
- logger.Errorf("[Go restful] Path param parse error, the args:%v doesn't exist", k)
- continue
- }
- t := argsTypes[k]
- kind := t.Kind()
- if kind == reflect.Ptr {
- t = t.Elem()
- }
- if kind == reflect.Int {
- param, err = strconv.Atoi(req.PathParameter(v))
- } else if kind == reflect.Int32 {
- i64, err = strconv.ParseInt(req.PathParameter(v), 10, 32)
- if err == nil {
- param = int32(i64)
- }
- } else if kind == reflect.Int64 {
- param, err = strconv.ParseInt(req.PathParameter(v), 10, 64)
- } else if kind == reflect.String {
- param = req.PathParameter(v)
- } else {
- logger.Warnf("[Go restful] Path param parse error, the args:%v of type isn't int or string", k)
- continue
- }
- if err != nil {
- logger.Errorf("[Go restful] Path param parse error, error is %v", err)
- continue
- }
- args[k] = param
- }
- for k, v := range config.QueryParamsMap {
- if k < 0 || k >= argsLength {
- logger.Errorf("[Go restful] Query param parse error, the args:%v doesn't exist", k)
- continue
- }
- t := argsTypes[k]
- kind := t.Kind()
- if kind == reflect.Ptr {
- t = t.Elem()
- }
- if kind == reflect.Slice {
- param = req.QueryParameters(v)
- } else if kind == reflect.String {
- param = req.QueryParameter(v)
- } else if kind == reflect.Int {
- param, err = strconv.Atoi(req.QueryParameter(v))
- } else if kind == reflect.Int32 {
- i64, err = strconv.ParseInt(req.QueryParameter(v), 10, 32)
- if err == nil {
- param = int32(i64)
- }
- } else if kind == reflect.Int64 {
- param, err = strconv.ParseInt(req.QueryParameter(v), 10, 64)
- } else {
- logger.Errorf("[Go restful] Query param parse error, the args:%v of type isn't int or string or slice", k)
- continue
- }
- if err != nil {
- logger.Errorf("[Go restful] Query param parse error, error is %v", err)
- continue
- }
- args[k] = param
- }
+// Let user addFilter
+// addFilter should before config.Load()
+func AddGoRestfulServerFilter(filterFuc restful.FilterFunction) {
+ filterSlice = append(filterSlice, filterFuc)
+}
- if config.Body >= 0 && config.Body < len(argsTypes) {
- t := argsTypes[config.Body]
- kind := t.Kind()
- if kind == reflect.Ptr {
- t = t.Elem()
- }
- var ni interface{}
- if t.String() == "[]interface {}" {
- ni = make([]map[string]interface{}, 0)
- } else if t.String() == "interface {}" {
- ni = make(map[string]interface{})
- } else {
- n := reflect.New(t)
- if n.CanInterface() {
- ni = n.Interface()
- }
- }
- if err := req.ReadEntity(&ni); err != nil {
- logger.Errorf("[Go restful] Read body entity error:%v", err)
- } else {
- args[config.Body] = ni
- }
- }
+// Go Restful Request adapt to RestServerRequest
+type GoRestfulRequestAdapter struct {
+ rawRequest *restful.Request
+}
- for k, v := range config.HeadersMap {
- param := req.HeaderParameter(v)
- if k < 0 || k >= argsLength {
- logger.Errorf("[Go restful] Header param parse error, the args:%v doesn't exist", k)
- continue
- }
- t := argsTypes[k]
- if t.Kind() == reflect.Ptr {
- t = t.Elem()
- }
- if t.Kind() == reflect.String {
- args[k] = param
- } else {
- logger.Errorf("[Go restful] Header param parse error, the args:%v of type isn't string", k)
- }
- }
+func (gra *GoRestfulRequestAdapter) PathParameter(name string) string {
+ return gra.rawRequest.PathParameter(name)
+}
- return args
+func (gra *GoRestfulRequestAdapter) PathParameters() map[string]string {
+ return gra.rawRequest.PathParameters()
}
-func GetNewGoRestfulServer() server.RestServer {
- return NewGoRestfulServer()
+func (gra *GoRestfulRequestAdapter) QueryParameter(name string) string {
+ return gra.rawRequest.QueryParameter(name)
}
-// Let user addFilter
-// addFilter should before config.Load()
-func AddGoRestfulServerFilter(filterFuc restful.FilterFunction) {
- filterSlice = append(filterSlice, filterFuc)
+func (gra *GoRestfulRequestAdapter) QueryParameters(name string) []string {
+ return gra.rawRequest.QueryParameters(name)
+}
+
+func (gra *GoRestfulRequestAdapter) BodyParameter(name string) (string, error) {
+ return gra.rawRequest.BodyParameter(name)
+}
+
+func (gra *GoRestfulRequestAdapter) HeaderParameter(name string) string {
+ return gra.rawRequest.HeaderParameter(name)
+}
+
+func (gra *GoRestfulRequestAdapter) ReadEntity(entityPointer interface{}) error {
+ return gra.rawRequest.ReadEntity(entityPointer)
+}
+
+func NewGoRestfulRequestAdapter(rawRequest *restful.Request) server.RestServerRequest {
+ return &GoRestfulRequestAdapter{rawRequest: rawRequest}
+}
+
+// Go Restful Request adapt to RestClientRequest
+type GoRestfulResponseAdapter struct {
+ rawResponse *restful.Response
+}
+
+func (grsa *GoRestfulResponseAdapter) WriteError(httpStatus int, err error) (writeErr error) {
+ return grsa.rawResponse.WriteError(httpStatus, err)
+}
+
+func (grsa *GoRestfulResponseAdapter) WriteEntity(value interface{}) error {
+ return grsa.rawResponse.WriteEntity(value)
+}
+
+func NewGoRestfulResponseAdapter(rawResponse *restful.Response) server.RestServerResponse {
+ return &GoRestfulResponseAdapter{rawResponse: rawResponse}
}
[dubbo-go] 10/13: modify some comments and modify some logger's
message
Posted by ba...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
baze pushed a commit to branch 1.4
in repository https://gitbox.apache.org/repos/asf/dubbo-go.git
commit d469144cecfd283bbaf85721f4412585ac8b7f77
Author: Patrick <dr...@foxmail.com>
AuthorDate: Thu Apr 2 00:17:07 2020 +0800
modify some comments and modify some logger's message
---
protocol/rest/server/rest_server.go | 17 ++++++++++-------
protocol/rest/server/server_impl/go_restful_server.go | 4 ++--
2 files changed, 12 insertions(+), 9 deletions(-)
diff --git a/protocol/rest/server/rest_server.go b/protocol/rest/server/rest_server.go
index 8bc32e8..60a75bc 100644
--- a/protocol/rest/server/rest_server.go
+++ b/protocol/rest/server/rest_server.go
@@ -95,6 +95,9 @@ func GetRouteFunc(invoker protocol.Invoker, methodConfig *rest_config.RestMethod
method := svc.Method()[methodConfig.MethodName]
argsTypes := method.ArgsType()
replyType := method.ReplyType()
+ // two ways to prepare arguments
+ // if method like this 'func1(req []interface{}, rsp *User) error'
+ // we don't have arguments type
if (len(argsTypes) == 1 || len(argsTypes) == 2 && replyType == nil) &&
argsTypes[0].String() == "[]interface {}" {
args, err = getArgsInterfaceFromRequest(req, methodConfig)
@@ -102,7 +105,7 @@ func GetRouteFunc(invoker protocol.Invoker, methodConfig *rest_config.RestMethod
args, err = getArgsFromRequest(req, argsTypes, methodConfig)
}
if err != nil {
- logger.Errorf("[Go Restful] parsing parameters error:%v", err)
+ logger.Errorf("[Go Restful] parsing http parameters error:%v", err)
err = resp.WriteError(http.StatusInternalServerError, errors.New(parseParameterErrorStr))
if err != nil {
logger.Errorf("[Go Restful] WriteErrorString error:%v", err)
@@ -199,7 +202,7 @@ func assembleArgsFromHeaders(methodConfig *rest_config.RestMethodConfig, req Res
for k, v := range methodConfig.HeadersMap {
param := req.HeaderParameter(v)
if k < 0 || k >= argsLength {
- return perrors.Errorf("[Go restful] Header param parse error, the args:%v doesn't exist", k)
+ return perrors.Errorf("[Go restful] Header param parse error, the index %v args of method:%v doesn't exist", k, methodConfig.MethodName)
}
t := argsTypes[k]
if t.Kind() == reflect.Ptr {
@@ -208,7 +211,7 @@ func assembleArgsFromHeaders(methodConfig *rest_config.RestMethodConfig, req Res
if t.Kind() == reflect.String {
args[k] = param
} else {
- return perrors.Errorf("[Go restful] Header param parse error, the args:%v of type isn't string", k)
+ return perrors.Errorf("[Go restful] Header param parse error, the index %v args's type isn't string", k)
}
}
return nil
@@ -251,7 +254,7 @@ func assembleArgsFromQueryParams(methodConfig *rest_config.RestMethodConfig, arg
)
for k, v := range methodConfig.QueryParamsMap {
if k < 0 || k >= argsLength {
- return perrors.Errorf("[Go restful] Query param parse error, the args:%v doesn't exist", k)
+ return perrors.Errorf("[Go restful] Query param parse error, the index %v args of method:%v doesn't exist", k, methodConfig.MethodName)
}
t := argsTypes[k]
kind := t.Kind()
@@ -272,7 +275,7 @@ func assembleArgsFromQueryParams(methodConfig *rest_config.RestMethodConfig, arg
} else if kind == reflect.Int64 {
param, err = strconv.ParseInt(req.QueryParameter(v), 10, 64)
} else {
- return perrors.Errorf("[Go restful] Query param parse error, the args:%v of type isn't int or string or slice", k)
+ return perrors.Errorf("[Go restful] Query param parse error, the index %v args's type isn't int or string or slice", k)
}
if err != nil {
return perrors.Errorf("[Go restful] Query param parse error, error:%v", perrors.WithStack(err))
@@ -291,7 +294,7 @@ func assembleArgsFromPathParams(methodConfig *rest_config.RestMethodConfig, args
)
for k, v := range methodConfig.PathParamsMap {
if k < 0 || k >= argsLength {
- return perrors.Errorf("[Go restful] Path param parse error, the args:%v doesn't exist", k)
+ return perrors.Errorf("[Go restful] Path param parse error, the index %v args of method:%v doesn't exist", k, methodConfig.MethodName)
}
t := argsTypes[k]
kind := t.Kind()
@@ -310,7 +313,7 @@ func assembleArgsFromPathParams(methodConfig *rest_config.RestMethodConfig, args
} else if kind == reflect.String {
param = req.PathParameter(v)
} else {
- return perrors.Errorf("[Go restful] Path param parse error, the args:%v of type isn't int or string", k)
+ return perrors.Errorf("[Go restful] Path param parse error, the index %v args's type isn't int or string", k)
}
if err != nil {
return perrors.Errorf("[Go restful] Path param parse error, error is %v", perrors.WithStack(err))
diff --git a/protocol/rest/server/server_impl/go_restful_server.go b/protocol/rest/server/server_impl/go_restful_server.go
index 7f5e353..c7d971f 100644
--- a/protocol/rest/server/server_impl/go_restful_server.go
+++ b/protocol/rest/server/server_impl/go_restful_server.go
@@ -46,13 +46,13 @@ func init() {
var filterSlice []restful.FilterFunction
-// A rest server implement by go-restful
+// GoRestfulServer a rest server implement by go-restful
type GoRestfulServer struct {
srv *http.Server
container *restful.Container
}
-// A constructor of GoRestfulServer
+// NewGoRestfulServer a constructor of GoRestfulServer
func NewGoRestfulServer() server.RestServer {
return &GoRestfulServer{}
}
[dubbo-go] 08/13: remove new function
Posted by ba...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
baze pushed a commit to branch 1.4
in repository https://gitbox.apache.org/repos/asf/dubbo-go.git
commit 4736cdcdf005405c9c4d5c07979a6733c454053d
Author: Patrick <dr...@foxmail.com>
AuthorDate: Wed Apr 1 23:43:15 2020 +0800
remove new function
---
protocol/rest/server/server_impl/go_restful_server.go | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/protocol/rest/server/server_impl/go_restful_server.go b/protocol/rest/server/server_impl/go_restful_server.go
index 00b644f..667d58c 100644
--- a/protocol/rest/server/server_impl/go_restful_server.go
+++ b/protocol/rest/server/server_impl/go_restful_server.go
@@ -83,7 +83,7 @@ func (grs *GoRestfulServer) Start(url common.URL) {
// Publish a http api in go-restful server
// The routeFunc should be invoked when the server receive a request
func (grs *GoRestfulServer) Deploy(restMethodConfig *config.RestMethodConfig, routeFunc func(request server.RestServerRequest, response server.RestServerResponse)) {
- ws := new(restful.WebService)
+ ws := &restful.WebService{}
rf := func(req *restful.Request, resp *restful.Response) {
routeFunc(NewGoRestfulRequestAdapter(req), resp)
}
[dubbo-go] 13/13: format code
Posted by ba...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
baze pushed a commit to branch 1.4
in repository https://gitbox.apache.org/repos/asf/dubbo-go.git
commit ea865671c530c7fd3a2a5bae4c75af177bba8684
Author: Patrick <dr...@foxmail.com>
AuthorDate: Thu Jul 30 19:27:45 2020 +0800
format code
---
.../rest/server/server_impl/go_restful_server_test.go | 16 ++++++++--------
1 file changed, 8 insertions(+), 8 deletions(-)
diff --git a/protocol/rest/server/server_impl/go_restful_server_test.go b/protocol/rest/server/server_impl/go_restful_server_test.go
index 29a9ef8..b1e6606 100644
--- a/protocol/rest/server/server_impl/go_restful_server_test.go
+++ b/protocol/rest/server/server_impl/go_restful_server_test.go
@@ -37,18 +37,18 @@ func TestGoRestfulServerDeploySameUrl(t *testing.T) {
assert.NoError(t, err)
grs.Start(url)
rmc := &config.RestMethodConfig{
- Produces: "*/*",
- Consumes: "*/*",
- MethodType: "POST",
- Path: "/test",
+ Produces: "*/*",
+ Consumes: "*/*",
+ MethodType: "POST",
+ Path: "/test",
}
f := func(request server.RestServerRequest, response server.RestServerResponse) {}
grs.Deploy(rmc, f)
rmc1 := &config.RestMethodConfig{
- Produces: "*/*",
- Consumes: "*/*",
- MethodType: "GET",
- Path: "/test",
+ Produces: "*/*",
+ Consumes: "*/*",
+ MethodType: "GET",
+ Path: "/test",
}
grs.Deploy(rmc1, f)
grs.UnDeploy(rmc)
[dubbo-go] 03/13: remove adapter
Posted by ba...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
baze pushed a commit to branch 1.4
in repository https://gitbox.apache.org/repos/asf/dubbo-go.git
commit 9a9b3a7e264ad8811ba2e9f21987e526e92118d9
Author: Patrick <dr...@foxmail.com>
AuthorDate: Wed Apr 1 01:40:18 2020 +0800
remove adapter
---
.../rest/server/server_impl/go_restful_server.go | 58 +---------------------
1 file changed, 1 insertion(+), 57 deletions(-)
diff --git a/protocol/rest/server/server_impl/go_restful_server.go b/protocol/rest/server/server_impl/go_restful_server.go
index 3c81fe0..81043c8 100644
--- a/protocol/rest/server/server_impl/go_restful_server.go
+++ b/protocol/rest/server/server_impl/go_restful_server.go
@@ -79,9 +79,7 @@ func (grs *GoRestfulServer) Start(url common.URL) {
func (grs *GoRestfulServer) Deploy(restMethodConfig *config.RestMethodConfig, routeFunc func(request server.RestServerRequest, response server.RestServerResponse)) {
ws := new(restful.WebService)
rf := func(req *restful.Request, resp *restful.Response) {
- respAdapter := NewGoRestfulResponseAdapter(resp)
- reqAdapter := NewGoRestfulRequestAdapter(req)
- routeFunc(reqAdapter, respAdapter)
+ routeFunc(req, resp)
}
ws.Path(restMethodConfig.Path).
Produces(strings.Split(restMethodConfig.Produces, ",")...).
@@ -118,57 +116,3 @@ func GetNewGoRestfulServer() server.RestServer {
func AddGoRestfulServerFilter(filterFuc restful.FilterFunction) {
filterSlice = append(filterSlice, filterFuc)
}
-
-// Go Restful Request adapt to RestServerRequest
-type GoRestfulRequestAdapter struct {
- rawRequest *restful.Request
-}
-
-func (gra *GoRestfulRequestAdapter) PathParameter(name string) string {
- return gra.rawRequest.PathParameter(name)
-}
-
-func (gra *GoRestfulRequestAdapter) PathParameters() map[string]string {
- return gra.rawRequest.PathParameters()
-}
-
-func (gra *GoRestfulRequestAdapter) QueryParameter(name string) string {
- return gra.rawRequest.QueryParameter(name)
-}
-
-func (gra *GoRestfulRequestAdapter) QueryParameters(name string) []string {
- return gra.rawRequest.QueryParameters(name)
-}
-
-func (gra *GoRestfulRequestAdapter) BodyParameter(name string) (string, error) {
- return gra.rawRequest.BodyParameter(name)
-}
-
-func (gra *GoRestfulRequestAdapter) HeaderParameter(name string) string {
- return gra.rawRequest.HeaderParameter(name)
-}
-
-func (gra *GoRestfulRequestAdapter) ReadEntity(entityPointer interface{}) error {
- return gra.rawRequest.ReadEntity(entityPointer)
-}
-
-func NewGoRestfulRequestAdapter(rawRequest *restful.Request) server.RestServerRequest {
- return &GoRestfulRequestAdapter{rawRequest: rawRequest}
-}
-
-// Go Restful Request adapt to RestClientRequest
-type GoRestfulResponseAdapter struct {
- rawResponse *restful.Response
-}
-
-func (grsa *GoRestfulResponseAdapter) WriteError(httpStatus int, err error) (writeErr error) {
- return grsa.rawResponse.WriteError(httpStatus, err)
-}
-
-func (grsa *GoRestfulResponseAdapter) WriteEntity(value interface{}) error {
- return grsa.rawResponse.WriteEntity(value)
-}
-
-func NewGoRestfulResponseAdapter(rawResponse *restful.Response) server.RestServerResponse {
- return &GoRestfulResponseAdapter{rawResponse: rawResponse}
-}
[dubbo-go] 01/13: optimized code
Posted by ba...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
baze pushed a commit to branch 1.4
in repository https://gitbox.apache.org/repos/asf/dubbo-go.git
commit 8e85afdf48849223cbc1ea86f63ae2d58a41b40a
Author: Patrick <dr...@foxmail.com>
AuthorDate: Tue Mar 31 19:58:13 2020 +0800
optimized code
---
protocol/rest/server/server_impl/go_restful_server.go | 15 +++++++--------
1 file changed, 7 insertions(+), 8 deletions(-)
diff --git a/protocol/rest/server/server_impl/go_restful_server.go b/protocol/rest/server/server_impl/go_restful_server.go
index 69f36a5..812699b 100644
--- a/protocol/rest/server/server_impl/go_restful_server.go
+++ b/protocol/rest/server/server_impl/go_restful_server.go
@@ -81,29 +81,28 @@ func (grs *GoRestfulServer) Start(url common.URL) {
}
func (grs *GoRestfulServer) Deploy(invoker protocol.Invoker, restMethodConfig map[string]*config.RestMethodConfig) {
- svc := common.ServiceMap.GetService(invoker.GetUrl().Protocol, strings.TrimPrefix(invoker.GetUrl().Path, "/"))
for methodName, config := range restMethodConfig {
- // get method
- method := svc.Method()[methodName]
- argsTypes := method.ArgsType()
- replyType := method.ReplyType()
ws := new(restful.WebService)
ws.Path(config.Path).
Produces(strings.Split(config.Produces, ",")...).
Consumes(strings.Split(config.Consumes, ",")...).
- Route(ws.Method(config.MethodType).To(getFunc(methodName, invoker, argsTypes, replyType, config)))
+ Route(ws.Method(config.MethodType).To(getFunc(methodName, invoker, config)))
grs.container.Add(ws)
}
}
-func getFunc(methodName string, invoker protocol.Invoker, argsTypes []reflect.Type,
- replyType reflect.Type, config *config.RestMethodConfig) func(req *restful.Request, resp *restful.Response) {
+func getFunc(methodName string, invoker protocol.Invoker, config *config.RestMethodConfig) func(req *restful.Request, resp *restful.Response) {
return func(req *restful.Request, resp *restful.Response) {
var (
err error
args []interface{}
)
+ svc := common.ServiceMap.GetService(invoker.GetUrl().Protocol, strings.TrimPrefix(invoker.GetUrl().Path, "/"))
+ // get method
+ method := svc.Method()[methodName]
+ argsTypes := method.ArgsType()
+ replyType := method.ReplyType()
if (len(argsTypes) == 1 || len(argsTypes) == 2 && replyType == nil) &&
argsTypes[0].String() == "[]interface {}" {
args = getArgsInterfaceFromRequest(req, config)
[dubbo-go] 09/13: modify some comments
Posted by ba...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
baze pushed a commit to branch 1.4
in repository https://gitbox.apache.org/repos/asf/dubbo-go.git
commit f580ed0b8a080ceed6cff930b2bedbe826df8d0c
Author: Patrick <dr...@foxmail.com>
AuthorDate: Wed Apr 1 23:45:21 2020 +0800
modify some comments
---
.../rest/server/server_impl/go_restful_server.go | 22 +++++++++++-----------
1 file changed, 11 insertions(+), 11 deletions(-)
diff --git a/protocol/rest/server/server_impl/go_restful_server.go b/protocol/rest/server/server_impl/go_restful_server.go
index 667d58c..7f5e353 100644
--- a/protocol/rest/server/server_impl/go_restful_server.go
+++ b/protocol/rest/server/server_impl/go_restful_server.go
@@ -115,59 +115,59 @@ func (grs *GoRestfulServer) Destroy() {
logger.Infof("[Go Restful] Server exiting")
}
-// Let user add the http server of go-restful
+// AddGoRestfulServerFilter let user add the http server of go-restful
// addFilter should before config.Load()
func AddGoRestfulServerFilter(filterFuc restful.FilterFunction) {
filterSlice = append(filterSlice, filterFuc)
}
-// Adapter about RestServerRequest
+// GoRestfulRequestAdapter a adapter struct about RestServerRequest
type GoRestfulRequestAdapter struct {
server.RestServerRequest
request *restful.Request
}
-// A constructor of GoRestfulRequestAdapter
+// NewGoRestfulRequestAdapter a constructor of GoRestfulRequestAdapter
func NewGoRestfulRequestAdapter(request *restful.Request) *GoRestfulRequestAdapter {
return &GoRestfulRequestAdapter{request: request}
}
-// A adapter function of server.RestServerRequest's RawRequest
+// RawRequest a adapter function of server.RestServerRequest's RawRequest
func (grra *GoRestfulRequestAdapter) RawRequest() *http.Request {
return grra.request.Request
}
-// A adapter function of server.RestServerRequest's PathParameter
+// PathParameter a adapter function of server.RestServerRequest's PathParameter
func (grra *GoRestfulRequestAdapter) PathParameter(name string) string {
return grra.request.PathParameter(name)
}
-// A adapter function of server.RestServerRequest's QueryParameter
+// PathParameters a adapter function of server.RestServerRequest's QueryParameter
func (grra *GoRestfulRequestAdapter) PathParameters() map[string]string {
return grra.request.PathParameters()
}
-// A adapter function of server.RestServerRequest's QueryParameters
+// QueryParameter a adapter function of server.RestServerRequest's QueryParameters
func (grra *GoRestfulRequestAdapter) QueryParameter(name string) string {
return grra.request.QueryParameter(name)
}
-// A adapter function of server.RestServerRequest's QueryParameters
+// QueryParameters a adapter function of server.RestServerRequest's QueryParameters
func (grra *GoRestfulRequestAdapter) QueryParameters(name string) []string {
return grra.request.QueryParameters(name)
}
-// A adapter function of server.RestServerRequest's BodyParameter
+// BodyParameter a adapter function of server.RestServerRequest's BodyParameter
func (grra *GoRestfulRequestAdapter) BodyParameter(name string) (string, error) {
return grra.request.BodyParameter(name)
}
-// A adapter function of server.RestServerRequest's HeaderParameter
+// HeaderParameter a adapter function of server.RestServerRequest's HeaderParameter
func (grra *GoRestfulRequestAdapter) HeaderParameter(name string) string {
return grra.request.HeaderParameter(name)
}
-// A adapter func of server.RestServerRequest's ReadEntity
+// ReadEntity a adapter func of server.RestServerRequest's ReadEntity
func (grra *GoRestfulRequestAdapter) ReadEntity(entityPointer interface{}) error {
return grra.request.ReadEntity(entityPointer)
}
[dubbo-go] 04/13: optimize header transmit in RestClient and
RestServer
Posted by ba...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
baze pushed a commit to branch 1.4
in repository https://gitbox.apache.org/repos/asf/dubbo-go.git
commit bcb01004337eb1a3baf4390f905f649e4477ad85
Author: Patrick <dr...@foxmail.com>
AuthorDate: Wed Apr 1 19:05:58 2020 +0800
optimize header transmit in RestClient and RestServer
---
protocol/rest/client/client_impl/resty_client.go | 11 +++---
protocol/rest/client/rest_client.go | 5 +--
protocol/rest/rest_invoker.go | 23 ++++++++---
protocol/rest/server/rest_server.go | 4 ++
.../rest/server/server_impl/go_restful_server.go | 44 +++++++++++++++++++++-
5 files changed, 72 insertions(+), 15 deletions(-)
diff --git a/protocol/rest/client/client_impl/resty_client.go b/protocol/rest/client/client_impl/resty_client.go
index af9637e..9e0c80c 100644
--- a/protocol/rest/client/client_impl/resty_client.go
+++ b/protocol/rest/client/client_impl/resty_client.go
@@ -66,20 +66,19 @@ func NewRestyClient(restOption *client.RestOptions) client.RestClient {
}
func (rc *RestyClient) Do(restRequest *client.RestClientRequest, res interface{}) error {
- r, err := rc.client.R().
- SetHeader("Content-Type", restRequest.Consumes).
- SetHeader("Accept", restRequest.Produces).
+ req := rc.client.R()
+ req.Header = restRequest.Header
+ resp, err := req.
SetPathParams(restRequest.PathParams).
SetQueryParams(restRequest.QueryParams).
- SetHeaders(restRequest.Headers).
SetBody(restRequest.Body).
SetResult(res).
Execute(restRequest.Method, "http://"+path.Join(restRequest.Location, restRequest.Path))
if err != nil {
return perrors.WithStack(err)
}
- if r.IsError() {
- return perrors.New(r.String())
+ if resp.IsError() {
+ return perrors.New(resp.String())
}
return nil
}
diff --git a/protocol/rest/client/rest_client.go b/protocol/rest/client/rest_client.go
index 3acccb5..5be4bb3 100644
--- a/protocol/rest/client/rest_client.go
+++ b/protocol/rest/client/rest_client.go
@@ -18,6 +18,7 @@
package client
import (
+ "net/http"
"time"
)
@@ -27,15 +28,13 @@ type RestOptions struct {
}
type RestClientRequest struct {
+ Header http.Header
Location string
Path string
- Produces string
- Consumes string
Method string
PathParams map[string]string
QueryParams map[string]string
Body interface{}
- Headers map[string]string
}
type RestClient interface {
diff --git a/protocol/rest/rest_invoker.go b/protocol/rest/rest_invoker.go
index c8e3fea..121d121 100644
--- a/protocol/rest/rest_invoker.go
+++ b/protocol/rest/rest_invoker.go
@@ -20,6 +20,7 @@ package rest
import (
"context"
"fmt"
+ "net/http"
)
import (
@@ -56,7 +57,7 @@ func (ri *RestInvoker) Invoke(ctx context.Context, invocation protocol.Invocatio
body interface{}
pathParams map[string]string
queryParams map[string]string
- headers map[string]string
+ header http.Header
err error
)
if methodConfig == nil {
@@ -71,7 +72,7 @@ func (ri *RestInvoker) Invoke(ctx context.Context, invocation protocol.Invocatio
result.Err = err
return &result
}
- if headers, err = restStringMapTransform(methodConfig.HeadersMap, inv.Arguments()); err != nil {
+ if header, err = getRestHttpHeader(methodConfig, inv.Arguments()); err != nil {
result.Err = err
return &result
}
@@ -80,14 +81,12 @@ func (ri *RestInvoker) Invoke(ctx context.Context, invocation protocol.Invocatio
}
req := &client.RestClientRequest{
Location: ri.GetUrl().Location,
- Produces: methodConfig.Produces,
- Consumes: methodConfig.Consumes,
Method: methodConfig.MethodType,
Path: methodConfig.Path,
PathParams: pathParams,
QueryParams: queryParams,
Body: body,
- Headers: headers,
+ Header: header,
}
result.Err = ri.client.Do(req, inv.Reply())
if result.Err == nil {
@@ -106,3 +105,17 @@ func restStringMapTransform(paramsMap map[int]string, args []interface{}) (map[s
}
return resMap, nil
}
+
+func getRestHttpHeader(methodConfig *config.RestMethodConfig, args []interface{}) (http.Header, error) {
+ header := http.Header{}
+ headersMap := methodConfig.HeadersMap
+ header.Set("Content-Type", methodConfig.Consumes)
+ header.Set("Accept", methodConfig.Produces)
+ for k, v := range headersMap {
+ if k >= len(args) || k < 0 {
+ return nil, perrors.Errorf("[Rest Invoke] Index %v is out of bundle", k)
+ }
+ header.Set(v, fmt.Sprint(args[k]))
+ }
+ return header, nil
+}
diff --git a/protocol/rest/server/rest_server.go b/protocol/rest/server/rest_server.go
index b7eb555..7fb0560 100644
--- a/protocol/rest/server/rest_server.go
+++ b/protocol/rest/server/rest_server.go
@@ -46,6 +46,7 @@ type RestServer interface {
// RestServerRequest interface
type RestServerRequest interface {
+ RawRequest() *http.Request
PathParameter(name string) string
PathParameters() map[string]string
QueryParameter(name string) string
@@ -57,6 +58,9 @@ type RestServerRequest interface {
// RestServerResponse interface
type RestServerResponse interface {
+ Header() http.Header
+ Write([]byte) (int, error)
+ WriteHeader(statusCode int)
WriteError(httpStatus int, err error) (writeErr error)
WriteEntity(value interface{}) error
}
diff --git a/protocol/rest/server/server_impl/go_restful_server.go b/protocol/rest/server/server_impl/go_restful_server.go
index 81043c8..9163d3a 100644
--- a/protocol/rest/server/server_impl/go_restful_server.go
+++ b/protocol/rest/server/server_impl/go_restful_server.go
@@ -79,7 +79,7 @@ func (grs *GoRestfulServer) Start(url common.URL) {
func (grs *GoRestfulServer) Deploy(restMethodConfig *config.RestMethodConfig, routeFunc func(request server.RestServerRequest, response server.RestServerResponse)) {
ws := new(restful.WebService)
rf := func(req *restful.Request, resp *restful.Response) {
- routeFunc(req, resp)
+ routeFunc(NewGoRestfulRequestAdapter(req), resp)
}
ws.Path(restMethodConfig.Path).
Produces(strings.Split(restMethodConfig.Produces, ",")...).
@@ -116,3 +116,45 @@ func GetNewGoRestfulServer() server.RestServer {
func AddGoRestfulServerFilter(filterFuc restful.FilterFunction) {
filterSlice = append(filterSlice, filterFuc)
}
+
+// Adapter about RestServerRequest
+type GoRestfulRequestAdapter struct {
+ server.RestServerRequest
+ request *restful.Request
+}
+
+func NewGoRestfulRequestAdapter(request *restful.Request) *GoRestfulRequestAdapter {
+ return &GoRestfulRequestAdapter{request: request}
+}
+
+func (grra *GoRestfulRequestAdapter) RawRequest() *http.Request {
+ return grra.request.Request
+}
+
+func (grra *GoRestfulRequestAdapter) PathParameter(name string) string {
+ return grra.request.PathParameter(name)
+}
+
+func (grra *GoRestfulRequestAdapter) PathParameters() map[string]string {
+ return grra.request.PathParameters()
+}
+
+func (grra *GoRestfulRequestAdapter) QueryParameter(name string) string {
+ return grra.request.QueryParameter(name)
+}
+
+func (grra *GoRestfulRequestAdapter) QueryParameters(name string) []string {
+ return grra.request.QueryParameters(name)
+}
+
+func (grra *GoRestfulRequestAdapter) BodyParameter(name string) (string, error) {
+ return grra.request.BodyParameter(name)
+}
+
+func (grra *GoRestfulRequestAdapter) HeaderParameter(name string) string {
+ return grra.request.HeaderParameter(name)
+}
+
+func (grra *GoRestfulRequestAdapter) ReadEntity(entityPointer interface{}) error {
+ return grra.request.ReadEntity(entityPointer)
+}
[dubbo-go] 06/13: modify some comments and when parsing parameters
occurred error, return error immediately
Posted by ba...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
baze pushed a commit to branch 1.4
in repository https://gitbox.apache.org/repos/asf/dubbo-go.git
commit 79bd56cfefefb2431c36ab4ffecd81e37f3e13c7
Author: Patrick <dr...@foxmail.com>
AuthorDate: Wed Apr 1 23:38:08 2020 +0800
modify some comments and when parsing parameters occurred error, return error immediately
---
protocol/rest/client/client_impl/resty_client.go | 4 +-
protocol/rest/client/rest_client.go | 6 +-
protocol/rest/server/rest_server.go | 114 +++++++++++++----------
3 files changed, 71 insertions(+), 53 deletions(-)
diff --git a/protocol/rest/client/client_impl/resty_client.go b/protocol/rest/client/client_impl/resty_client.go
index bfd7445..b60f50a 100644
--- a/protocol/rest/client/client_impl/resty_client.go
+++ b/protocol/rest/client/client_impl/resty_client.go
@@ -40,11 +40,12 @@ func init() {
extension.SetRestClient(constant.DEFAULT_REST_CLIENT, NewRestyClient)
}
-// A rest client implement by Resty
+// RestyClient a rest client implement by Resty
type RestyClient struct {
client *resty.Client
}
+// NewRestyClient a constructor of RestyClient
func NewRestyClient(restOption *client.RestOptions) client.RestClient {
client := resty.New()
client.SetTransport(
@@ -66,6 +67,7 @@ func NewRestyClient(restOption *client.RestOptions) client.RestClient {
}
}
+// Do send request by RestyClient
func (rc *RestyClient) Do(restRequest *client.RestClientRequest, res interface{}) error {
req := rc.client.R()
req.Header = restRequest.Header
diff --git a/protocol/rest/client/rest_client.go b/protocol/rest/client/rest_client.go
index 47d17c6..d63c5e0 100644
--- a/protocol/rest/client/rest_client.go
+++ b/protocol/rest/client/rest_client.go
@@ -22,13 +22,13 @@ import (
"time"
)
-// Some rest options
+// RestOptions
type RestOptions struct {
RequestTimeout time.Duration
ConnectTimeout time.Duration
}
-// Client request
+// RestClientRequest
type RestClientRequest struct {
Header http.Header
Location string
@@ -39,7 +39,7 @@ type RestClientRequest struct {
Body interface{}
}
-// User can implement this client interface to send request
+// RestClient user can implement this client interface to send request
type RestClient interface {
Do(request *RestClientRequest, res interface{}) error
}
diff --git a/protocol/rest/server/rest_server.go b/protocol/rest/server/rest_server.go
index 60f0dab..60cac9a 100644
--- a/protocol/rest/server/rest_server.go
+++ b/protocol/rest/server/rest_server.go
@@ -19,6 +19,7 @@ package server
import (
"context"
+ "errors"
"net/http"
"reflect"
"strconv"
@@ -37,6 +38,8 @@ import (
rest_config "github.com/apache/dubbo-go/protocol/rest/config"
)
+const parseParameterErrorStr = "An error occurred while parsing parameters on the server"
+
type RestServer interface {
// start rest server
Start(url common.URL)
@@ -50,19 +53,19 @@ type RestServer interface {
// RestServerRequest interface
type RestServerRequest interface {
- // Get the Ptr of http.Request
+ // RawRequest get the Ptr of http.Request
RawRequest() *http.Request
- // Get the path parameter by name
+ // PathParameter get the path parameter by name
PathParameter(name string) string
- // Get the map of the path parameters
+ // PathParameters get the map of the path parameters
PathParameters() map[string]string
- // Get the query parameter by name
+ // QueryParameter get the query parameter by name
QueryParameter(name string) string
- // Get the map of query parameters
+ // QueryParameters get the map of query parameters
QueryParameters(name string) []string
- // Get the body parameter of name
+ // BodyParameter get the body parameter of name
BodyParameter(name string) (string, error)
- // Get the header parameter of name
+ // HeaderParameter get the header parameter of name
HeaderParameter(name string) string
// ReadEntity checks the Accept header and reads the content into the entityPointer.
ReadEntity(entityPointer interface{}) error
@@ -72,12 +75,13 @@ type RestServerRequest interface {
type RestServerResponse interface {
http.ResponseWriter
// WriteError writes the http status and the error string on the response. err can be nil.
- // Return an error if writing was not succesful.
+ // Return an error if writing was not successful.
WriteError(httpStatus int, err error) (writeErr error)
// WriteEntity marshals the value using the representation denoted by the Accept Header.
WriteEntity(value interface{}) error
}
+// GetRouteFunc
// A route function will be invoked by http server
func GetRouteFunc(invoker protocol.Invoker, methodConfig *rest_config.RestMethodConfig) func(req RestServerRequest, resp RestServerResponse) {
return func(req RestServerRequest, resp RestServerResponse) {
@@ -92,9 +96,16 @@ func GetRouteFunc(invoker protocol.Invoker, methodConfig *rest_config.RestMethod
replyType := method.ReplyType()
if (len(argsTypes) == 1 || len(argsTypes) == 2 && replyType == nil) &&
argsTypes[0].String() == "[]interface {}" {
- args = getArgsInterfaceFromRequest(req, methodConfig)
+ args, err = getArgsInterfaceFromRequest(req, methodConfig)
} else {
- args = getArgsFromRequest(req, argsTypes, methodConfig)
+ args, err = getArgsFromRequest(req, argsTypes, methodConfig)
+ }
+ if err != nil {
+ logger.Errorf("[Go Restful] parsing parameters error:%v", err)
+ err = resp.WriteError(http.StatusInternalServerError, errors.New(parseParameterErrorStr))
+ if err != nil {
+ logger.Errorf("[Go Restful] WriteErrorString error:%v", err)
+ }
}
result := invoker.Invoke(context.Background(), invocation.NewRPCInvocation(methodConfig.MethodName, args, make(map[string]string)))
if result.Error() != nil {
@@ -111,9 +122,9 @@ func GetRouteFunc(invoker protocol.Invoker, methodConfig *rest_config.RestMethod
}
}
-// when service function like GetUser(req []interface{}, rsp *User) error
+// getArgsInterfaceFromRequest when service function like GetUser(req []interface{}, rsp *User) error
// use this method to get arguments
-func getArgsInterfaceFromRequest(req RestServerRequest, methodConfig *rest_config.RestMethodConfig) []interface{} {
+func getArgsInterfaceFromRequest(req RestServerRequest, methodConfig *rest_config.RestMethodConfig) ([]interface{}, error) {
argsMap := make(map[int]interface{}, 8)
maxKey := 0
for k, v := range methodConfig.PathParamsMap {
@@ -145,10 +156,10 @@ func getArgsInterfaceFromRequest(req RestServerRequest, methodConfig *rest_confi
}
m := make(map[string]interface{})
// TODO read as a slice
- if err := req.ReadEntity(&m); err != nil {
- logger.Warnf("[Go restful] Read body entity as map[string]interface{} error:%v", perrors.WithStack(err))
- } else {
+ if err := req.ReadEntity(&m); err == nil {
argsMap[methodConfig.Body] = m
+ } else {
+ return nil, perrors.Errorf("[Go restful] Read body entity as map[string]interface{} error:%v", err)
}
}
args := make([]interface{}, maxKey+1)
@@ -157,30 +168,37 @@ func getArgsInterfaceFromRequest(req RestServerRequest, methodConfig *rest_confi
args[k] = v
}
}
- return args
+ return args, nil
}
-// get arguments from server.RestServerRequest
-func getArgsFromRequest(req RestServerRequest, argsTypes []reflect.Type, methodConfig *rest_config.RestMethodConfig) []interface{} {
+// getArgsFromRequest get arguments from server.RestServerRequest
+func getArgsFromRequest(req RestServerRequest, argsTypes []reflect.Type, methodConfig *rest_config.RestMethodConfig) ([]interface{}, error) {
argsLength := len(argsTypes)
args := make([]interface{}, argsLength)
for i, t := range argsTypes {
args[i] = reflect.Zero(t).Interface()
}
- assembleArgsFromPathParams(methodConfig, argsLength, argsTypes, req, args)
- assembleArgsFromQueryParams(methodConfig, argsLength, argsTypes, req, args)
- assembleArgsFromBody(methodConfig, argsTypes, req, args)
- assembleArgsFromHeaders(methodConfig, req, argsLength, argsTypes, args)
- return args
+ if err := assembleArgsFromPathParams(methodConfig, argsLength, argsTypes, req, args); err != nil {
+ return nil, err
+ }
+ if err := assembleArgsFromQueryParams(methodConfig, argsLength, argsTypes, req, args); err != nil {
+ return nil, err
+ }
+ if err := assembleArgsFromBody(methodConfig, argsTypes, req, args); err != nil {
+ return nil, err
+ }
+ if err := assembleArgsFromHeaders(methodConfig, req, argsLength, argsTypes, args); err != nil {
+ return nil, err
+ }
+ return args, nil
}
-// assemble arguments from headers
-func assembleArgsFromHeaders(methodConfig *rest_config.RestMethodConfig, req RestServerRequest, argsLength int, argsTypes []reflect.Type, args []interface{}) {
+// assembleArgsFromHeaders assemble arguments from headers
+func assembleArgsFromHeaders(methodConfig *rest_config.RestMethodConfig, req RestServerRequest, argsLength int, argsTypes []reflect.Type, args []interface{}) error {
for k, v := range methodConfig.HeadersMap {
param := req.HeaderParameter(v)
if k < 0 || k >= argsLength {
- logger.Errorf("[Go restful] Header param parse error, the args:%v doesn't exist", k)
- continue
+ return perrors.Errorf("[Go restful] Header param parse error, the args:%v doesn't exist", k)
}
t := argsTypes[k]
if t.Kind() == reflect.Ptr {
@@ -189,13 +207,14 @@ func assembleArgsFromHeaders(methodConfig *rest_config.RestMethodConfig, req Res
if t.Kind() == reflect.String {
args[k] = param
} else {
- logger.Errorf("[Go restful] Header param parse error, the args:%v of type isn't string", k)
+ return perrors.Errorf("[Go restful] Header param parse error, the args:%v of type isn't string", k)
}
}
+ return nil
}
-// assemble arguments from body
-func assembleArgsFromBody(methodConfig *rest_config.RestMethodConfig, argsTypes []reflect.Type, req RestServerRequest, args []interface{}) {
+// assembleArgsFromBody assemble arguments from body
+func assembleArgsFromBody(methodConfig *rest_config.RestMethodConfig, argsTypes []reflect.Type, req RestServerRequest, args []interface{}) error {
if methodConfig.Body >= 0 && methodConfig.Body < len(argsTypes) {
t := argsTypes[methodConfig.Body]
kind := t.Kind()
@@ -213,16 +232,17 @@ func assembleArgsFromBody(methodConfig *rest_config.RestMethodConfig, argsTypes
ni = n.Interface()
}
}
- if err := req.ReadEntity(&ni); err != nil {
- logger.Errorf("[Go restful] Read body entity error:%v", err)
- } else {
+ if err := req.ReadEntity(&ni); err == nil {
args[methodConfig.Body] = ni
+ } else {
+ return perrors.Errorf("[Go restful] Read body entity error, error is %v", perrors.WithStack(err))
}
}
+ return nil
}
-// assemble arguments from query params
-func assembleArgsFromQueryParams(methodConfig *rest_config.RestMethodConfig, argsLength int, argsTypes []reflect.Type, req RestServerRequest, args []interface{}) {
+// assembleArgsFromQueryParams assemble arguments from query params
+func assembleArgsFromQueryParams(methodConfig *rest_config.RestMethodConfig, argsLength int, argsTypes []reflect.Type, req RestServerRequest, args []interface{}) error {
var (
err error
param interface{}
@@ -230,8 +250,7 @@ func assembleArgsFromQueryParams(methodConfig *rest_config.RestMethodConfig, arg
)
for k, v := range methodConfig.QueryParamsMap {
if k < 0 || k >= argsLength {
- logger.Errorf("[Go restful] Query param parse error, the args:%v doesn't exist", k)
- continue
+ return perrors.Errorf("[Go restful] Query param parse error, the args:%v doesn't exist", k)
}
t := argsTypes[k]
kind := t.Kind()
@@ -252,19 +271,18 @@ func assembleArgsFromQueryParams(methodConfig *rest_config.RestMethodConfig, arg
} else if kind == reflect.Int64 {
param, err = strconv.ParseInt(req.QueryParameter(v), 10, 64)
} else {
- logger.Errorf("[Go restful] Query param parse error, the args:%v of type isn't int or string or slice", k)
- continue
+ return perrors.Errorf("[Go restful] Query param parse error, the args:%v of type isn't int or string or slice", k)
}
if err != nil {
- logger.Errorf("[Go restful] Query param parse error, error is %v", err)
- continue
+ return perrors.Errorf("[Go restful] Query param parse error, error:%v", perrors.WithStack(err))
}
args[k] = param
}
+ return nil
}
-// assemble arguments from path params
-func assembleArgsFromPathParams(methodConfig *rest_config.RestMethodConfig, argsLength int, argsTypes []reflect.Type, req RestServerRequest, args []interface{}) {
+// assembleArgsFromPathParams assemble arguments from path params
+func assembleArgsFromPathParams(methodConfig *rest_config.RestMethodConfig, argsLength int, argsTypes []reflect.Type, req RestServerRequest, args []interface{}) error {
var (
err error
param interface{}
@@ -272,8 +290,7 @@ func assembleArgsFromPathParams(methodConfig *rest_config.RestMethodConfig, args
)
for k, v := range methodConfig.PathParamsMap {
if k < 0 || k >= argsLength {
- logger.Errorf("[Go restful] Path param parse error, the args:%v doesn't exist", k)
- continue
+ return perrors.Errorf("[Go restful] Path param parse error, the args:%v doesn't exist", k)
}
t := argsTypes[k]
kind := t.Kind()
@@ -292,13 +309,12 @@ func assembleArgsFromPathParams(methodConfig *rest_config.RestMethodConfig, args
} else if kind == reflect.String {
param = req.PathParameter(v)
} else {
- logger.Warnf("[Go restful] Path param parse error, the args:%v of type isn't int or string", k)
- continue
+ return perrors.Errorf("[Go restful] Path param parse error, the args:%v of type isn't int or string", k)
}
if err != nil {
- logger.Errorf("[Go restful] Path param parse error, error is %v", err)
- continue
+ return perrors.Errorf("[Go restful] Path param parse error, error is %v", perrors.WithStack(err))
}
args[k] = param
}
+ return nil
}
[dubbo-go] 07/13: modify comments
Posted by ba...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
baze pushed a commit to branch 1.4
in repository https://gitbox.apache.org/repos/asf/dubbo-go.git
commit 6540c8907da701dd1d7d4cf84a4de3dd6208ebbd
Author: Patrick <dr...@foxmail.com>
AuthorDate: Wed Apr 1 23:40:10 2020 +0800
modify comments
---
protocol/rest/server/rest_server.go | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/protocol/rest/server/rest_server.go b/protocol/rest/server/rest_server.go
index 60cac9a..8bc32e8 100644
--- a/protocol/rest/server/rest_server.go
+++ b/protocol/rest/server/rest_server.go
@@ -40,14 +40,15 @@ import (
const parseParameterErrorStr = "An error occurred while parsing parameters on the server"
+// RestServer user can implement this server interface
type RestServer interface {
- // start rest server
+ // Start rest server
Start(url common.URL)
- // deploy a http api
+ // Deploy a http api
Deploy(restMethodConfig *rest_config.RestMethodConfig, routeFunc func(request RestServerRequest, response RestServerResponse))
- // unDeploy a http api
+ // UnDeploy a http api
UnDeploy(restMethodConfig *rest_config.RestMethodConfig)
- // destroy rest server
+ // Destroy rest server
Destroy()
}