github.com/Axway/agent-sdk@v1.1.101/pkg/traceability/httpencoder.go (about) 1 package traceability 2 3 import ( 4 "bytes" 5 "compress/gzip" 6 "encoding/json" 7 "io" 8 "net/http" 9 ) 10 11 type bodyEncoder interface { 12 bulkBodyEncoder 13 Reader() io.Reader 14 Marshal(doc interface{}) error 15 } 16 17 type bulkBodyEncoder interface { 18 AddHeader(*http.Header) 19 Reset() 20 } 21 22 type jsonEncoder struct { 23 buf *bytes.Buffer 24 } 25 26 type gzipEncoder struct { 27 buf *bytes.Buffer 28 gzip *gzip.Writer 29 } 30 31 func newJSONEncoder(buf *bytes.Buffer) *jsonEncoder { 32 if buf == nil { 33 buf = bytes.NewBuffer(nil) 34 } 35 return &jsonEncoder{buf} 36 } 37 38 func (b *jsonEncoder) Reset() { 39 b.buf.Reset() 40 } 41 42 func (b *jsonEncoder) AddHeader(header *http.Header) { 43 header.Add("Content-Type", "application/json; charset=UTF-8") 44 } 45 46 func (b *jsonEncoder) Reader() io.Reader { 47 return b.buf 48 } 49 50 func (b *jsonEncoder) Marshal(obj interface{}) error { 51 b.Reset() 52 enc := json.NewEncoder(b.buf) 53 return enc.Encode(obj) 54 } 55 56 func newGzipEncoder(level int, buf *bytes.Buffer) (*gzipEncoder, error) { 57 if buf == nil { 58 buf = bytes.NewBuffer(nil) 59 } 60 w, err := gzip.NewWriterLevel(buf, level) 61 if err != nil { 62 return nil, err 63 } 64 65 return &gzipEncoder{buf, w}, nil 66 } 67 68 func (b *gzipEncoder) Reset() { 69 b.buf.Reset() 70 b.gzip.Reset(b.buf) 71 } 72 73 func (b *gzipEncoder) Reader() io.Reader { 74 b.gzip.Close() 75 return b.buf 76 } 77 78 func (b *gzipEncoder) AddHeader(header *http.Header) { 79 header.Add("Content-Type", "application/json; charset=UTF-8") 80 header.Add("Content-Encoding", "gzip") 81 } 82 83 func (b *gzipEncoder) Marshal(obj interface{}) error { 84 b.Reset() 85 enc := json.NewEncoder(b.gzip) 86 err := enc.Encode(obj) 87 return err 88 }