mirror of
https://github.com/aler9/gortsplib
synced 2025-10-05 15:16:51 +08:00
support multiple headers with same key
This commit is contained in:
98
utils.go
98
utils.go
@@ -4,16 +4,12 @@ import (
|
||||
"bufio"
|
||||
"fmt"
|
||||
"io"
|
||||
"sort"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
const (
|
||||
_RTSP_PROTO = "RTSP/1.0"
|
||||
_MAX_HEADER_COUNT = 255
|
||||
_MAX_HEADER_KEY_LENGTH = 255
|
||||
_MAX_HEADER_VALUE_LENGTH = 255
|
||||
_MAX_CONTENT_LENGTH = 4096
|
||||
_RTSP_PROTO = "RTSP/1.0"
|
||||
_MAX_CONTENT_LENGTH = 4096
|
||||
)
|
||||
|
||||
func readBytesLimited(rb *bufio.Reader, delim byte, n int) ([]byte, error) {
|
||||
@@ -44,95 +40,13 @@ func readByteEqual(rb *bufio.Reader, cmp byte) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func readHeaders(rb *bufio.Reader) (map[string]string, error) {
|
||||
ret := make(map[string]string)
|
||||
|
||||
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(ret) >= _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
|
||||
}
|
||||
|
||||
// set only if not set previously
|
||||
if _, ok := ret[key]; !ok {
|
||||
ret[key] = val
|
||||
}
|
||||
}
|
||||
|
||||
return ret, nil
|
||||
}
|
||||
|
||||
func writeHeaders(wb *bufio.Writer, headers map[string]string) error {
|
||||
// sort headers by key
|
||||
// in order to obtain deterministic results
|
||||
var keys []string
|
||||
for key := range headers {
|
||||
keys = append(keys, key)
|
||||
}
|
||||
sort.Strings(keys)
|
||||
|
||||
for _, key := range keys {
|
||||
_, err := wb.Write([]byte(key + ": " + headers[key] + "\r\n"))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
_, err := wb.Write([]byte("\r\n"))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func readContent(rb *bufio.Reader, headers map[string]string) ([]byte, error) {
|
||||
cls, ok := headers["Content-Length"]
|
||||
if !ok {
|
||||
func readContent(rb *bufio.Reader, header Header) ([]byte, error) {
|
||||
cls, ok := header["Content-Length"]
|
||||
if !ok || len(cls) != 1 {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
cl, err := strconv.ParseInt(cls, 10, 64)
|
||||
cl, err := strconv.ParseInt(cls[0], 10, 64)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("invalid Content-Length")
|
||||
}
|
||||
|
Reference in New Issue
Block a user