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()
 }