Files
gortsplib/header.go
2020-01-26 16:19:26 +01:00

98 lines
1.6 KiB
Go

package gortsplib
import (
"bufio"
"fmt"
"sort"
)
const (
_MAX_HEADER_COUNT = 255
_MAX_HEADER_KEY_LENGTH = 255
_MAX_HEADER_VALUE_LENGTH = 255
)
// Header is a RTSP reader, present in both Requests and Responses.
type Header map[string][]string
func readHeader(rb *bufio.Reader) (Header, error) {
h := make(Header)
for {
byt, err := rb.ReadByte()
if err != nil {
return nil, err
}
if byt == '\r' {
err := readByteEqual(rb, '\n')
if err != nil {
return nil, err
}
break
}
if len(h) >= _MAX_HEADER_COUNT {
return nil, fmt.Errorf("headers count exceeds %d", _MAX_HEADER_COUNT)
}
key := string([]byte{byt})
byts, err := readBytesLimited(rb, ':', _MAX_HEADER_KEY_LENGTH-1)
if err != nil {
return nil, err
}
key += string(byts[:len(byts)-1])
err = readByteEqual(rb, ' ')
if err != nil {
return nil, err
}
byts, err = readBytesLimited(rb, '\r', _MAX_HEADER_VALUE_LENGTH)
if err != nil {
return nil, err
}
val := string(byts[:len(byts)-1])
if len(val) == 0 {
return nil, fmt.Errorf("empty header value")
}
err = readByteEqual(rb, '\n')
if err != nil {
return nil, err
}
h[key] = append(h[key], val)
}
return h, nil
}
func (h Header) write(wb *bufio.Writer) error {
// sort headers by key
// in order to obtain deterministic results
var keys []string
for key := range h {
keys = append(keys, key)
}
sort.Strings(keys)
for _, key := range keys {
for _, val := range h[key] {
_, err := wb.Write([]byte(key + ": " + val + "\r\n"))
if err != nil {
return err
}
}
}
_, err := wb.Write([]byte("\r\n"))
if err != nil {
return err
}
return nil
}