From 7b66c8415cbfc08b2baf0eaa0eefab83fd696b7d Mon Sep 17 00:00:00 2001 From: aler9 <46489434+aler9@users.noreply.github.com> Date: Sun, 6 Dec 2020 20:14:43 +0100 Subject: [PATCH] support SDPs with spaces in origin (https://github.com/aler9/rtsp-simple-server/issues/127) --- pkg/sdp/sdp.go | 23 ++++++++++++++++++++++- pkg/sdp/sdp_test.go | 20 ++++++++++++++++++++ 2 files changed, 42 insertions(+), 1 deletion(-) 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) {