mirror of
https://github.com/aler9/gortsplib
synced 2025-10-04 23:02:45 +08:00
server: make calling ServerStream.Close() mandatory
This commit is contained in:
16
server.go
16
server.go
@@ -153,14 +153,11 @@ type Server struct {
|
|||||||
sessions map[string]*ServerSession
|
sessions map[string]*ServerSession
|
||||||
conns map[*ServerConn]struct{}
|
conns map[*ServerConn]struct{}
|
||||||
closeError error
|
closeError error
|
||||||
streams map[*ServerStream]struct{}
|
|
||||||
|
|
||||||
// in
|
// in
|
||||||
connClose chan *ServerConn
|
connClose chan *ServerConn
|
||||||
sessionRequest chan sessionRequestReq
|
sessionRequest chan sessionRequestReq
|
||||||
sessionClose chan *ServerSession
|
sessionClose chan *ServerSession
|
||||||
streamAdd chan *ServerStream
|
|
||||||
streamRemove chan *ServerStream
|
|
||||||
streamMulticastIP chan streamMulticastIPReq
|
streamMulticastIP chan streamMulticastIPReq
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -337,12 +334,9 @@ func (s *Server) run() {
|
|||||||
|
|
||||||
s.sessions = make(map[string]*ServerSession)
|
s.sessions = make(map[string]*ServerSession)
|
||||||
s.conns = make(map[*ServerConn]struct{})
|
s.conns = make(map[*ServerConn]struct{})
|
||||||
s.streams = make(map[*ServerStream]struct{})
|
|
||||||
s.connClose = make(chan *ServerConn)
|
s.connClose = make(chan *ServerConn)
|
||||||
s.sessionRequest = make(chan sessionRequestReq)
|
s.sessionRequest = make(chan sessionRequestReq)
|
||||||
s.sessionClose = make(chan *ServerSession)
|
s.sessionClose = make(chan *ServerSession)
|
||||||
s.streamAdd = make(chan *ServerStream)
|
|
||||||
s.streamRemove = make(chan *ServerStream)
|
|
||||||
s.streamMulticastIP = make(chan streamMulticastIPReq)
|
s.streamMulticastIP = make(chan streamMulticastIPReq)
|
||||||
|
|
||||||
s.wg.Add(1)
|
s.wg.Add(1)
|
||||||
@@ -446,12 +440,6 @@ func (s *Server) run() {
|
|||||||
delete(s.sessions, ss.secretID)
|
delete(s.sessions, ss.secretID)
|
||||||
ss.Close()
|
ss.Close()
|
||||||
|
|
||||||
case st := <-s.streamAdd:
|
|
||||||
s.streams[st] = struct{}{}
|
|
||||||
|
|
||||||
case st := <-s.streamRemove:
|
|
||||||
delete(s.streams, st)
|
|
||||||
|
|
||||||
case req := <-s.streamMulticastIP:
|
case req := <-s.streamMulticastIP:
|
||||||
ip32 := binary.BigEndian.Uint32(s.multicastNextIP)
|
ip32 := binary.BigEndian.Uint32(s.multicastNextIP)
|
||||||
mask := binary.BigEndian.Uint32(s.multicastNet.Mask)
|
mask := binary.BigEndian.Uint32(s.multicastNet.Mask)
|
||||||
@@ -478,10 +466,6 @@ func (s *Server) run() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
s.tcpListener.Close()
|
s.tcpListener.Close()
|
||||||
|
|
||||||
for st := range s.streams {
|
|
||||||
st.Close()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// StartAndWait starts the server and waits until a fatal error.
|
// StartAndWait starts the server and waits until a fatal error.
|
||||||
|
@@ -201,7 +201,8 @@ func TestServerPublishSetupPath(t *testing.T) {
|
|||||||
Handler: &testServerHandler{
|
Handler: &testServerHandler{
|
||||||
onAnnounce: func(ctx *ServerHandlerOnAnnounceCtx) (*base.Response, error) {
|
onAnnounce: func(ctx *ServerHandlerOnAnnounceCtx) (*base.Response, error) {
|
||||||
// make sure that track URLs are not overridden by NewServerStream()
|
// make sure that track URLs are not overridden by NewServerStream()
|
||||||
NewServerStream(ctx.Tracks)
|
stream := NewServerStream(ctx.Tracks)
|
||||||
|
defer stream.Close()
|
||||||
|
|
||||||
return &base.Response{
|
return &base.Response{
|
||||||
StatusCode: base.StatusOK,
|
StatusCode: base.StatusOK,
|
||||||
|
@@ -95,6 +95,7 @@ func TestServerReadSetupPath(t *testing.T) {
|
|||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
stream := NewServerStream(Tracks{track, track, track, track, track})
|
stream := NewServerStream(Tracks{track, track, track, track, track})
|
||||||
|
defer stream.Close()
|
||||||
|
|
||||||
s := &Server{
|
s := &Server{
|
||||||
Handler: &testServerHandler{
|
Handler: &testServerHandler{
|
||||||
@@ -154,6 +155,7 @@ func TestServerReadSetupErrors(t *testing.T) {
|
|||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
stream := NewServerStream(Tracks{track})
|
stream := NewServerStream(Tracks{track})
|
||||||
|
defer stream.Close()
|
||||||
|
|
||||||
s := &Server{
|
s := &Server{
|
||||||
Handler: &testServerHandler{
|
Handler: &testServerHandler{
|
||||||
@@ -262,6 +264,7 @@ func TestServerRead(t *testing.T) {
|
|||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
stream := NewServerStream(Tracks{track})
|
stream := NewServerStream(Tracks{track})
|
||||||
|
defer stream.Close()
|
||||||
|
|
||||||
counter := uint64(0)
|
counter := uint64(0)
|
||||||
|
|
||||||
@@ -612,6 +615,7 @@ func TestServerReadVLCMulticast(t *testing.T) {
|
|||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
stream := NewServerStream(Tracks{track})
|
stream := NewServerStream(Tracks{track})
|
||||||
|
defer stream.Close()
|
||||||
|
|
||||||
listenIP := multicastCapableIP(t)
|
listenIP := multicastCapableIP(t)
|
||||||
|
|
||||||
@@ -670,6 +674,7 @@ func TestServerReadNonStandardFrameSize(t *testing.T) {
|
|||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
stream := NewServerStream(Tracks{track})
|
stream := NewServerStream(Tracks{track})
|
||||||
|
defer stream.Close()
|
||||||
|
|
||||||
s := &Server{
|
s := &Server{
|
||||||
Handler: &testServerHandler{
|
Handler: &testServerHandler{
|
||||||
@@ -755,6 +760,7 @@ func TestServerReadTCPResponseBeforeFrames(t *testing.T) {
|
|||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
stream := NewServerStream(Tracks{track})
|
stream := NewServerStream(Tracks{track})
|
||||||
|
defer stream.Close()
|
||||||
|
|
||||||
s := &Server{
|
s := &Server{
|
||||||
RTSPAddress: "localhost:8554",
|
RTSPAddress: "localhost:8554",
|
||||||
@@ -853,6 +859,7 @@ func TestServerReadPlayPlay(t *testing.T) {
|
|||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
stream := NewServerStream(Tracks{track})
|
stream := NewServerStream(Tracks{track})
|
||||||
|
defer stream.Close()
|
||||||
|
|
||||||
s := &Server{
|
s := &Server{
|
||||||
Handler: &testServerHandler{
|
Handler: &testServerHandler{
|
||||||
@@ -939,6 +946,7 @@ func TestServerReadPlayPausePlay(t *testing.T) {
|
|||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
stream := NewServerStream(Tracks{track})
|
stream := NewServerStream(Tracks{track})
|
||||||
|
defer stream.Close()
|
||||||
|
|
||||||
s := &Server{
|
s := &Server{
|
||||||
Handler: &testServerHandler{
|
Handler: &testServerHandler{
|
||||||
@@ -1061,6 +1069,7 @@ func TestServerReadPlayPausePause(t *testing.T) {
|
|||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
stream := NewServerStream(Tracks{track})
|
stream := NewServerStream(Tracks{track})
|
||||||
|
defer stream.Close()
|
||||||
|
|
||||||
s := &Server{
|
s := &Server{
|
||||||
Handler: &testServerHandler{
|
Handler: &testServerHandler{
|
||||||
@@ -1194,6 +1203,7 @@ func TestServerReadTimeout(t *testing.T) {
|
|||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
stream := NewServerStream(Tracks{track})
|
stream := NewServerStream(Tracks{track})
|
||||||
|
defer stream.Close()
|
||||||
|
|
||||||
s := &Server{
|
s := &Server{
|
||||||
Handler: &testServerHandler{
|
Handler: &testServerHandler{
|
||||||
@@ -1305,6 +1315,7 @@ func TestServerReadWithoutTeardown(t *testing.T) {
|
|||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
stream := NewServerStream(Tracks{track})
|
stream := NewServerStream(Tracks{track})
|
||||||
|
defer stream.Close()
|
||||||
|
|
||||||
s := &Server{
|
s := &Server{
|
||||||
Handler: &testServerHandler{
|
Handler: &testServerHandler{
|
||||||
@@ -1407,6 +1418,7 @@ func TestServerReadUDPChangeConn(t *testing.T) {
|
|||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
stream := NewServerStream(Tracks{track})
|
stream := NewServerStream(Tracks{track})
|
||||||
|
defer stream.Close()
|
||||||
|
|
||||||
s := &Server{
|
s := &Server{
|
||||||
Handler: &testServerHandler{
|
Handler: &testServerHandler{
|
||||||
@@ -1512,6 +1524,7 @@ func TestServerReadPartialTracks(t *testing.T) {
|
|||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
stream := NewServerStream(Tracks{track1, track2})
|
stream := NewServerStream(Tracks{track1, track2})
|
||||||
|
defer stream.Close()
|
||||||
|
|
||||||
s := &Server{
|
s := &Server{
|
||||||
Handler: &testServerHandler{
|
Handler: &testServerHandler{
|
||||||
@@ -1685,6 +1698,7 @@ func TestServerReadAdditionalInfos(t *testing.T) {
|
|||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
stream := NewServerStream(Tracks{track, track})
|
stream := NewServerStream(Tracks{track, track})
|
||||||
|
defer stream.Close()
|
||||||
|
|
||||||
s := &Server{
|
s := &Server{
|
||||||
Handler: &testServerHandler{
|
Handler: &testServerHandler{
|
||||||
@@ -1795,6 +1809,7 @@ func TestServerReadErrorUDPSamePorts(t *testing.T) {
|
|||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
stream := NewServerStream(Tracks{track})
|
stream := NewServerStream(Tracks{track})
|
||||||
|
defer stream.Close()
|
||||||
|
|
||||||
s := &Server{
|
s := &Server{
|
||||||
Handler: &testServerHandler{
|
Handler: &testServerHandler{
|
||||||
|
@@ -694,6 +694,7 @@ func TestServerErrorTCPTwoConnOneSession(t *testing.T) {
|
|||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
stream := NewServerStream(Tracks{track})
|
stream := NewServerStream(Tracks{track})
|
||||||
|
defer stream.Close()
|
||||||
|
|
||||||
s := &Server{
|
s := &Server{
|
||||||
Handler: &testServerHandler{
|
Handler: &testServerHandler{
|
||||||
@@ -796,6 +797,7 @@ func TestServerErrorTCPOneConnTwoSessions(t *testing.T) {
|
|||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
stream := NewServerStream(Tracks{track})
|
stream := NewServerStream(Tracks{track})
|
||||||
|
defer stream.Close()
|
||||||
|
|
||||||
s := &Server{
|
s := &Server{
|
||||||
Handler: &testServerHandler{
|
Handler: &testServerHandler{
|
||||||
@@ -1065,6 +1067,7 @@ func TestServerSessionAutoClose(t *testing.T) {
|
|||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
stream := NewServerStream(Tracks{track})
|
stream := NewServerStream(Tracks{track})
|
||||||
|
defer stream.Close()
|
||||||
|
|
||||||
s := &Server{
|
s := &Server{
|
||||||
Handler: &testServerHandler{
|
Handler: &testServerHandler{
|
||||||
@@ -1132,6 +1135,7 @@ func TestServerErrorInvalidPath(t *testing.T) {
|
|||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
stream := NewServerStream(Tracks{track})
|
stream := NewServerStream(Tracks{track})
|
||||||
|
defer stream.Close()
|
||||||
|
|
||||||
s := &Server{
|
s := &Server{
|
||||||
Handler: &testServerHandler{
|
Handler: &testServerHandler{
|
||||||
|
@@ -58,13 +58,6 @@ func (st *ServerStream) Close() error {
|
|||||||
st.mutex.Lock()
|
st.mutex.Lock()
|
||||||
defer st.mutex.Unlock()
|
defer st.mutex.Unlock()
|
||||||
|
|
||||||
if st.s != nil {
|
|
||||||
select {
|
|
||||||
case st.s.streamRemove <- st:
|
|
||||||
case <-st.s.ctx.Done():
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for ss := range st.readers {
|
for ss := range st.readers {
|
||||||
ss.Close()
|
ss.Close()
|
||||||
}
|
}
|
||||||
@@ -117,10 +110,6 @@ func (st *ServerStream) readerAdd(
|
|||||||
|
|
||||||
if st.s == nil {
|
if st.s == nil {
|
||||||
st.s = ss.s
|
st.s = ss.s
|
||||||
select {
|
|
||||||
case st.s.streamAdd <- st:
|
|
||||||
case <-st.s.ctx.Done():
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
switch transport {
|
switch transport {
|
||||||
|
Reference in New Issue
Block a user