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

monkeydluffy 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 3bf72a2  refactor: encapsulating releated methods in the inHTTP.Header 
object (#156)
3bf72a2 is described below

commit 3bf72a2e952bec5ea8b1f32b7c9714cbc9d826be
Author: 唐小鸭 <[email protected]>
AuthorDate: Mon Jan 22 10:20:26 2024 +0800

    refactor: encapsulating releated methods in the inHTTP.Header object (#156)
---
 .github/workflows/lint.yml |  2 +-
 internal/http/header.go    | 95 +++++++++++++++++++++++++++++++++++++++++++---
 internal/http/request.go   | 49 ++----------------------
 internal/http/response.go  | 51 ++-----------------------
 pkg/http/http.go           |  4 ++
 5 files changed, 103 insertions(+), 98 deletions(-)

diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml
index c1a3b12..5ee2bf7 100644
--- a/.github/workflows/lint.yml
+++ b/.github/workflows/lint.yml
@@ -57,7 +57,7 @@ jobs:
       - name: run goimports
         working-directory: ./
         run: |
-          go get golang.org/x/tools/cmd/goimports
+          go install golang.org/x/tools/cmd/[email protected]
           export PATH=$PATH:$(go env GOPATH)/bin/
           diffs=`goimports -d .`
           if [[ -n $diffs ]]; then
diff --git a/internal/http/header.go b/internal/http/header.go
index 0723712..e57eb12 100644
--- a/internal/http/header.go
+++ b/internal/http/header.go
@@ -17,18 +17,103 @@
 
 package http
 
-import "net/http"
+import (
+       "net/http"
+
+       "github.com/api7/ext-plugin-proto/go/A6"
+       hrc "github.com/api7/ext-plugin-proto/go/A6/HTTPReqCall"
+       flatbuffers "github.com/google/flatbuffers/go"
+)
+
+type ReadHeader interface {
+       HeadersLength() int
+       Headers(*A6.TextEntry, int) bool
+}
 
 type Header struct {
-       http.Header
+       hdr    http.Header
+       rawHdr http.Header
+
+       deleteField map[string]struct{}
 }
 
-func newHeader() *Header {
+func newHeader(r ReadHeader) *Header {
+       hh := http.Header{}
+       size := r.HeadersLength()
+       obj := A6.TextEntry{}
+       for i := 0; i < size; i++ {
+               if r.Headers(&obj, i) {
+                       hh.Add(string(obj.Name()), string(obj.Value()))
+               }
+       }
+
        return &Header{
-               Header: http.Header{},
+               hdr:    http.Header{},
+               rawHdr: hh,
+
+               deleteField: make(map[string]struct{}),
+       }
+}
+
+func (h *Header) Set(key, value string) {
+       h.hdr.Set(key, value)
+       delete(h.deleteField, key)
+}
+
+func (h *Header) Del(key string) {
+       if h.rawHdr.Get(key) != "" {
+               h.deleteField[key] = struct{}{}
+               h.rawHdr.Del(key)
+       }
+
+       h.hdr.Del(key)
+}
+
+func (h *Header) Get(key string) string {
+       if v := h.hdr.Get(key); v != "" {
+               return v
        }
+
+       return h.rawHdr.Get(key)
 }
 
+// View
+// Deprecated: refactoring
 func (h *Header) View() http.Header {
-       return h.Header
+       return h.hdr
+}
+
+func (h *Header) Build(builder *flatbuffers.Builder) flatbuffers.UOffsetT {
+       var hdrs []flatbuffers.UOffsetT
+
+       // deleted
+       for d := range h.deleteField {
+               name := builder.CreateString(d)
+               A6.TextEntryStart(builder)
+               A6.TextEntryAddName(builder, name)
+               te := A6.TextEntryEnd(builder)
+               hdrs = append(hdrs, te)
+       }
+
+       // set
+       for hKey, hVal := range h.hdr {
+               if raw, ok := h.rawHdr[hKey]; !ok || raw[0] != hVal[0] {
+                       name := builder.CreateString(hKey)
+                       value := builder.CreateString(hVal[0])
+                       A6.TextEntryStart(builder)
+                       A6.TextEntryAddName(builder, name)
+                       A6.TextEntryAddValue(builder, value)
+                       te := A6.TextEntryEnd(builder)
+                       hdrs = append(hdrs, te)
+               }
+       }
+
+       size := len(hdrs)
+       hrc.RewriteStartHeadersVector(builder, size)
+       for i := size - 1; i >= 0; i-- {
+               te := hdrs[i]
+               builder.PrependUOffsetT(te)
+       }
+
+       return builder.EndVector(size)
 }
diff --git a/internal/http/request.go b/internal/http/request.go
index 005c5f2..21295a3 100644
--- a/internal/http/request.go
+++ b/internal/http/request.go
@@ -47,8 +47,7 @@ type Request struct {
 
        path []byte
 
-       hdr    *Header
-       rawHdr http.Header
+       hdr *Header
 
        args    url.Values
        rawArgs url.Values
@@ -91,18 +90,9 @@ func (r *Request) SetPath(path []byte) {
 
 func (r *Request) Header() pkgHTTP.Header {
        if r.hdr == nil {
-               hdr := newHeader()
-               hh := hdr.View()
-               size := r.r.HeadersLength()
-               obj := A6.TextEntry{}
-               for i := 0; i < size; i++ {
-                       if r.r.Headers(&obj, i) {
-                               hh.Add(string(obj.Name()), string(obj.Value()))
-                       }
-               }
-               r.hdr = hdr
-               r.rawHdr = hdr.Clone()
+               r.hdr = newHeader(r.r)
        }
+
        return r.hdr
 }
 
@@ -225,38 +215,7 @@ func (r *Request) FetchChanges(id uint32, builder 
*flatbuffers.Builder) bool {
 
        var hdrVec, respHdrVec flatbuffers.UOffsetT
        if r.hdr != nil {
-               hdrs := []flatbuffers.UOffsetT{}
-               oldHdr := r.rawHdr
-               newHdr := r.hdr.View()
-               for n := range oldHdr {
-                       if _, ok := newHdr[n]; !ok {
-                               // deleted
-                               name := builder.CreateString(n)
-                               A6.TextEntryStart(builder)
-                               A6.TextEntryAddName(builder, name)
-                               te := A6.TextEntryEnd(builder)
-                               hdrs = append(hdrs, te)
-                       }
-               }
-               for n, v := range newHdr {
-                       if raw, ok := oldHdr[n]; !ok || raw[0] != v[0] {
-                               // set
-                               name := builder.CreateString(n)
-                               value := builder.CreateString(v[0])
-                               A6.TextEntryStart(builder)
-                               A6.TextEntryAddName(builder, name)
-                               A6.TextEntryAddValue(builder, value)
-                               te := A6.TextEntryEnd(builder)
-                               hdrs = append(hdrs, te)
-                       }
-               }
-               size := len(hdrs)
-               hrc.RewriteStartHeadersVector(builder, size)
-               for i := size - 1; i >= 0; i-- {
-                       te := hdrs[i]
-                       builder.PrependUOffsetT(te)
-               }
-               hdrVec = builder.EndVector(size)
+               hdrVec = r.hdr.Build(builder)
        }
 
        if r.respHdr != nil {
diff --git a/internal/http/response.go b/internal/http/response.go
index 7d7870e..c48fbaf 100644
--- a/internal/http/response.go
+++ b/internal/http/response.go
@@ -21,7 +21,6 @@ import (
        "bytes"
        "encoding/binary"
        "net"
-       "net/http"
        "sync"
 
        "github.com/apache/apisix-go-plugin-runner/internal/util"
@@ -30,7 +29,6 @@ import (
 
        pkgHTTP "github.com/apache/apisix-go-plugin-runner/pkg/http"
        "github.com/apache/apisix-go-plugin-runner/pkg/log"
-       "github.com/api7/ext-plugin-proto/go/A6"
        hrc "github.com/api7/ext-plugin-proto/go/A6/HTTPRespCall"
        flatbuffers "github.com/google/flatbuffers/go"
 )
@@ -41,8 +39,7 @@ type Response struct {
        conn            net.Conn
        extraInfoHeader []byte
 
-       hdr    *Header
-       rawHdr http.Header
+       hdr *Header
 
        statusCode int
 
@@ -120,18 +117,9 @@ func (r *Response) StatusCode() int {
 
 func (r *Response) Header() pkgHTTP.Header {
        if r.hdr == nil {
-               hdr := newHeader()
-               hh := hdr.View()
-               size := r.r.HeadersLength()
-               obj := A6.TextEntry{}
-               for i := 0; i < size; i++ {
-                       if r.r.Headers(&obj, i) {
-                               hh.Add(string(obj.Name()), string(obj.Value()))
-                       }
-               }
-               r.hdr = hdr
-               r.rawHdr = hdr.Clone()
+               r.hdr = newHeader(r.r)
        }
+
        return r.hdr
 }
 
@@ -214,38 +202,7 @@ func (r *Response) FetchChanges(builder 
*flatbuffers.Builder) bool {
 
        var hdrVec flatbuffers.UOffsetT
        if r.hdr != nil {
-               hdrs := []flatbuffers.UOffsetT{}
-               oldHdr := r.rawHdr
-               newHdr := r.hdr.View()
-               for n := range oldHdr {
-                       if _, ok := newHdr[n]; !ok {
-                               // deleted
-                               name := builder.CreateString(n)
-                               A6.TextEntryStart(builder)
-                               A6.TextEntryAddName(builder, name)
-                               te := A6.TextEntryEnd(builder)
-                               hdrs = append(hdrs, te)
-                       }
-               }
-               for n, v := range newHdr {
-                       if raw, ok := oldHdr[n]; !ok || raw[0] != v[0] {
-                               // set
-                               name := builder.CreateString(n)
-                               value := builder.CreateString(v[0])
-                               A6.TextEntryStart(builder)
-                               A6.TextEntryAddName(builder, name)
-                               A6.TextEntryAddValue(builder, value)
-                               te := A6.TextEntryEnd(builder)
-                               hdrs = append(hdrs, te)
-                       }
-               }
-               size := len(hdrs)
-               hrc.RespStartHeadersVector(builder, size)
-               for i := size - 1; i >= 0; i-- {
-                       te := hdrs[i]
-                       builder.PrependUOffsetT(te)
-               }
-               hdrVec = builder.EndVector(size)
+               hdrVec = r.hdr.Build(builder)
        }
 
        var bodyVec flatbuffers.UOffsetT
diff --git a/pkg/http/http.go b/pkg/http/http.go
index fdb0294..600eaa6 100644
--- a/pkg/http/http.go
+++ b/pkg/http/http.go
@@ -134,14 +134,18 @@ type Header interface {
        // It replaces any existing values associated with key.
        // The key is case insensitive
        Set(key, value string)
+
        // Del deletes the values associated with key. The key is case 
insensitive
        Del(key string)
+
        // Get gets the first value associated with the given key.
        // If there are no values associated with the key, Get returns "".
        // It is case insensitive
        Get(key string) string
+
        // View returns the internal structure. It is expected for read 
operations. Any write operation
        // won't be recorded
+       //Deprecated: refactoring
        View() http.Header
 
        // TODO: support Add

Reply via email to