mirror of
https://github.com/aler9/gortsplib
synced 2025-10-05 15:16:51 +08:00
headers: ignore non-standard keys (https://github.com/aler9/rtsp-simple-server/issues/336)
This commit is contained in:
@@ -39,8 +39,8 @@ func (h *RTPInfo) Read(v base.HeaderValue) error {
|
||||
if len(tmp) != 2 {
|
||||
return fmt.Errorf("unable to parse key-value (%v)", kv)
|
||||
}
|
||||
|
||||
k, v := tmp[0], tmp[1]
|
||||
|
||||
switch k {
|
||||
case "url":
|
||||
e.URL = v
|
||||
@@ -62,7 +62,7 @@ func (h *RTPInfo) Read(v base.HeaderValue) error {
|
||||
e.Timestamp = &vi2
|
||||
|
||||
default:
|
||||
return fmt.Errorf("invalid key: %v", k)
|
||||
// ignore non-standard keys
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -136,6 +136,35 @@ var casesRTPInfo = []struct {
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
"with session",
|
||||
base.HeaderValue{`url=trackID=1;seq=55664;rtptime=254718369;ssrc=56597976,url=trackID=2;seq=43807;rtptime=1702259566;ssrc=ee839a80`},
|
||||
base.HeaderValue{`url=trackID=1;seq=55664;rtptime=254718369,url=trackID=2;seq=43807;rtptime=1702259566`},
|
||||
RTPInfo{
|
||||
{
|
||||
URL: "trackID=1",
|
||||
SequenceNumber: func() *uint16 {
|
||||
v := uint16(55664)
|
||||
return &v
|
||||
}(),
|
||||
Timestamp: func() *uint32 {
|
||||
v := uint32(254718369)
|
||||
return &v
|
||||
}(),
|
||||
},
|
||||
{
|
||||
URL: "trackID=2",
|
||||
SequenceNumber: func() *uint16 {
|
||||
v := uint16(43807)
|
||||
return &v
|
||||
}(),
|
||||
Timestamp: func() *uint32 {
|
||||
v := uint32(1702259566)
|
||||
return &v
|
||||
}(),
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
func TestRTPInfoRead(t *testing.T) {
|
||||
|
@@ -34,27 +34,28 @@ func (h *Session) Read(v base.HeaderValue) error {
|
||||
|
||||
h.Session = parts[0]
|
||||
|
||||
for _, part := range parts[1:] {
|
||||
for _, kv := range parts[1:] {
|
||||
// remove leading spaces
|
||||
part = strings.TrimLeft(part, " ")
|
||||
kv = strings.TrimLeft(kv, " ")
|
||||
|
||||
kv := strings.Split(part, "=")
|
||||
if len(kv) != 2 {
|
||||
return fmt.Errorf("invalid value")
|
||||
tmp := strings.SplitN(kv, "=", 2)
|
||||
if len(tmp) != 2 {
|
||||
return fmt.Errorf("unable to parse key-value (%v)", kv)
|
||||
}
|
||||
k, v := tmp[0], tmp[1]
|
||||
|
||||
key, strValue := kv[0], kv[1]
|
||||
if key != "timeout" {
|
||||
return fmt.Errorf("invalid key '%s'", key)
|
||||
}
|
||||
|
||||
iv, err := strconv.ParseUint(strValue, 10, 64)
|
||||
switch k {
|
||||
case "timeout":
|
||||
iv, err := strconv.ParseUint(v, 10, 64)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
uiv := uint(iv)
|
||||
|
||||
h.Timeout = &uiv
|
||||
|
||||
default:
|
||||
// ignore non-standard keys
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
|
@@ -130,50 +130,55 @@ func (h *Transport) Read(v base.HeaderValue) error {
|
||||
// cast is optional, do not return any error
|
||||
}
|
||||
|
||||
for _, t := range parts {
|
||||
switch {
|
||||
case strings.HasPrefix(t, "destination="):
|
||||
v := t[len("destination="):]
|
||||
for _, kv := range parts {
|
||||
tmp := strings.SplitN(kv, "=", 2)
|
||||
if len(tmp) != 2 {
|
||||
return fmt.Errorf("unable to parse key-value (%v)", kv)
|
||||
}
|
||||
k, v := tmp[0], tmp[1]
|
||||
|
||||
switch k {
|
||||
case "destination":
|
||||
h.Destination = &v
|
||||
|
||||
case strings.HasPrefix(t, "ttl="):
|
||||
v, err := strconv.ParseUint(t[len("ttl="):], 10, 64)
|
||||
case "ttl":
|
||||
tmp, err := strconv.ParseUint(v, 10, 64)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
vu := uint(v)
|
||||
vu := uint(tmp)
|
||||
h.TTL = &vu
|
||||
|
||||
case strings.HasPrefix(t, "port="):
|
||||
ports, err := parsePorts(t[len("port="):])
|
||||
case "port":
|
||||
ports, err := parsePorts(v)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
h.Ports = ports
|
||||
|
||||
case strings.HasPrefix(t, "client_port="):
|
||||
ports, err := parsePorts(t[len("client_port="):])
|
||||
case "client_port":
|
||||
ports, err := parsePorts(v)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
h.ClientPorts = ports
|
||||
|
||||
case strings.HasPrefix(t, "server_port="):
|
||||
ports, err := parsePorts(t[len("server_port="):])
|
||||
case "server_port":
|
||||
ports, err := parsePorts(v)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
h.ServerPorts = ports
|
||||
|
||||
case strings.HasPrefix(t, "interleaved="):
|
||||
ports, err := parsePorts(t[len("interleaved="):])
|
||||
case "interleaved":
|
||||
ports, err := parsePorts(v)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
h.InterleavedIDs = ports
|
||||
|
||||
case strings.HasPrefix(t, "mode="):
|
||||
str := strings.ToLower(t[len("mode="):])
|
||||
case "mode":
|
||||
str := strings.ToLower(v)
|
||||
str = strings.TrimPrefix(str, "\"")
|
||||
str = strings.TrimSuffix(str, "\"")
|
||||
|
||||
@@ -191,10 +196,11 @@ func (h *Transport) Read(v base.HeaderValue) error {
|
||||
default:
|
||||
return fmt.Errorf("invalid transport mode: '%s'", str)
|
||||
}
|
||||
}
|
||||
|
||||
default:
|
||||
// ignore non-standard keys
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
Reference in New Issue
Block a user