mirror of
https://github.com/aler9/gortsplib
synced 2025-11-02 03:22:58 +08:00
server: allow a TCP session to be used by another connection after PAUSE
This commit is contained in:
@@ -413,6 +413,7 @@ func (sc *ServerConn) handleRequest(req *base.Request) (*base.Response, error) {
|
|||||||
_, res, err := sc.handleRequestInSession(sxID, req, false)
|
_, res, err := sc.handleRequestInSession(sxID, req, false)
|
||||||
|
|
||||||
if _, ok := err.(liberrors.ErrServerTCPFramesDisable); ok {
|
if _, ok := err.(liberrors.ErrServerTCPFramesDisable); ok {
|
||||||
|
sc.tcpSession = nil
|
||||||
sc.tcpFrameSetEnabled = false
|
sc.tcpFrameSetEnabled = false
|
||||||
return res, nil
|
return res, nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -505,7 +505,10 @@ func (ss *ServerSession) handleRequest(sc *ServerConn, req *base.Request) (*base
|
|||||||
Tracks: tracks,
|
Tracks: tracks,
|
||||||
})
|
})
|
||||||
|
|
||||||
if res.StatusCode == base.StatusOK {
|
if res.StatusCode != base.StatusOK {
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
|
|
||||||
ss.state = ServerSessionStatePrePublish
|
ss.state = ServerSessionStatePrePublish
|
||||||
ss.setuppedPath = &path
|
ss.setuppedPath = &path
|
||||||
ss.setuppedQuery = &query
|
ss.setuppedQuery = &query
|
||||||
@@ -522,8 +525,6 @@ func (ss *ServerSession) handleRequest(sc *ServerConn, req *base.Request) (*base
|
|||||||
|
|
||||||
v := time.Now().Unix()
|
v := time.Now().Unix()
|
||||||
ss.udpLastFrameTime = &v
|
ss.udpLastFrameTime = &v
|
||||||
}
|
|
||||||
|
|
||||||
return res, err
|
return res, err
|
||||||
|
|
||||||
case base.Setup:
|
case base.Setup:
|
||||||
@@ -648,7 +649,22 @@ func (ss *ServerSession) handleRequest(sc *ServerConn, req *base.Request) (*base
|
|||||||
Transport: transport,
|
Transport: transport,
|
||||||
})
|
})
|
||||||
|
|
||||||
if res.StatusCode == base.StatusOK {
|
// workaround to prevent a bug in rtspclientsink
|
||||||
|
// that makes impossible for the client to receive the response
|
||||||
|
// and send frames.
|
||||||
|
// this was causing problems during unit tests.
|
||||||
|
if ua, ok := req.Header["User-Agent"]; ok && len(ua) == 1 &&
|
||||||
|
strings.HasPrefix(ua[0], "GStreamer") {
|
||||||
|
select {
|
||||||
|
case <-time.After(1 * time.Second):
|
||||||
|
case <-ss.ctx.Done():
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if res.StatusCode != base.StatusOK {
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
|
|
||||||
if ss.state == ServerSessionStateInitial {
|
if ss.state == ServerSessionStateInitial {
|
||||||
err := stream.readerAdd(ss,
|
err := stream.readerAdd(ss,
|
||||||
transport,
|
transport,
|
||||||
@@ -729,19 +745,6 @@ func (ss *ServerSession) handleRequest(sc *ServerConn, req *base.Request) (*base
|
|||||||
ss.setuppedTracks[trackID] = sst
|
ss.setuppedTracks[trackID] = sst
|
||||||
|
|
||||||
res.Header["Transport"] = th.Write()
|
res.Header["Transport"] = th.Write()
|
||||||
}
|
|
||||||
|
|
||||||
// workaround to prevent a bug in rtspclientsink
|
|
||||||
// that makes impossible for the client to receive the response
|
|
||||||
// and send frames.
|
|
||||||
// this was causing problems during unit tests.
|
|
||||||
if ua, ok := req.Header["User-Agent"]; ok && len(ua) == 1 &&
|
|
||||||
strings.HasPrefix(ua[0], "GStreamer") {
|
|
||||||
select {
|
|
||||||
case <-time.After(1 * time.Second):
|
|
||||||
case <-ss.ctx.Done():
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return res, err
|
return res, err
|
||||||
|
|
||||||
@@ -790,8 +793,14 @@ func (ss *ServerSession) handleRequest(sc *ServerConn, req *base.Request) (*base
|
|||||||
Query: query,
|
Query: query,
|
||||||
})
|
})
|
||||||
|
|
||||||
if ss.state != ServerSessionStateRead {
|
if res.StatusCode != base.StatusOK {
|
||||||
if res.StatusCode == base.StatusOK {
|
return res, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if ss.state == ServerSessionStateRead {
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
|
|
||||||
ss.state = ServerSessionStateRead
|
ss.state = ServerSessionStateRead
|
||||||
|
|
||||||
if *ss.setuppedTransport == TransportTCP {
|
if *ss.setuppedTransport == TransportTCP {
|
||||||
@@ -856,10 +865,6 @@ func (ss *ServerSession) handleRequest(sc *ServerConn, req *base.Request) (*base
|
|||||||
err = liberrors.ErrServerTCPFramesEnable{}
|
err = liberrors.ErrServerTCPFramesEnable{}
|
||||||
}
|
}
|
||||||
|
|
||||||
return res, err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return res, err
|
return res, err
|
||||||
|
|
||||||
case base.Record:
|
case base.Record:
|
||||||
@@ -909,7 +914,11 @@ func (ss *ServerSession) handleRequest(sc *ServerConn, req *base.Request) (*base
|
|||||||
Query: query,
|
Query: query,
|
||||||
})
|
})
|
||||||
|
|
||||||
if res.StatusCode == base.StatusOK {
|
if res.StatusCode != base.StatusOK {
|
||||||
|
ss.tcpConn = nil
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
|
|
||||||
ss.state = ServerSessionStatePublish
|
ss.state = ServerSessionStatePublish
|
||||||
|
|
||||||
switch *ss.setuppedTransport {
|
switch *ss.setuppedTransport {
|
||||||
@@ -931,11 +940,6 @@ func (ss *ServerSession) handleRequest(sc *ServerConn, req *base.Request) (*base
|
|||||||
err = liberrors.ErrServerTCPFramesEnable{}
|
err = liberrors.ErrServerTCPFramesEnable{}
|
||||||
}
|
}
|
||||||
|
|
||||||
return res, err
|
|
||||||
}
|
|
||||||
|
|
||||||
ss.tcpConn = nil
|
|
||||||
|
|
||||||
return res, err
|
return res, err
|
||||||
|
|
||||||
case base.Pause:
|
case base.Pause:
|
||||||
@@ -971,7 +975,10 @@ func (ss *ServerSession) handleRequest(sc *ServerConn, req *base.Request) (*base
|
|||||||
Query: query,
|
Query: query,
|
||||||
})
|
})
|
||||||
|
|
||||||
if res.StatusCode == base.StatusOK {
|
if res.StatusCode != base.StatusOK {
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
|
|
||||||
switch ss.state {
|
switch ss.state {
|
||||||
case ServerSessionStateRead:
|
case ServerSessionStateRead:
|
||||||
ss.setuppedStream.readerSetInactive(ss)
|
ss.setuppedStream.readerSetInactive(ss)
|
||||||
@@ -1004,7 +1011,6 @@ func (ss *ServerSession) handleRequest(sc *ServerConn, req *base.Request) (*base
|
|||||||
err = liberrors.ErrServerTCPFramesDisable{}
|
err = liberrors.ErrServerTCPFramesDisable{}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
return res, err
|
return res, err
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user