server: remove Session header from ANNOUNCE responses (https://github.com/aler9/rtsp-simple-server/issues/840)

This commit is contained in:
aler9
2022-02-19 19:18:39 +01:00
parent 7dd4842fc0
commit 0e8595a31d
4 changed files with 58 additions and 76 deletions

View File

@@ -305,17 +305,12 @@ func TestServerPublishSetupPath(t *testing.T) {
InterleavedIDs: &[2]int{0, 1}, InterleavedIDs: &[2]int{0, 1},
} }
var sx headers.Session
err = sx.Read(res.Header["Session"])
require.NoError(t, err)
res, err = writeReqReadRes(conn, br, base.Request{ res, err = writeReqReadRes(conn, br, base.Request{
Method: base.Setup, Method: base.Setup,
URL: mustParseURL(ca.url), URL: mustParseURL(ca.url),
Header: base.Header{ Header: base.Header{
"CSeq": base.HeaderValue{"2"}, "CSeq": base.HeaderValue{"2"},
"Transport": th.Write(), "Transport": th.Write(),
"Session": base.HeaderValue{sx.Session},
}, },
}) })
require.NoError(t, err) require.NoError(t, err)
@@ -386,17 +381,12 @@ func TestServerPublishErrorSetupDifferentPaths(t *testing.T) {
InterleavedIDs: &[2]int{0, 1}, InterleavedIDs: &[2]int{0, 1},
} }
var sx headers.Session
err = sx.Read(res.Header["Session"])
require.NoError(t, err)
res, err = writeReqReadRes(conn, br, base.Request{ res, err = writeReqReadRes(conn, br, base.Request{
Method: base.Setup, Method: base.Setup,
URL: mustParseURL("rtsp://localhost:8554/test2stream/trackID=0"), URL: mustParseURL("rtsp://localhost:8554/test2stream/trackID=0"),
Header: base.Header{ Header: base.Header{
"CSeq": base.HeaderValue{"2"}, "CSeq": base.HeaderValue{"2"},
"Transport": th.Write(), "Transport": th.Write(),
"Session": base.HeaderValue{sx.Session},
}, },
}) })
require.NoError(t, err) require.NoError(t, err)
@@ -468,22 +458,21 @@ func TestServerPublishErrorSetupTrackTwice(t *testing.T) {
InterleavedIDs: &[2]int{0, 1}, InterleavedIDs: &[2]int{0, 1},
} }
var sx headers.Session
err = sx.Read(res.Header["Session"])
require.NoError(t, err)
res, err = writeReqReadRes(conn, br, base.Request{ res, err = writeReqReadRes(conn, br, base.Request{
Method: base.Setup, Method: base.Setup,
URL: mustParseURL("rtsp://localhost:8554/teststream/trackID=0"), URL: mustParseURL("rtsp://localhost:8554/teststream/trackID=0"),
Header: base.Header{ Header: base.Header{
"CSeq": base.HeaderValue{"2"}, "CSeq": base.HeaderValue{"2"},
"Transport": th.Write(), "Transport": th.Write(),
"Session": base.HeaderValue{sx.Session},
}, },
}) })
require.NoError(t, err) require.NoError(t, err)
require.Equal(t, base.StatusOK, res.StatusCode) require.Equal(t, base.StatusOK, res.StatusCode)
var sx headers.Session
err = sx.Read(res.Header["Session"])
require.NoError(t, err)
res, err = writeReqReadRes(conn, br, base.Request{ res, err = writeReqReadRes(conn, br, base.Request{
Method: base.Setup, Method: base.Setup,
URL: mustParseURL("rtsp://localhost:8554/teststream/trackID=0"), URL: mustParseURL("rtsp://localhost:8554/teststream/trackID=0"),
@@ -570,22 +559,21 @@ func TestServerPublishErrorRecordPartialTracks(t *testing.T) {
InterleavedIDs: &[2]int{0, 1}, InterleavedIDs: &[2]int{0, 1},
} }
var sx headers.Session
err = sx.Read(res.Header["Session"])
require.NoError(t, err)
res, err = writeReqReadRes(conn, br, base.Request{ res, err = writeReqReadRes(conn, br, base.Request{
Method: base.Setup, Method: base.Setup,
URL: mustParseURL("rtsp://localhost:8554/teststream/trackID=0"), URL: mustParseURL("rtsp://localhost:8554/teststream/trackID=0"),
Header: base.Header{ Header: base.Header{
"CSeq": base.HeaderValue{"2"}, "CSeq": base.HeaderValue{"2"},
"Transport": th.Write(), "Transport": th.Write(),
"Session": base.HeaderValue{sx.Session},
}, },
}) })
require.NoError(t, err) require.NoError(t, err)
require.Equal(t, base.StatusOK, res.StatusCode) require.Equal(t, base.StatusOK, res.StatusCode)
var sx headers.Session
err = sx.Read(res.Header["Session"])
require.NoError(t, err)
res, err = writeReqReadRes(conn, br, base.Request{ res, err = writeReqReadRes(conn, br, base.Request{
Method: base.Record, Method: base.Record,
URL: mustParseURL("rtsp://localhost:8554/teststream"), URL: mustParseURL("rtsp://localhost:8554/teststream"),
@@ -739,22 +727,21 @@ func TestServerPublish(t *testing.T) {
inTH.InterleavedIDs = &[2]int{0, 1} inTH.InterleavedIDs = &[2]int{0, 1}
} }
var sx headers.Session
err = sx.Read(res.Header["Session"])
require.NoError(t, err)
res, err = writeReqReadRes(conn, br, base.Request{ res, err = writeReqReadRes(conn, br, base.Request{
Method: base.Setup, Method: base.Setup,
URL: mustParseURL("rtsp://localhost:8554/teststream/trackID=0"), URL: mustParseURL("rtsp://localhost:8554/teststream/trackID=0"),
Header: base.Header{ Header: base.Header{
"CSeq": base.HeaderValue{"2"}, "CSeq": base.HeaderValue{"2"},
"Transport": inTH.Write(), "Transport": inTH.Write(),
"Session": base.HeaderValue{sx.Session},
}, },
}) })
require.NoError(t, err) require.NoError(t, err)
require.Equal(t, base.StatusOK, res.StatusCode) require.Equal(t, base.StatusOK, res.StatusCode)
var sx headers.Session
err = sx.Read(res.Header["Session"])
require.NoError(t, err)
var th headers.Transport var th headers.Transport
err = th.Read(res.Header["Transport"]) err = th.Read(res.Header["Transport"])
require.NoError(t, err) require.NoError(t, err)
@@ -937,22 +924,21 @@ func TestServerPublishNonStandardFrameSize(t *testing.T) {
InterleavedIDs: &[2]int{0, 1}, InterleavedIDs: &[2]int{0, 1},
} }
var sx headers.Session
err = sx.Read(res.Header["Session"])
require.NoError(t, err)
res, err = writeReqReadRes(conn, br, base.Request{ res, err = writeReqReadRes(conn, br, base.Request{
Method: base.Setup, Method: base.Setup,
URL: mustParseURL("rtsp://localhost:8554/teststream/trackID=0"), URL: mustParseURL("rtsp://localhost:8554/teststream/trackID=0"),
Header: base.Header{ Header: base.Header{
"CSeq": base.HeaderValue{"2"}, "CSeq": base.HeaderValue{"2"},
"Transport": inTH.Write(), "Transport": inTH.Write(),
"Session": base.HeaderValue{sx.Session},
}, },
}) })
require.NoError(t, err) require.NoError(t, err)
require.Equal(t, base.StatusOK, res.StatusCode) require.Equal(t, base.StatusOK, res.StatusCode)
var sx headers.Session
err = sx.Read(res.Header["Session"])
require.NoError(t, err)
res, err = writeReqReadRes(conn, br, base.Request{ res, err = writeReqReadRes(conn, br, base.Request{
Method: base.Record, Method: base.Record,
URL: mustParseURL("rtsp://localhost:8554/teststream"), URL: mustParseURL("rtsp://localhost:8554/teststream"),
@@ -1042,22 +1028,21 @@ func TestServerPublishErrorInvalidProtocol(t *testing.T) {
ClientPorts: &[2]int{35466, 35467}, ClientPorts: &[2]int{35466, 35467},
} }
var sx headers.Session
err = sx.Read(res.Header["Session"])
require.NoError(t, err)
res, err = writeReqReadRes(conn, br, base.Request{ res, err = writeReqReadRes(conn, br, base.Request{
Method: base.Setup, Method: base.Setup,
URL: mustParseURL("rtsp://localhost:8554/teststream/trackID=0"), URL: mustParseURL("rtsp://localhost:8554/teststream/trackID=0"),
Header: base.Header{ Header: base.Header{
"CSeq": base.HeaderValue{"2"}, "CSeq": base.HeaderValue{"2"},
"Transport": inTH.Write(), "Transport": inTH.Write(),
"Session": base.HeaderValue{sx.Session},
}, },
}) })
require.NoError(t, err) require.NoError(t, err)
require.Equal(t, base.StatusOK, res.StatusCode) require.Equal(t, base.StatusOK, res.StatusCode)
var sx headers.Session
err = sx.Read(res.Header["Session"])
require.NoError(t, err)
var th headers.Transport var th headers.Transport
err = th.Read(res.Header["Transport"]) err = th.Read(res.Header["Transport"])
require.NoError(t, err) require.NoError(t, err)
@@ -1141,10 +1126,6 @@ func TestServerPublishRTCPReport(t *testing.T) {
require.NoError(t, err) require.NoError(t, err)
defer l2.Close() defer l2.Close()
var sx headers.Session
err = sx.Read(res.Header["Session"])
require.NoError(t, err)
res, err = writeReqReadRes(conn, br, base.Request{ res, err = writeReqReadRes(conn, br, base.Request{
Method: base.Setup, Method: base.Setup,
URL: mustParseURL("rtsp://localhost:8554/teststream/trackID=0"), URL: mustParseURL("rtsp://localhost:8554/teststream/trackID=0"),
@@ -1162,12 +1143,15 @@ func TestServerPublishRTCPReport(t *testing.T) {
Protocol: headers.TransportProtocolUDP, Protocol: headers.TransportProtocolUDP,
ClientPorts: &[2]int{34556, 34557}, ClientPorts: &[2]int{34556, 34557},
}.Write(), }.Write(),
"Session": base.HeaderValue{sx.Session},
}, },
}) })
require.NoError(t, err) require.NoError(t, err)
require.Equal(t, base.StatusOK, res.StatusCode) require.Equal(t, base.StatusOK, res.StatusCode)
var sx headers.Session
err = sx.Read(res.Header["Session"])
require.NoError(t, err)
var th headers.Transport var th headers.Transport
err = th.Read(res.Header["Transport"]) err = th.Read(res.Header["Transport"])
require.NoError(t, err) require.NoError(t, err)
@@ -1327,22 +1311,21 @@ func TestServerPublishTimeout(t *testing.T) {
inTH.InterleavedIDs = &[2]int{0, 1} inTH.InterleavedIDs = &[2]int{0, 1}
} }
var sx headers.Session
err = sx.Read(res.Header["Session"])
require.NoError(t, err)
res, err = writeReqReadRes(conn, br, base.Request{ res, err = writeReqReadRes(conn, br, base.Request{
Method: base.Setup, Method: base.Setup,
URL: mustParseURL("rtsp://localhost:8554/teststream/trackID=0"), URL: mustParseURL("rtsp://localhost:8554/teststream/trackID=0"),
Header: base.Header{ Header: base.Header{
"CSeq": base.HeaderValue{"2"}, "CSeq": base.HeaderValue{"2"},
"Transport": inTH.Write(), "Transport": inTH.Write(),
"Session": base.HeaderValue{sx.Session},
}, },
}) })
require.NoError(t, err) require.NoError(t, err)
require.Equal(t, base.StatusOK, res.StatusCode) require.Equal(t, base.StatusOK, res.StatusCode)
var sx headers.Session
err = sx.Read(res.Header["Session"])
require.NoError(t, err)
var th headers.Transport var th headers.Transport
err = th.Read(res.Header["Transport"]) err = th.Read(res.Header["Transport"])
require.NoError(t, err) require.NoError(t, err)
@@ -1454,22 +1437,21 @@ func TestServerPublishWithoutTeardown(t *testing.T) {
inTH.InterleavedIDs = &[2]int{0, 1} inTH.InterleavedIDs = &[2]int{0, 1}
} }
var sx headers.Session
err = sx.Read(res.Header["Session"])
require.NoError(t, err)
res, err = writeReqReadRes(conn, br, base.Request{ res, err = writeReqReadRes(conn, br, base.Request{
Method: base.Setup, Method: base.Setup,
URL: mustParseURL("rtsp://localhost:8554/teststream/trackID=0"), URL: mustParseURL("rtsp://localhost:8554/teststream/trackID=0"),
Header: base.Header{ Header: base.Header{
"CSeq": base.HeaderValue{"2"}, "CSeq": base.HeaderValue{"2"},
"Transport": inTH.Write(), "Transport": inTH.Write(),
"Session": base.HeaderValue{sx.Session},
}, },
}) })
require.NoError(t, err) require.NoError(t, err)
require.Equal(t, base.StatusOK, res.StatusCode) require.Equal(t, base.StatusOK, res.StatusCode)
var sx headers.Session
err = sx.Read(res.Header["Session"])
require.NoError(t, err)
var th headers.Transport var th headers.Transport
err = th.Read(res.Header["Transport"]) err = th.Read(res.Header["Transport"])
require.NoError(t, err) require.NoError(t, err)
@@ -1567,22 +1549,21 @@ func TestServerPublishUDPChangeConn(t *testing.T) {
ClientPorts: &[2]int{35466, 35467}, ClientPorts: &[2]int{35466, 35467},
} }
var sx headers.Session
err = sx.Read(res.Header["Session"])
require.NoError(t, err)
res, err = writeReqReadRes(conn, br, base.Request{ res, err = writeReqReadRes(conn, br, base.Request{
Method: base.Setup, Method: base.Setup,
URL: mustParseURL("rtsp://localhost:8554/teststream/trackID=0"), URL: mustParseURL("rtsp://localhost:8554/teststream/trackID=0"),
Header: base.Header{ Header: base.Header{
"CSeq": base.HeaderValue{"2"}, "CSeq": base.HeaderValue{"2"},
"Transport": inTH.Write(), "Transport": inTH.Write(),
"Session": base.HeaderValue{sx.Session},
}, },
}) })
require.NoError(t, err) require.NoError(t, err)
require.Equal(t, base.StatusOK, res.StatusCode) require.Equal(t, base.StatusOK, res.StatusCode)
var sx headers.Session
err = sx.Read(res.Header["Session"])
require.NoError(t, err)
res, err = writeReqReadRes(conn, br, base.Request{ res, err = writeReqReadRes(conn, br, base.Request{
Method: base.Record, Method: base.Record,
URL: mustParseURL("rtsp://localhost:8554/teststream"), URL: mustParseURL("rtsp://localhost:8554/teststream"),

View File

@@ -1186,12 +1186,6 @@ func TestServerErrorInvalidPath(t *testing.T) {
}) })
require.NoError(t, err) require.NoError(t, err)
require.Equal(t, base.StatusOK, res.StatusCode) require.Equal(t, base.StatusOK, res.StatusCode)
var sx headers.Session
err = sx.Read(res.Header["Session"])
require.NoError(t, err)
sxID = sx.Session
} }
if method == base.Play || method == base.Record || method == base.Pause { if method == base.Play || method == base.Record || method == base.Pause {

View File

@@ -543,12 +543,16 @@ func (sc *ServerConn) handleRequestInSession(
) (*base.Response, error) { ) (*base.Response, error) {
// handle directly in Session // handle directly in Session
if sc.session != nil { if sc.session != nil {
// the SETUP request after ANNOUNCE don't have the session ID
// since ANNOUNCE didn't provide it.
if req.Method != base.Setup || sxID != "" {
// the connection can't communicate with two sessions at once. // the connection can't communicate with two sessions at once.
if sxID != sc.session.secretID { if sxID != sc.session.secretID {
return &base.Response{ return &base.Response{
StatusCode: base.StatusBadRequest, StatusCode: base.StatusBadRequest,
}, liberrors.ErrServerLinkedToOtherSession{} }, liberrors.ErrServerLinkedToOtherSession{}
} }
}
cres := make(chan sessionRequestRes) cres := make(chan sessionRequestRes)
sreq := sessionRequestReq{ sreq := sessionRequestReq{

View File

@@ -281,6 +281,8 @@ func (ss *ServerSession) run() {
var returnedSession *ServerSession var returnedSession *ServerSession
if err == nil || err == errSwitchReadFunc { if err == nil || err == errSwitchReadFunc {
// ANNOUNCE responses don't contain the session header.
if req.req.Method != base.Announce {
if res.Header == nil { if res.Header == nil {
res.Header = make(base.Header) res.Header = make(base.Header)
} }
@@ -292,6 +294,7 @@ func (ss *ServerSession) run() {
return &v return &v
}(), }(),
}.Write() }.Write()
}
if req.req.Method != base.Teardown { if req.req.Method != base.Teardown {
returnedSession = ss returnedSession = ss