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,6 +721,10 @@ func TestServerSessionClose(t *testing.T) {
}
func TestServerSessionAutoClose(t *testing.T) {
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)
@@ -735,9 +739,15 @@ func TestServerSessionAutoClose(t *testing.T) {
close(sessionClosed)
},
onSetup: func(ctx *ServerHandlerOnSetupCtx) (*base.Response, *ServerStream, error) {
if ca == "200" {
return &base.Response{
StatusCode: base.StatusOK,
}, stream, nil
}
return &base.Response{
StatusCode: base.StatusBadRequest,
}, nil, fmt.Errorf("error")
},
},
RTSPAddress: "localhost:8554",
@@ -751,7 +761,7 @@ func TestServerSessionAutoClose(t *testing.T) {
require.NoError(t, err)
br := bufio.NewReader(conn)
res, err := writeReqReadRes(conn, br, base.Request{
_, err = writeReqReadRes(conn, br, base.Request{
Method: base.Setup,
URL: mustParseURL("rtsp://localhost:8554/teststream/trackID=0"),
Header: base.Header{
@@ -771,11 +781,12 @@ func TestServerSessionAutoClose(t *testing.T) {
},
})
require.NoError(t, err)
require.Equal(t, base.StatusOK, res.StatusCode)
conn.Close()
<-sessionClosed
})
}
}
func TestServerErrorInvalidPath(t *testing.T) {

View File

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