Skip to content

Commit

Permalink
Add rewrite:RespHeaders and modify the upstream response headers vi…
Browse files Browse the repository at this point in the history
…a `request` implementation

Add `rewrite:RespHeaders` and modify the upstream response headers via `request` implementation
  • Loading branch information
rampagecong committed Feb 22, 2022
1 parent 8fdac12 commit d498697
Show file tree
Hide file tree
Showing 3 changed files with 92 additions and 3 deletions.
38 changes: 36 additions & 2 deletions internal/http/request.go
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,8 @@ type Request struct {
hdr *Header
rawHdr http.Header

respHdr http.Header

args url.Values
rawArgs url.Values

Expand Down Expand Up @@ -103,6 +105,13 @@ func (r *Request) Header() pkgHTTP.Header {
return r.hdr
}

func (r *Request) RespHeader() http.Header {
if r.respHdr == nil {
r.respHdr = http.Header{}
}
return r.respHdr
}

func cloneUrlValues(oldV url.Values) url.Values {
nv := 0
for _, vv := range oldV {
Expand Down Expand Up @@ -177,7 +186,7 @@ func (r *Request) Reset() {
}

func (r *Request) FetchChanges(id uint32, builder *flatbuffers.Builder) bool {
if r.path == nil && r.hdr == nil && r.args == nil {
if r.path == nil && r.hdr == nil && r.args == nil && r.respHdr == nil{
return false
}

Expand All @@ -186,7 +195,7 @@ func (r *Request) FetchChanges(id uint32, builder *flatbuffers.Builder) bool {
path = builder.CreateByteString(r.path)
}

var hdrVec flatbuffers.UOffsetT
var hdrVec,respHdrVec flatbuffers.UOffsetT
if r.hdr != nil {
hdrs := []flatbuffers.UOffsetT{}
oldHdr := r.rawHdr
Expand Down Expand Up @@ -222,6 +231,28 @@ func (r *Request) FetchChanges(id uint32, builder *flatbuffers.Builder) bool {
hdrVec = builder.EndVector(size)
}

if r.respHdr != nil {
respHdrs := []flatbuffers.UOffsetT{}
for n, arr := range r.respHdr {
for _, v := range arr {
name := builder.CreateString(n)
value := builder.CreateString(v)
A6.TextEntryStart(builder)
A6.TextEntryAddName(builder, name)
A6.TextEntryAddValue(builder, value)
te := A6.TextEntryEnd(builder)
respHdrs = append(respHdrs, te)
}
}
size := len(respHdrs)
hrc.RewriteStartRespHeadersVector(builder, size)
for i := size - 1; i >= 0; i-- {
te := respHdrs[i]
builder.PrependUOffsetT(te)
}
respHdrVec = builder.EndVector(size)
}

var argsVec flatbuffers.UOffsetT
if r.args != nil {
args := []flatbuffers.UOffsetT{}
Expand Down Expand Up @@ -267,6 +298,9 @@ func (r *Request) FetchChanges(id uint32, builder *flatbuffers.Builder) bool {
if hdrVec > 0 {
hrc.RewriteAddHeaders(builder, hdrVec)
}
if respHdrVec > 0{
hrc.RewriteAddRespHeaders(builder,respHdrVec)
}
if argsVec > 0 {
hrc.RewriteAddArgs(builder, argsVec)
}
Expand Down
55 changes: 54 additions & 1 deletion internal/http/request_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ type reqOpt struct {
method A6.Method
path string
headers []pair
respHeader []pair
args []pair
}

Expand All @@ -87,7 +88,7 @@ func buildReq(opt reqOpt) []byte {
}

hdrLen := len(opt.headers)
var hdrVec flatbuffers.UOffsetT
var hdrVec,respHdrVec flatbuffers.UOffsetT
if hdrLen > 0 {
hdrs := []flatbuffers.UOffsetT{}
for _, v := range opt.headers {
Expand All @@ -108,6 +109,26 @@ func buildReq(opt reqOpt) []byte {
hdrVec = builder.EndVector(size)
}

if len(opt.respHeader) > 0 {
respHdrs := []flatbuffers.UOffsetT{}
for _, v := range opt.headers {
name := builder.CreateString(v.name)
value := builder.CreateString(v.value)
A6.TextEntryStart(builder)
A6.TextEntryAddName(builder, name)
A6.TextEntryAddValue(builder, value)
te := A6.TextEntryEnd(builder)
respHdrs = append(respHdrs, te)
}
size := len(respHdrs)
hrc.RewriteStartRespHeadersVector(builder, size)
for i := size - 1; i >= 0; i-- {
te := respHdrs[i]
builder.PrependUOffsetT(te)
}
respHdrVec = builder.EndVector(size)
}

argsLen := len(opt.args)
var argsVec flatbuffers.UOffsetT
if argsLen > 0 {
Expand Down Expand Up @@ -145,6 +166,9 @@ func buildReq(opt reqOpt) []byte {
if hdrVec > 0 {
hrc.ReqAddHeaders(builder, hdrVec)
}
if respHdrVec > 0{
hrc.RewriteAddRespHeaders(builder,respHdrVec)
}
if argsVec > 0 {
hrc.ReqAddArgs(builder, argsVec)
}
Expand Down Expand Up @@ -235,6 +259,8 @@ func TestHeader(t *testing.T) {
assert.Equal(t, exp, res)
}



func TestArgs(t *testing.T) {
out := buildReq(reqOpt{args: []pair{
{"del", "a"},
Expand Down Expand Up @@ -398,3 +424,30 @@ func TestContext(t *testing.T) {
ReuseRequest(r)
assert.Equal(t, r.ctx, nil)
}

func TestRespHeader(t *testing.T){
out := buildReq(reqOpt{})
r := CreateRequest(out)
respHdr := r.RespHeader()

respHdr.Set("resp-header","this is resp-header")
respHdr.Set("Set-Cookie","mycookie=test")

respHdr.Del("resp-header")

builder := util.GetBuilder()
assert.True(t, r.FetchChanges(1, builder))
rewrite := getRewriteAction(t, builder)
assert.Equal(t, 1, rewrite.RespHeadersLength())

exp := http.Header{}
exp.Set("Set-Cookie", "mycookie=test")
res := http.Header{}
for i := 0; i < rewrite.RespHeadersLength(); i++ {
e := &A6.TextEntry{}
rewrite.RespHeaders(e, i)
res.Add(string(e.Name()), string(e.Value()))
}
assert.Equal(t, exp, res)

}
2 changes: 2 additions & 0 deletions pkg/http/http.go
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,8 @@ type Request interface {
SetPath([]byte)
// Header returns the HTTP headers
Header() Header
// RespHeader returns the response header
RespHeader() http.Header
// Args returns the query string
Args() url.Values

Expand Down

0 comments on commit d498697

Please sign in to comment.