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  }