From 2f7ed32139f2d9fac60c28f8df30d2da5824ea1a Mon Sep 17 00:00:00 2001 From: Alessandro Ros Date: Tue, 17 Oct 2023 20:31:54 +0200 Subject: [PATCH] server: add methods SetuppedStream, SetuppedPath, SetuppedQuery (#444) --- server_play_test.go | 19 ++++++++++++++++++- server_record_test.go | 17 +++++++++++++++-- server_session.go | 36 ++++++++++++++++++++++++++---------- 3 files changed, 59 insertions(+), 13 deletions(-) diff --git a/server_play_test.go b/server_play_test.go index 7d41d707..a0ee42c1 100644 --- a/server_play_test.go +++ b/server_play_test.go @@ -78,7 +78,7 @@ func absoluteControlAttribute(md *psdp.MediaDescription) string { func doDescribe(t *testing.T, conn *conn.Conn) *sdp.SessionDescription { res, err := writeReqReadRes(conn, base.Request{ Method: base.Describe, - URL: mustParseURL("rtsp://localhost:8554/teststream"), + URL: mustParseURL("rtsp://localhost:8554/teststream?param=value"), Header: base.Header{ "CSeq": base.HeaderValue{"1"}, }, @@ -553,6 +553,23 @@ func TestServerPlay(t *testing.T) { }, stream, nil }, onPlay: func(ctx *ServerHandlerOnPlayCtx) (*base.Response, error) { + switch transport { + case "udp": + v := TransportUDP + require.Equal(t, &v, ctx.Session.SetuppedTransport()) + + case "tcp", "tls": + v := TransportTCP + require.Equal(t, &v, ctx.Session.SetuppedTransport()) + + case "multicast": + v := TransportUDPMulticast + require.Equal(t, &v, ctx.Session.SetuppedTransport()) + } + + require.Equal(t, "param=value", ctx.Session.SetuppedQuery()) + require.Equal(t, stream.Description().Medias, ctx.Session.SetuppedMedias()) + // send RTCP packets directly to the session. // these are sent after the response, only if onPlay returns StatusOK. if transport != "multicast" { diff --git a/server_record_test.go b/server_record_test.go index fe85f606..296eff58 100644 --- a/server_record_test.go +++ b/server_record_test.go @@ -519,6 +519,19 @@ func TestServerRecord(t *testing.T) { }, nil, nil }, onRecord: func(ctx *ServerHandlerOnRecordCtx) (*base.Response, error) { + switch transport { + case "udp": + v := TransportUDP + require.Equal(t, &v, ctx.Session.SetuppedTransport()) + + case "tcp", "tls": + v := TransportTCP + require.Equal(t, &v, ctx.Session.SetuppedTransport()) + } + + require.Equal(t, "param=value", ctx.Session.SetuppedQuery()) + require.Equal(t, ctx.Session.AnnouncedDescription().Medias, ctx.Session.SetuppedMedias()) + // queue sending of RTCP packets. // these are sent after the response, only if onRecord returns StatusOK. err := ctx.Session.WritePacketRTCP(ctx.Session.AnnouncedDescription().Medias[0], &testRTCPPacket) @@ -602,7 +615,7 @@ func TestServerRecord(t *testing.T) { }, } - doAnnounce(t, conn, "rtsp://localhost:8554/teststream", medias) + doAnnounce(t, conn, "rtsp://localhost:8554/teststream?param=value", medias) <-sessionOpened @@ -639,7 +652,7 @@ func TestServerRecord(t *testing.T) { inTH.InterleavedIDs = &[2]int{2 + i*2, 3 + i*2} } - res, th := doSetup(t, conn, "rtsp://localhost:8554/teststream/"+medias[i].Control, inTH, "") + res, th := doSetup(t, conn, "rtsp://localhost:8554/teststream?param=value/"+medias[i].Control, inTH, "") session = readSession(t, res) diff --git a/server_session.go b/server_session.go index a035f628..862407c6 100644 --- a/server_session.go +++ b/server_session.go @@ -194,7 +194,7 @@ type ServerSession struct { tcpCallbackByChannel map[int]readFunc setuppedTransport *Transport setuppedStream *ServerStream // read - setuppedPath *string + setuppedPath string setuppedQuery string lastRequestTime time.Time tcpConn *ServerConn @@ -266,6 +266,21 @@ func (ss *ServerSession) SetuppedTransport() *Transport { return ss.setuppedTransport } +// SetuppedStream returns the stream associated with the session. +func (ss *ServerSession) SetuppedStream() *ServerStream { + return ss.setuppedStream +} + +// SetuppedPath returns the path sent during SETUP or ANNOUNCE. +func (ss *ServerSession) SetuppedPath() string { + return ss.setuppedPath +} + +// SetuppedQuery returns the query sent during SETUP or ANNOUNCE. +func (ss *ServerSession) SetuppedQuery() string { + return ss.setuppedQuery +} + // AnnouncedDescription returns the announced stream description. func (ss *ServerSession) AnnouncedDescription() *description.Session { return ss.announcedDesc @@ -624,7 +639,7 @@ func (ss *ServerSession) handleRequestInner(sc *ServerConn, req *base.Request) ( } ss.state = ServerSessionStatePreRecord - ss.setuppedPath = &path + ss.setuppedPath = path ss.setuppedQuery = query ss.announcedDesc = &desc @@ -670,14 +685,14 @@ func (ss *ServerSession) handleRequestInner(sc *ServerConn, req *base.Request) ( }, err } - if ss.setuppedPath != nil && path != *ss.setuppedPath { + if ss.state == ServerSessionStatePrePlay && path != ss.setuppedPath { return &base.Response{ StatusCode: base.StatusBadRequest, }, liberrors.ErrServerMediasDifferentPaths{} } default: // record - path = *ss.setuppedPath + path = ss.setuppedPath query = ss.setuppedQuery } @@ -799,7 +814,8 @@ func (ss *ServerSession) handleRequestInner(sc *ServerConn, req *base.Request) ( } ss.state = ServerSessionStatePrePlay - ss.setuppedPath = &path + ss.setuppedPath = path + ss.setuppedQuery = query ss.setuppedStream = stream } @@ -886,10 +902,10 @@ func (ss *ServerSession) handleRequestInner(sc *ServerConn, req *base.Request) ( }, err } - if ss.State() == ServerSessionStatePrePlay && path != *ss.setuppedPath { + if ss.State() == ServerSessionStatePrePlay && path != ss.setuppedPath { return &base.Response{ StatusCode: base.StatusBadRequest, - }, liberrors.ErrServerPathHasChanged{Prev: *ss.setuppedPath, Cur: path} + }, liberrors.ErrServerPathHasChanged{Prev: ss.setuppedPath, Cur: path} } // allocate writeBuffer before calling OnPlay(). @@ -950,7 +966,7 @@ func (ss *ServerSession) handleRequestInner(sc *ServerConn, req *base.Request) ( ss.s.timeNow(), ss.setuppedMediasOrdered, ss.setuppedStream, - *ss.setuppedPath, + ss.setuppedPath, req.URL) if ok { @@ -978,10 +994,10 @@ func (ss *ServerSession) handleRequestInner(sc *ServerConn, req *base.Request) ( }, liberrors.ErrServerNotAllAnnouncedMediasSetup{} } - if path != *ss.setuppedPath { + if path != ss.setuppedPath { return &base.Response{ StatusCode: base.StatusBadRequest, - }, liberrors.ErrServerPathHasChanged{Prev: *ss.setuppedPath, Cur: path} + }, liberrors.ErrServerPathHasChanged{Prev: ss.setuppedPath, Cur: path} } // allocate writeBuffer before calling OnRecord().