diff --git a/pkg/headers/rtpinfo.go b/pkg/headers/rtpinfo.go index 4e128d4b..3f02fe67 100644 --- a/pkg/headers/rtpinfo.go +++ b/pkg/headers/rtpinfo.go @@ -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 } } diff --git a/pkg/headers/rtpinfo_test.go b/pkg/headers/rtpinfo_test.go index c127dff7..3beccafe 100644 --- a/pkg/headers/rtpinfo_test.go +++ b/pkg/headers/rtpinfo_test.go @@ -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) { diff --git a/pkg/headers/session.go b/pkg/headers/session.go index f3bcacec..6e62bf4f 100644 --- a/pkg/headers/session.go +++ b/pkg/headers/session.go @@ -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) + 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 } - - iv, err := strconv.ParseUint(strValue, 10, 64) - if err != nil { - return err - } - uiv := uint(iv) - - h.Timeout = &uiv } return nil diff --git a/pkg/headers/transport.go b/pkg/headers/transport.go index bae24e3a..c49b86ee 100644 --- a/pkg/headers/transport.go +++ b/pkg/headers/transport.go @@ -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,9 +196,10 @@ func (h *Transport) Read(v base.HeaderValue) error { default: return fmt.Errorf("invalid transport mode: '%s'", str) } - } - // ignore non-standard keys + default: + // ignore non-standard keys + } } return nil