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

View File

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

View File

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

View File

@@ -203,6 +203,26 @@ func TestRTPInfoReadError(t *testing.T) {
base.HeaderValue{"a", "b"}, base.HeaderValue{"a", "b"},
"value provided multiple times ([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) { t.Run(ca.name, func(t *testing.T) {
var h RTPInfo var h RTPInfo

View File

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