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 (
|
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
|
||||||
}
|
}
|
||||||
|
@@ -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) {
|
||||||
|
@@ -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":
|
||||||
|
@@ -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
|
||||||
|
@@ -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",
|
||||||
|
Reference in New Issue
Block a user