mirror of
https://github.com/aler9/gortsplib
synced 2025-10-05 15:16:51 +08:00
headers: fix case in which a missing key was not detected
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
@@ -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) {
|
||||
|
@@ -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":
|
||||
|
@@ -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
|
||||
|
@@ -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",
|
||||
|
Reference in New Issue
Block a user