github.com/aavshr/aws-sdk-go@v1.41.3/private/protocol/eventstream/header.go (about)

     1  package eventstream
     2  
     3  import (
     4  	"encoding/binary"
     5  	"fmt"
     6  	"io"
     7  )
     8  
     9  // Headers are a collection of EventStream header values.
    10  type Headers []Header
    11  
    12  // Header is a single EventStream Key Value header pair.
    13  type Header struct {
    14  	Name  string
    15  	Value Value
    16  }
    17  
    18  // Set associates the name with a value. If the header name already exists in
    19  // the Headers the value will be replaced with the new one.
    20  func (hs *Headers) Set(name string, value Value) {
    21  	var i int
    22  	for ; i < len(*hs); i++ {
    23  		if (*hs)[i].Name == name {
    24  			(*hs)[i].Value = value
    25  			return
    26  		}
    27  	}
    28  
    29  	*hs = append(*hs, Header{
    30  		Name: name, Value: value,
    31  	})
    32  }
    33  
    34  // Get returns the Value associated with the header. Nil is returned if the
    35  // value does not exist.
    36  func (hs Headers) Get(name string) Value {
    37  	for i := 0; i < len(hs); i++ {
    38  		if h := hs[i]; h.Name == name {
    39  			return h.Value
    40  		}
    41  	}
    42  	return nil
    43  }
    44  
    45  // Del deletes the value in the Headers if it exists.
    46  func (hs *Headers) Del(name string) {
    47  	for i := 0; i < len(*hs); i++ {
    48  		if (*hs)[i].Name == name {
    49  			copy((*hs)[i:], (*hs)[i+1:])
    50  			(*hs) = (*hs)[:len(*hs)-1]
    51  		}
    52  	}
    53  }
    54  
    55  // Clone returns a deep copy of the headers
    56  func (hs Headers) Clone() Headers {
    57  	o := make(Headers, 0, len(hs))
    58  	for _, h := range hs {
    59  		o.Set(h.Name, h.Value)
    60  	}
    61  	return o
    62  }
    63  
    64  func decodeHeaders(r io.Reader) (Headers, error) {
    65  	hs := Headers{}
    66  
    67  	for {
    68  		name, err := decodeHeaderName(r)
    69  		if err != nil {
    70  			if err == io.EOF {
    71  				// EOF while getting header name means no more headers
    72  				break
    73  			}
    74  			return nil, err
    75  		}
    76  
    77  		value, err := decodeHeaderValue(r)
    78  		if err != nil {
    79  			return nil, err
    80  		}
    81  
    82  		hs.Set(name, value)
    83  	}
    84  
    85  	return hs, nil
    86  }
    87  
    88  func decodeHeaderName(r io.Reader) (string, error) {
    89  	var n headerName
    90  
    91  	var err error
    92  	n.Len, err = decodeUint8(r)
    93  	if err != nil {
    94  		return "", err
    95  	}
    96  
    97  	name := n.Name[:n.Len]
    98  	if _, err := io.ReadFull(r, name); err != nil {
    99  		return "", err
   100  	}
   101  
   102  	return string(name), nil
   103  }
   104  
   105  func decodeHeaderValue(r io.Reader) (Value, error) {
   106  	var raw rawValue
   107  
   108  	typ, err := decodeUint8(r)
   109  	if err != nil {
   110  		return nil, err
   111  	}
   112  	raw.Type = valueType(typ)
   113  
   114  	var v Value
   115  
   116  	switch raw.Type {
   117  	case trueValueType:
   118  		v = BoolValue(true)
   119  	case falseValueType:
   120  		v = BoolValue(false)
   121  	case int8ValueType:
   122  		var tv Int8Value
   123  		err = tv.decode(r)
   124  		v = tv
   125  	case int16ValueType:
   126  		var tv Int16Value
   127  		err = tv.decode(r)
   128  		v = tv
   129  	case int32ValueType:
   130  		var tv Int32Value
   131  		err = tv.decode(r)
   132  		v = tv
   133  	case int64ValueType:
   134  		var tv Int64Value
   135  		err = tv.decode(r)
   136  		v = tv
   137  	case bytesValueType:
   138  		var tv BytesValue
   139  		err = tv.decode(r)
   140  		v = tv
   141  	case stringValueType:
   142  		var tv StringValue
   143  		err = tv.decode(r)
   144  		v = tv
   145  	case timestampValueType:
   146  		var tv TimestampValue
   147  		err = tv.decode(r)
   148  		v = tv
   149  	case uuidValueType:
   150  		var tv UUIDValue
   151  		err = tv.decode(r)
   152  		v = tv
   153  	default:
   154  		panic(fmt.Sprintf("unknown value type %d", raw.Type))
   155  	}
   156  
   157  	// Error could be EOF, let caller deal with it
   158  	return v, err
   159  }
   160  
   161  const maxHeaderNameLen = 255
   162  
   163  type headerName struct {
   164  	Len  uint8
   165  	Name [maxHeaderNameLen]byte
   166  }
   167  
   168  func (v headerName) encode(w io.Writer) error {
   169  	if err := binary.Write(w, binary.BigEndian, v.Len); err != nil {
   170  		return err
   171  	}
   172  
   173  	_, err := w.Write(v.Name[:v.Len])
   174  	return err
   175  }