You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@apisix.apache.org by sh...@apache.org on 2022/03/07 02:02:47 UTC

[apisix-go-plugin-runner] branch master updated: feat(request): fetch request body support (#70)

This is an automated email from the ASF dual-hosted git repository.

shuaijinchao pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/apisix-go-plugin-runner.git


The following commit(s) were added to refs/heads/master by this push:
     new ade2e90  feat(request): fetch request body support (#70)
ade2e90 is described below

commit ade2e90be694adedda2bbeed48708e727b1cb11d
Author: 帅进超 <sh...@gmail.com>
AuthorDate: Mon Mar 7 10:02:40 2022 +0800

    feat(request): fetch request body support (#70)
---
 internal/http/request.go      | 19 +++++++++++++++
 internal/http/request_test.go | 57 +++++++++++++++++++++++++++++++++++++++++++
 pkg/http/http.go              |  7 ++++++
 3 files changed, 83 insertions(+)

diff --git a/internal/http/request.go b/internal/http/request.go
index ce7de9f..c37e64b 100644
--- a/internal/http/request.go
+++ b/internal/http/request.go
@@ -54,6 +54,7 @@ type Request struct {
 	rawArgs url.Values
 
 	vars map[string][]byte
+	body []byte
 
 	ctx    context.Context
 	cancel context.CancelFunc
@@ -162,6 +163,23 @@ func (r *Request) Var(name string) ([]byte, error) {
 	return v, nil
 }
 
+func (r *Request) Body() ([]byte, error) {
+	if len(r.body) > 0 {
+		return r.body, nil
+	}
+
+	builder := util.GetBuilder()
+	ei.ReqBodyStart(builder)
+	bodyInfo := ei.ReqBodyEnd(builder)
+	v, err := r.askExtraInfo(builder, ei.InfoReqBody, bodyInfo)
+	if err != nil {
+		return nil, err
+	}
+
+	r.body = v
+	return v, nil
+}
+
 func (r *Request) Reset() {
 	defer r.cancel()
 	r.path = nil
@@ -169,6 +187,7 @@ func (r *Request) Reset() {
 	r.args = nil
 
 	r.vars = nil
+	r.body = nil
 	r.conn = nil
 	r.ctx = nil
 
diff --git a/internal/http/request_test.go b/internal/http/request_test.go
index d276b5b..37e5294 100644
--- a/internal/http/request_test.go
+++ b/internal/http/request_test.go
@@ -398,3 +398,60 @@ func TestContext(t *testing.T) {
 	ReuseRequest(r)
 	assert.Equal(t, r.ctx, nil)
 }
+
+func TestBody(t *testing.T) {
+	out := buildReq(reqOpt{})
+	r := CreateRequest(out)
+
+	cc, sc := net.Pipe()
+	r.BindConn(cc)
+
+	go func() {
+		header := make([]byte, util.HeaderLen)
+		n, err := sc.Read(header)
+		if util.ReadErr(n, err, util.HeaderLen) {
+			return
+		}
+
+		ty := header[0]
+		assert.Equal(t, byte(util.RPCExtraInfo), ty)
+		header[0] = 0
+		length := binary.BigEndian.Uint32(header)
+
+		buf := make([]byte, length)
+		n, err = sc.Read(buf)
+		if util.ReadErr(n, err, int(length)) {
+			return
+		}
+
+		req := ei.GetRootAsReq(buf, 0)
+		assert.Equal(t, ei.InfoReqBody, req.InfoType())
+
+		builder := util.GetBuilder()
+		res := builder.CreateByteVector([]byte("Hello, Go Runner"))
+		ei.RespStart(builder)
+		ei.RespAddResult(builder, res)
+		eiRes := ei.RespEnd(builder)
+		builder.Finish(eiRes)
+		out := builder.FinishedBytes()
+		size := len(out)
+		binary.BigEndian.PutUint32(header, uint32(size))
+		header[0] = util.RPCExtraInfo
+
+		n, err = sc.Write(header)
+		if err != nil {
+			util.WriteErr(n, err)
+			return
+		}
+
+		n, err = sc.Write(out)
+		if err != nil {
+			util.WriteErr(n, err)
+			return
+		}
+	}()
+
+	v, err := r.Body()
+	assert.Nil(t, err)
+	assert.Equal(t, "Hello, Go Runner", string(v))
+}
diff --git a/pkg/http/http.go b/pkg/http/http.go
index 4fed2f6..90916e3 100644
--- a/pkg/http/http.go
+++ b/pkg/http/http.go
@@ -60,6 +60,13 @@ type Request interface {
 	// pkg/common.ErrConnClosed type is returned.
 	Var(name string) ([]byte, error)
 
+	// Body returns HTTP request body
+	//
+	// To fetch the value, the runner will look up the request's cache first. If not found,
+	// the runner will ask it from the APISIX. If the RPC call is failed, an error in
+	// pkg/common.ErrConnClosed type is returned.
+	Body() ([]byte, error)
+
 	// Context returns the request's context.
 	//
 	// The returned context is always non-nil; it defaults to the