headers: fix case in which a missing key was not detected

This commit is contained in:
aler9
2021-05-04 17:22:59 +02:00
parent 020d96f7eb
commit 178fe919ea
5 changed files with 56 additions and 16 deletions

View File

@@ -2,15 +2,29 @@ package headers
import (
"fmt"
"strings"
)
func findValue(str string, separator byte) (string, string, error) {
func readKey(origstr string, str string, separator byte) (string, string, error) {
i := 0
for {
if i >= len(str) || str[i] == separator {
return "", "", fmt.Errorf("unable to read key (%v)", origstr)
}
if str[i] == '=' {
break
}
i++
}
return str[:i], str[i+1:], nil
}
func readValue(origstr string, str string, separator byte) (string, string, error) {
if len(str) > 0 && str[0] == '"' {
i := 1
for {
if i >= len(str) {
return "", "", fmt.Errorf("apexes not closed (%v)", str)
return "", "", fmt.Errorf("apexes not closed (%v)", origstr)
}
if str[i] == '"' {
@@ -26,25 +40,24 @@ func findValue(str string, separator byte) (string, string, error) {
if i >= len(str) || str[i] == separator {
return str[:i], str[i:], nil
}
i++
}
}
func keyValParse(str string, separator byte) (map[string]string, error) {
ret := make(map[string]string)
origstr := str
for len(str) > 0 {
i := strings.IndexByte(str, '=')
if i < 0 {
return nil, fmt.Errorf("unable to find key (%v)", str)
}
var k string
k, str = str[:i], str[i+1:]
var err error
k, str, err = readKey(origstr, str, separator)
if err != nil {
return nil, err
}
var v string
var err error
v, str, err = findValue(str, separator)
v, str, err = readValue(origstr, str, separator)
if err != nil {
return nil, err
}

View File

@@ -70,12 +70,17 @@ func TestKeyValParseError(t *testing.T) {
{
"apexes not closed",
`key1="v,1`,
"apexes not closed (\"v,1)",
"apexes not closed (key1=\"v,1)",
},
{
"no key",
`value`,
"unable to find key (value)",
"no key 1",
`key=val,missing`,
"unable to read key (key=val,missing)",
},
{
"no key 2",
`missing,key=val`,
"unable to read key (missing,key=val)",
},
} {
t.Run(ca.name, func(t *testing.T) {

View File

@@ -39,6 +39,8 @@ func (h *RTPInfo) Read(v base.HeaderValue) error {
return err
}
fmt.Println("kvs", kvs)
for k, v := range kvs {
switch k {
case "url":

View File

@@ -203,6 +203,26 @@ func TestRTPInfoReadError(t *testing.T) {
base.HeaderValue{"a", "b"},
"value provided multiple times ([a b])",
},
{
"no key",
base.HeaderValue{`nokey;key=val`},
"unable to read key (nokey;key=val)",
},
{
"invalid sequence",
base.HeaderValue{`url=rtsp://127.0.0.1/test.mkv/track1;seq=aa;rtptime=717574556`},
"strconv.ParseUint: parsing \"aa\": invalid syntax",
},
{
"invalid rtptime",
base.HeaderValue{`url=rtsp://127.0.0.1/test.mkv/track1;seq=35243;rtptime=aa`},
"strconv.ParseUint: parsing \"aa\": invalid syntax",
},
{
"missing URL",
base.HeaderValue{`seq=35243;rtptime=717574556`},
"URL is missing",
},
} {
t.Run(ca.name, func(t *testing.T) {
var h RTPInfo

View File

@@ -152,7 +152,7 @@ func TestTransportReadError(t *testing.T) {
{
"missing delivery",
base.HeaderValue{`RTP/AVP`},
"unable to find key (;)",
"unable to read key (;)",
},
{
"invalid protocol",