diff --git a/pkg/sdp/sdp.go b/pkg/sdp/sdp.go index 643abd3a..897f7750 100644 --- a/pkg/sdp/sdp.go +++ b/pkg/sdp/sdp.go @@ -71,7 +71,28 @@ func (s *SessionDescription) unmarshalOrigin(value string) error { value += "127.0.0.1" } - fields := strings.Fields(value) + // find spaces from end to beginning, to support multiple spaces + // in the first field + fields := func() []string { + var ret []string + for len(value) > 0 { + i := len(value) - 1 + for { + if i < 0 || len(ret) == 5 { + ret = append([]string{value}, ret...) + return ret + } + if value[i] == ' ' { + ret = append([]string{value[i+1:]}, ret...) + value = value[:i] + break + } + i-- + } + } + return ret + }() + if len(fields) != 6 { return fmt.Errorf("%w `o=%v`", errSDPInvalidSyntax, fields) } diff --git a/pkg/sdp/sdp_test.go b/pkg/sdp/sdp_test.go index 6181264e..389a8daa 100644 --- a/pkg/sdp/sdp_test.go +++ b/pkg/sdp/sdp_test.go @@ -1052,6 +1052,26 @@ var cases = []struct { }, }, }, + { + "spaces in origin", + []byte("v=0\r\n" + + "o=RTSP Session 1 2 IN IP4 0.0.0.0\r\n" + + "s=Sony RTSP Server\r\n"), + []byte("v=0\r\n" + + "o=RTSP Session 1 2 IN IP4 0.0.0.0\r\n" + + "s=Sony RTSP Server\r\n"), + SessionDescription{ + Origin: psdp.Origin{ + Username: "RTSP Session", + SessionID: 1, + SessionVersion: 2, + NetworkType: "IN", + AddressType: "IP4", + UnicastAddress: "0.0.0.0", + }, + SessionName: psdp.SessionName("Sony RTSP Server"), + }, + }, } func TestUnmarshal(t *testing.T) {