server: correctly close sessions in case of errors during SETUP

(https://github.com/aler9/rtsp-simple-server/issues/965)
This commit is contained in:
aler9
2022-06-21 14:54:07 +02:00
parent c6b5540702
commit f4cc42eccc
2 changed files with 67 additions and 55 deletions

View File

@@ -721,61 +721,72 @@ func TestServerSessionClose(t *testing.T) {
} }
func TestServerSessionAutoClose(t *testing.T) { func TestServerSessionAutoClose(t *testing.T) {
sessionClosed := make(chan struct{}) for _, ca := range []string{
"200", "400",
} {
t.Run(ca, func(t *testing.T) {
sessionClosed := make(chan struct{})
track, err := NewTrackH264(96, []byte{0x01, 0x02, 0x03, 0x04}, []byte{0x01, 0x02, 0x03, 0x04}, nil) track, err := NewTrackH264(96, []byte{0x01, 0x02, 0x03, 0x04}, []byte{0x01, 0x02, 0x03, 0x04}, nil)
require.NoError(t, err) require.NoError(t, err)
stream := NewServerStream(Tracks{track}) stream := NewServerStream(Tracks{track})
defer stream.Close() defer stream.Close()
s := &Server{ s := &Server{
Handler: &testServerHandler{ Handler: &testServerHandler{
onSessionClose: func(ctx *ServerHandlerOnSessionCloseCtx) { onSessionClose: func(ctx *ServerHandlerOnSessionCloseCtx) {
close(sessionClosed) close(sessionClosed)
}, },
onSetup: func(ctx *ServerHandlerOnSetupCtx) (*base.Response, *ServerStream, error) { onSetup: func(ctx *ServerHandlerOnSetupCtx) (*base.Response, *ServerStream, error) {
return &base.Response{ if ca == "200" {
StatusCode: base.StatusOK, return &base.Response{
}, stream, nil StatusCode: base.StatusOK,
}, }, stream, nil
}, }
RTSPAddress: "localhost:8554",
return &base.Response{
StatusCode: base.StatusBadRequest,
}, nil, fmt.Errorf("error")
},
},
RTSPAddress: "localhost:8554",
}
err = s.Start()
require.NoError(t, err)
defer s.Close()
conn, err := net.Dial("tcp", "localhost:8554")
require.NoError(t, err)
br := bufio.NewReader(conn)
_, err = writeReqReadRes(conn, br, base.Request{
Method: base.Setup,
URL: mustParseURL("rtsp://localhost:8554/teststream/trackID=0"),
Header: base.Header{
"CSeq": base.HeaderValue{"1"},
"Transport": headers.Transport{
Protocol: headers.TransportProtocolTCP,
Delivery: func() *headers.TransportDelivery {
v := headers.TransportDeliveryUnicast
return &v
}(),
Mode: func() *headers.TransportMode {
v := headers.TransportModePlay
return &v
}(),
InterleavedIDs: &[2]int{0, 1},
}.Write(),
},
})
require.NoError(t, err)
conn.Close()
<-sessionClosed
})
} }
err = s.Start()
require.NoError(t, err)
defer s.Close()
conn, err := net.Dial("tcp", "localhost:8554")
require.NoError(t, err)
br := bufio.NewReader(conn)
res, err := writeReqReadRes(conn, br, base.Request{
Method: base.Setup,
URL: mustParseURL("rtsp://localhost:8554/teststream/trackID=0"),
Header: base.Header{
"CSeq": base.HeaderValue{"1"},
"Transport": headers.Transport{
Protocol: headers.TransportProtocolTCP,
Delivery: func() *headers.TransportDelivery {
v := headers.TransportDeliveryUnicast
return &v
}(),
Mode: func() *headers.TransportMode {
v := headers.TransportModePlay
return &v
}(),
InterleavedIDs: &[2]int{0, 1},
}.Write(),
},
})
require.NoError(t, err)
require.Equal(t, base.StatusOK, res.StatusCode)
conn.Close()
<-sessionClosed
} }
func TestServerErrorInvalidPath(t *testing.T) { func TestServerErrorInvalidPath(t *testing.T) {

View File

@@ -337,7 +337,8 @@ func (ss *ServerSession) runInner() error {
res, err := ss.handleRequest(req.sc, req.req) res, err := ss.handleRequest(req.sc, req.req)
var returnedSession *ServerSession returnedSession := ss
if err == nil || err == errSwitchReadFunc { if err == nil || err == errSwitchReadFunc {
// ANNOUNCE responses don't contain the session header. // ANNOUNCE responses don't contain the session header.
if req.req.Method != base.Announce && if req.req.Method != base.Announce &&
@@ -364,9 +365,9 @@ func (ss *ServerSession) runInner() error {
}.Write() }.Write()
} }
// after a TEARDOWN, session must be unpaired with the connection. // after a TEARDOWN, session must be unpaired with the connection
if req.req.Method != base.Teardown { if req.req.Method == base.Teardown {
returnedSession = ss returnedSession = nil
} }
} }