mirror of
https://github.com/aler9/gortsplib
synced 2025-10-06 15:46:51 +08:00
server: use contexts instead of arguments
This commit is contained in:
@@ -8,7 +8,6 @@ import (
|
|||||||
|
|
||||||
"github.com/aler9/gortsplib"
|
"github.com/aler9/gortsplib"
|
||||||
"github.com/aler9/gortsplib/pkg/base"
|
"github.com/aler9/gortsplib/pkg/base"
|
||||||
"github.com/aler9/gortsplib/pkg/headers"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// This example shows how to
|
// This example shows how to
|
||||||
@@ -28,7 +27,7 @@ func handleConn(conn *gortsplib.ServerConn) {
|
|||||||
log.Printf("client connected")
|
log.Printf("client connected")
|
||||||
|
|
||||||
// called after receiving a DESCRIBE request.
|
// called after receiving a DESCRIBE request.
|
||||||
onDescribe := func(req *base.Request) (*base.Response, []byte, error) {
|
onDescribe := func(ctx *gortsplib.ServerConnDescribeCtx) (*base.Response, []byte, error) {
|
||||||
mutex.Lock()
|
mutex.Lock()
|
||||||
defer mutex.Unlock()
|
defer mutex.Unlock()
|
||||||
|
|
||||||
@@ -45,7 +44,7 @@ func handleConn(conn *gortsplib.ServerConn) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// called after receiving an ANNOUNCE request.
|
// called after receiving an ANNOUNCE request.
|
||||||
onAnnounce := func(req *base.Request, tracks gortsplib.Tracks) (*base.Response, error) {
|
onAnnounce := func(ctx *gortsplib.ServerConnAnnounceCtx) (*base.Response, error) {
|
||||||
mutex.Lock()
|
mutex.Lock()
|
||||||
defer mutex.Unlock()
|
defer mutex.Unlock()
|
||||||
|
|
||||||
@@ -56,7 +55,7 @@ func handleConn(conn *gortsplib.ServerConn) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
publisher = conn
|
publisher = conn
|
||||||
sdp = tracks.Write()
|
sdp = ctx.Tracks.Write()
|
||||||
|
|
||||||
return &base.Response{
|
return &base.Response{
|
||||||
StatusCode: base.StatusOK,
|
StatusCode: base.StatusOK,
|
||||||
@@ -67,7 +66,7 @@ func handleConn(conn *gortsplib.ServerConn) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// called after receiving a SETUP request.
|
// called after receiving a SETUP request.
|
||||||
onSetup := func(req *base.Request, th *headers.Transport, path string, trackID int) (*base.Response, error) {
|
onSetup := func(ctx *gortsplib.ServerConnSetupCtx) (*base.Response, error) {
|
||||||
return &base.Response{
|
return &base.Response{
|
||||||
StatusCode: base.StatusOK,
|
StatusCode: base.StatusOK,
|
||||||
Header: base.Header{
|
Header: base.Header{
|
||||||
@@ -77,7 +76,7 @@ func handleConn(conn *gortsplib.ServerConn) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// called after receiving a PLAY request.
|
// called after receiving a PLAY request.
|
||||||
onPlay := func(req *base.Request) (*base.Response, error) {
|
onPlay := func(ctx *gortsplib.ServerConnPlayCtx) (*base.Response, error) {
|
||||||
mutex.Lock()
|
mutex.Lock()
|
||||||
defer mutex.Unlock()
|
defer mutex.Unlock()
|
||||||
|
|
||||||
@@ -92,7 +91,7 @@ func handleConn(conn *gortsplib.ServerConn) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// called after receiving a RECORD request.
|
// called after receiving a RECORD request.
|
||||||
onRecord := func(req *base.Request) (*base.Response, error) {
|
onRecord := func(ctx *gortsplib.ServerConnRecordCtx) (*base.Response, error) {
|
||||||
mutex.Lock()
|
mutex.Lock()
|
||||||
defer mutex.Unlock()
|
defer mutex.Unlock()
|
||||||
|
|
||||||
|
@@ -7,7 +7,6 @@ import (
|
|||||||
|
|
||||||
"github.com/aler9/gortsplib"
|
"github.com/aler9/gortsplib"
|
||||||
"github.com/aler9/gortsplib/pkg/base"
|
"github.com/aler9/gortsplib/pkg/base"
|
||||||
"github.com/aler9/gortsplib/pkg/headers"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// This example shows how to
|
// This example shows how to
|
||||||
@@ -27,7 +26,7 @@ func handleConn(conn *gortsplib.ServerConn) {
|
|||||||
log.Printf("client connected")
|
log.Printf("client connected")
|
||||||
|
|
||||||
// called after receiving a DESCRIBE request.
|
// called after receiving a DESCRIBE request.
|
||||||
onDescribe := func(req *base.Request) (*base.Response, []byte, error) {
|
onDescribe := func(ctx *gortsplib.ServerConnDescribeCtx) (*base.Response, []byte, error) {
|
||||||
mutex.Lock()
|
mutex.Lock()
|
||||||
defer mutex.Unlock()
|
defer mutex.Unlock()
|
||||||
|
|
||||||
@@ -44,7 +43,7 @@ func handleConn(conn *gortsplib.ServerConn) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// called after receiving an ANNOUNCE request.
|
// called after receiving an ANNOUNCE request.
|
||||||
onAnnounce := func(req *base.Request, tracks gortsplib.Tracks) (*base.Response, error) {
|
onAnnounce := func(ctx *gortsplib.ServerConnAnnounceCtx) (*base.Response, error) {
|
||||||
mutex.Lock()
|
mutex.Lock()
|
||||||
defer mutex.Unlock()
|
defer mutex.Unlock()
|
||||||
|
|
||||||
@@ -55,7 +54,7 @@ func handleConn(conn *gortsplib.ServerConn) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
publisher = conn
|
publisher = conn
|
||||||
sdp = tracks.Write()
|
sdp = ctx.Tracks.Write()
|
||||||
|
|
||||||
return &base.Response{
|
return &base.Response{
|
||||||
StatusCode: base.StatusOK,
|
StatusCode: base.StatusOK,
|
||||||
@@ -66,7 +65,7 @@ func handleConn(conn *gortsplib.ServerConn) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// called after receiving a SETUP request.
|
// called after receiving a SETUP request.
|
||||||
onSetup := func(req *base.Request, th *headers.Transport, path string, trackID int) (*base.Response, error) {
|
onSetup := func(ctx *gortsplib.ServerConnSetupCtx) (*base.Response, error) {
|
||||||
return &base.Response{
|
return &base.Response{
|
||||||
StatusCode: base.StatusOK,
|
StatusCode: base.StatusOK,
|
||||||
Header: base.Header{
|
Header: base.Header{
|
||||||
@@ -76,7 +75,7 @@ func handleConn(conn *gortsplib.ServerConn) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// called after receiving a PLAY request.
|
// called after receiving a PLAY request.
|
||||||
onPlay := func(req *base.Request) (*base.Response, error) {
|
onPlay := func(ctx *gortsplib.ServerConnPlayCtx) (*base.Response, error) {
|
||||||
mutex.Lock()
|
mutex.Lock()
|
||||||
defer mutex.Unlock()
|
defer mutex.Unlock()
|
||||||
|
|
||||||
@@ -91,7 +90,7 @@ func handleConn(conn *gortsplib.ServerConn) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// called after receiving a RECORD request.
|
// called after receiving a RECORD request.
|
||||||
onRecord := func(req *base.Request) (*base.Response, error) {
|
onRecord := func(ctx *gortsplib.ServerConnRecordCtx) (*base.Response, error) {
|
||||||
mutex.Lock()
|
mutex.Lock()
|
||||||
defer mutex.Unlock()
|
defer mutex.Unlock()
|
||||||
|
|
||||||
|
@@ -7,7 +7,6 @@ import (
|
|||||||
|
|
||||||
"github.com/aler9/gortsplib"
|
"github.com/aler9/gortsplib"
|
||||||
"github.com/aler9/gortsplib/pkg/base"
|
"github.com/aler9/gortsplib/pkg/base"
|
||||||
"github.com/aler9/gortsplib/pkg/headers"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// This example shows how to
|
// This example shows how to
|
||||||
@@ -27,7 +26,7 @@ func handleConn(conn *gortsplib.ServerConn) {
|
|||||||
log.Printf("client connected")
|
log.Printf("client connected")
|
||||||
|
|
||||||
// called after receiving a DESCRIBE request.
|
// called after receiving a DESCRIBE request.
|
||||||
onDescribe := func(req *base.Request) (*base.Response, []byte, error) {
|
onDescribe := func(ctx *gortsplib.ServerConnDescribeCtx) (*base.Response, []byte, error) {
|
||||||
mutex.Lock()
|
mutex.Lock()
|
||||||
defer mutex.Unlock()
|
defer mutex.Unlock()
|
||||||
|
|
||||||
@@ -44,7 +43,7 @@ func handleConn(conn *gortsplib.ServerConn) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// called after receiving an ANNOUNCE request.
|
// called after receiving an ANNOUNCE request.
|
||||||
onAnnounce := func(req *base.Request, tracks gortsplib.Tracks) (*base.Response, error) {
|
onAnnounce := func(ctx *gortsplib.ServerConnAnnounceCtx) (*base.Response, error) {
|
||||||
mutex.Lock()
|
mutex.Lock()
|
||||||
defer mutex.Unlock()
|
defer mutex.Unlock()
|
||||||
|
|
||||||
@@ -55,7 +54,7 @@ func handleConn(conn *gortsplib.ServerConn) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
publisher = conn
|
publisher = conn
|
||||||
sdp = tracks.Write()
|
sdp = ctx.Tracks.Write()
|
||||||
|
|
||||||
return &base.Response{
|
return &base.Response{
|
||||||
StatusCode: base.StatusOK,
|
StatusCode: base.StatusOK,
|
||||||
@@ -66,7 +65,7 @@ func handleConn(conn *gortsplib.ServerConn) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// called after receiving a SETUP request.
|
// called after receiving a SETUP request.
|
||||||
onSetup := func(req *base.Request, th *headers.Transport, path string, trackID int) (*base.Response, error) {
|
onSetup := func(ctx *gortsplib.ServerConnSetupCtx) (*base.Response, error) {
|
||||||
return &base.Response{
|
return &base.Response{
|
||||||
StatusCode: base.StatusOK,
|
StatusCode: base.StatusOK,
|
||||||
Header: base.Header{
|
Header: base.Header{
|
||||||
@@ -76,7 +75,7 @@ func handleConn(conn *gortsplib.ServerConn) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// called after receiving a PLAY request.
|
// called after receiving a PLAY request.
|
||||||
onPlay := func(req *base.Request) (*base.Response, error) {
|
onPlay := func(ctx *gortsplib.ServerConnPlayCtx) (*base.Response, error) {
|
||||||
mutex.Lock()
|
mutex.Lock()
|
||||||
defer mutex.Unlock()
|
defer mutex.Unlock()
|
||||||
|
|
||||||
@@ -91,7 +90,7 @@ func handleConn(conn *gortsplib.ServerConn) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// called after receiving a RECORD request.
|
// called after receiving a RECORD request.
|
||||||
onRecord := func(req *base.Request) (*base.Response, error) {
|
onRecord := func(ctx *gortsplib.ServerConnRecordCtx) (*base.Response, error) {
|
||||||
mutex.Lock()
|
mutex.Lock()
|
||||||
defer mutex.Unlock()
|
defer mutex.Unlock()
|
||||||
|
|
||||||
|
118
serverconn.go
118
serverconn.go
@@ -132,6 +132,60 @@ type ServerConnAnnouncedTrack struct {
|
|||||||
udpLastFrameTime *int64
|
udpLastFrameTime *int64
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ServerConnOptionsCtx is the context of a OPTIONS request.
|
||||||
|
type ServerConnOptionsCtx struct {
|
||||||
|
Req *base.Request
|
||||||
|
}
|
||||||
|
|
||||||
|
// ServerConnDescribeCtx is the context of a DESCRIBE request.
|
||||||
|
type ServerConnDescribeCtx struct {
|
||||||
|
Req *base.Request
|
||||||
|
}
|
||||||
|
|
||||||
|
// ServerConnAnnounceCtx is the context of a ANNOUNCE request.
|
||||||
|
type ServerConnAnnounceCtx struct {
|
||||||
|
Req *base.Request
|
||||||
|
Tracks Tracks
|
||||||
|
}
|
||||||
|
|
||||||
|
// ServerConnSetupCtx is the context of a OPTIONS request.
|
||||||
|
type ServerConnSetupCtx struct {
|
||||||
|
Req *base.Request
|
||||||
|
Transport *headers.Transport
|
||||||
|
Path string
|
||||||
|
TrackID int
|
||||||
|
}
|
||||||
|
|
||||||
|
// ServerConnPlayCtx is the context of a PLAY request.
|
||||||
|
type ServerConnPlayCtx struct {
|
||||||
|
Req *base.Request
|
||||||
|
}
|
||||||
|
|
||||||
|
// ServerConnRecordCtx is the context of a RECORD request.
|
||||||
|
type ServerConnRecordCtx struct {
|
||||||
|
Req *base.Request
|
||||||
|
}
|
||||||
|
|
||||||
|
// ServerConnPauseCtx is the context of a PAUSE request.
|
||||||
|
type ServerConnPauseCtx struct {
|
||||||
|
Req *base.Request
|
||||||
|
}
|
||||||
|
|
||||||
|
// ServerConnGetParameterCtx is the context of a GET_PARAMETER request.
|
||||||
|
type ServerConnGetParameterCtx struct {
|
||||||
|
Req *base.Request
|
||||||
|
}
|
||||||
|
|
||||||
|
// ServerConnSetParameterCtx is the context of a SET_PARAMETER request.
|
||||||
|
type ServerConnSetParameterCtx struct {
|
||||||
|
Req *base.Request
|
||||||
|
}
|
||||||
|
|
||||||
|
// ServerConnTeardownCtx is the context of a TEARDOWN request.
|
||||||
|
type ServerConnTeardownCtx struct {
|
||||||
|
Req *base.Request
|
||||||
|
}
|
||||||
|
|
||||||
// ServerConnReadHandlers allows to set the handlers required by ServerConn.Read.
|
// ServerConnReadHandlers allows to set the handlers required by ServerConn.Read.
|
||||||
// all fields are optional.
|
// all fields are optional.
|
||||||
type ServerConnReadHandlers struct {
|
type ServerConnReadHandlers struct {
|
||||||
@@ -143,37 +197,37 @@ type ServerConnReadHandlers struct {
|
|||||||
|
|
||||||
// called after receiving a OPTIONS request.
|
// called after receiving a OPTIONS request.
|
||||||
// if nil, it is generated automatically.
|
// if nil, it is generated automatically.
|
||||||
OnOptions func(req *base.Request) (*base.Response, error)
|
OnOptions func(ctx *ServerConnOptionsCtx) (*base.Response, error)
|
||||||
|
|
||||||
// called after receiving a DESCRIBE request.
|
// called after receiving a DESCRIBE request.
|
||||||
// the 2nd return value is a SDP, that is inserted into the response.
|
// the 2nd return value is a SDP, that is inserted into the response.
|
||||||
OnDescribe func(req *base.Request) (*base.Response, []byte, error)
|
OnDescribe func(ctx *ServerConnDescribeCtx) (*base.Response, []byte, error)
|
||||||
|
|
||||||
// called after receiving an ANNOUNCE request.
|
// called after receiving an ANNOUNCE request.
|
||||||
OnAnnounce func(req *base.Request, tracks Tracks) (*base.Response, error)
|
OnAnnounce func(ctx *ServerConnAnnounceCtx) (*base.Response, error)
|
||||||
|
|
||||||
// called after receiving a SETUP request.
|
// called after receiving a SETUP request.
|
||||||
OnSetup func(req *base.Request, th *headers.Transport, path string, trackID int) (*base.Response, error)
|
OnSetup func(ctx *ServerConnSetupCtx) (*base.Response, error)
|
||||||
|
|
||||||
// called after receiving a PLAY request.
|
// called after receiving a PLAY request.
|
||||||
OnPlay func(req *base.Request) (*base.Response, error)
|
OnPlay func(ctx *ServerConnPlayCtx) (*base.Response, error)
|
||||||
|
|
||||||
// called after receiving a RECORD request.
|
// called after receiving a RECORD request.
|
||||||
OnRecord func(req *base.Request) (*base.Response, error)
|
OnRecord func(ctx *ServerConnRecordCtx) (*base.Response, error)
|
||||||
|
|
||||||
// called after receiving a PAUSE request.
|
// called after receiving a PAUSE request.
|
||||||
OnPause func(req *base.Request) (*base.Response, error)
|
OnPause func(ctx *ServerConnPauseCtx) (*base.Response, error)
|
||||||
|
|
||||||
// called after receiving a GET_PARAMETER request.
|
// called after receiving a GET_PARAMETER request.
|
||||||
// if nil, it is generated automatically.
|
// if nil, it is generated automatically.
|
||||||
OnGetParameter func(req *base.Request) (*base.Response, error)
|
OnGetParameter func(ctx *ServerConnGetParameterCtx) (*base.Response, error)
|
||||||
|
|
||||||
// called after receiving a SET_PARAMETER request.
|
// called after receiving a SET_PARAMETER request.
|
||||||
OnSetParameter func(req *base.Request) (*base.Response, error)
|
OnSetParameter func(ctx *ServerConnSetParameterCtx) (*base.Response, error)
|
||||||
|
|
||||||
// called after receiving a TEARDOWN request.
|
// called after receiving a TEARDOWN request.
|
||||||
// if nil, it is generated automatically.
|
// if nil, it is generated automatically.
|
||||||
OnTeardown func(req *base.Request) (*base.Response, error)
|
OnTeardown func(ctx *ServerConnTeardownCtx) (*base.Response, error)
|
||||||
|
|
||||||
// called after receiving a frame.
|
// called after receiving a frame.
|
||||||
OnFrame func(trackID int, streamType StreamType, payload []byte)
|
OnFrame func(trackID int, streamType StreamType, payload []byte)
|
||||||
@@ -399,7 +453,9 @@ func (sc *ServerConn) handleRequest(req *base.Request) (*base.Response, error) {
|
|||||||
switch req.Method {
|
switch req.Method {
|
||||||
case base.Options:
|
case base.Options:
|
||||||
if sc.readHandlers.OnOptions != nil {
|
if sc.readHandlers.OnOptions != nil {
|
||||||
return sc.readHandlers.OnOptions(req)
|
return sc.readHandlers.OnOptions(&ServerConnOptionsCtx{
|
||||||
|
Req: req,
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
var methods []string
|
var methods []string
|
||||||
@@ -445,7 +501,9 @@ func (sc *ServerConn) handleRequest(req *base.Request) (*base.Response, error) {
|
|||||||
}, err
|
}, err
|
||||||
}
|
}
|
||||||
|
|
||||||
res, sdp, err := sc.readHandlers.OnDescribe(req)
|
res, sdp, err := sc.readHandlers.OnDescribe(&ServerConnDescribeCtx{
|
||||||
|
Req: req,
|
||||||
|
})
|
||||||
|
|
||||||
if res.StatusCode == base.StatusOK && sdp != nil {
|
if res.StatusCode == base.StatusOK && sdp != nil {
|
||||||
if res.Header == nil {
|
if res.Header == nil {
|
||||||
@@ -527,7 +585,10 @@ func (sc *ServerConn) handleRequest(req *base.Request) (*base.Response, error) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
res, err := sc.readHandlers.OnAnnounce(req, tracks)
|
res, err := sc.readHandlers.OnAnnounce(&ServerConnAnnounceCtx{
|
||||||
|
Req: req,
|
||||||
|
Tracks: tracks,
|
||||||
|
})
|
||||||
|
|
||||||
if res.StatusCode == base.StatusOK {
|
if res.StatusCode == base.StatusOK {
|
||||||
sc.state = ServerConnStatePreRecord
|
sc.state = ServerConnStatePreRecord
|
||||||
@@ -640,7 +701,12 @@ func (sc *ServerConn) handleRequest(req *base.Request) (*base.Response, error) {
|
|||||||
}, fmt.Errorf("can't setup tracks with different protocols")
|
}, fmt.Errorf("can't setup tracks with different protocols")
|
||||||
}
|
}
|
||||||
|
|
||||||
res, err := sc.readHandlers.OnSetup(req, th, path, trackID)
|
res, err := sc.readHandlers.OnSetup(&ServerConnSetupCtx{
|
||||||
|
Req: req,
|
||||||
|
Transport: th,
|
||||||
|
Path: path,
|
||||||
|
TrackID: trackID,
|
||||||
|
})
|
||||||
|
|
||||||
if res.StatusCode == base.StatusOK {
|
if res.StatusCode == base.StatusOK {
|
||||||
sc.setupProtocol = &th.Protocol
|
sc.setupProtocol = &th.Protocol
|
||||||
@@ -721,7 +787,9 @@ func (sc *ServerConn) handleRequest(req *base.Request) (*base.Response, error) {
|
|||||||
}, fmt.Errorf("no tracks have been setup")
|
}, fmt.Errorf("no tracks have been setup")
|
||||||
}
|
}
|
||||||
|
|
||||||
res, err := sc.readHandlers.OnPlay(req)
|
res, err := sc.readHandlers.OnPlay(&ServerConnPlayCtx{
|
||||||
|
Req: req,
|
||||||
|
})
|
||||||
|
|
||||||
if res.StatusCode == base.StatusOK && sc.state != ServerConnStatePlay {
|
if res.StatusCode == base.StatusOK && sc.state != ServerConnStatePlay {
|
||||||
sc.state = ServerConnStatePlay
|
sc.state = ServerConnStatePlay
|
||||||
@@ -754,7 +822,9 @@ func (sc *ServerConn) handleRequest(req *base.Request) (*base.Response, error) {
|
|||||||
}, fmt.Errorf("not all announced tracks have been setup")
|
}, fmt.Errorf("not all announced tracks have been setup")
|
||||||
}
|
}
|
||||||
|
|
||||||
res, err := sc.readHandlers.OnRecord(req)
|
res, err := sc.readHandlers.OnRecord(&ServerConnRecordCtx{
|
||||||
|
Req: req,
|
||||||
|
})
|
||||||
|
|
||||||
if res.StatusCode == base.StatusOK {
|
if res.StatusCode == base.StatusOK {
|
||||||
sc.state = ServerConnStateRecord
|
sc.state = ServerConnStateRecord
|
||||||
@@ -778,7 +848,9 @@ func (sc *ServerConn) handleRequest(req *base.Request) (*base.Response, error) {
|
|||||||
}, err
|
}, err
|
||||||
}
|
}
|
||||||
|
|
||||||
res, err := sc.readHandlers.OnPause(req)
|
res, err := sc.readHandlers.OnPause(&ServerConnPauseCtx{
|
||||||
|
Req: req,
|
||||||
|
})
|
||||||
|
|
||||||
if res.StatusCode == base.StatusOK {
|
if res.StatusCode == base.StatusOK {
|
||||||
switch sc.state {
|
switch sc.state {
|
||||||
@@ -797,7 +869,9 @@ func (sc *ServerConn) handleRequest(req *base.Request) (*base.Response, error) {
|
|||||||
|
|
||||||
case base.GetParameter:
|
case base.GetParameter:
|
||||||
if sc.readHandlers.OnGetParameter != nil {
|
if sc.readHandlers.OnGetParameter != nil {
|
||||||
return sc.readHandlers.OnGetParameter(req)
|
return sc.readHandlers.OnGetParameter(&ServerConnGetParameterCtx{
|
||||||
|
Req: req,
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// GET_PARAMETER is used like a ping
|
// GET_PARAMETER is used like a ping
|
||||||
@@ -811,12 +885,16 @@ func (sc *ServerConn) handleRequest(req *base.Request) (*base.Response, error) {
|
|||||||
|
|
||||||
case base.SetParameter:
|
case base.SetParameter:
|
||||||
if sc.readHandlers.OnSetParameter != nil {
|
if sc.readHandlers.OnSetParameter != nil {
|
||||||
return sc.readHandlers.OnSetParameter(req)
|
return sc.readHandlers.OnSetParameter(&ServerConnSetParameterCtx{
|
||||||
|
Req: req,
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
case base.Teardown:
|
case base.Teardown:
|
||||||
if sc.readHandlers.OnTeardown != nil {
|
if sc.readHandlers.OnTeardown != nil {
|
||||||
return sc.readHandlers.OnTeardown(req)
|
return sc.readHandlers.OnTeardown(&ServerConnTeardownCtx{
|
||||||
|
Req: req,
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
return &base.Response{
|
return &base.Response{
|
||||||
|
@@ -14,7 +14,6 @@ import (
|
|||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
|
|
||||||
"github.com/aler9/gortsplib/pkg/base"
|
"github.com/aler9/gortsplib/pkg/base"
|
||||||
"github.com/aler9/gortsplib/pkg/headers"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type testServ struct {
|
type testServ struct {
|
||||||
@@ -78,18 +77,18 @@ func (ts *testServ) handleConn(conn *ServerConn) {
|
|||||||
defer ts.wg.Done()
|
defer ts.wg.Done()
|
||||||
defer conn.Close()
|
defer conn.Close()
|
||||||
|
|
||||||
onDescribe := func(req *base.Request) (*base.Response, []byte, error) {
|
onDescribe := func(ctx *ServerConnDescribeCtx) (*base.Response, []byte, error) {
|
||||||
reqPath, ok := req.URL.RTSPPath()
|
reqPath, ok := ctx.Req.URL.RTSPPath()
|
||||||
if !ok {
|
if !ok {
|
||||||
return &base.Response{
|
return &base.Response{
|
||||||
StatusCode: base.StatusBadRequest,
|
StatusCode: base.StatusBadRequest,
|
||||||
}, nil, fmt.Errorf("invalid path (%s)", req.URL)
|
}, nil, fmt.Errorf("invalid path (%s)", ctx.Req.URL)
|
||||||
}
|
}
|
||||||
|
|
||||||
if reqPath != "teststream" {
|
if reqPath != "teststream" {
|
||||||
return &base.Response{
|
return &base.Response{
|
||||||
StatusCode: base.StatusBadRequest,
|
StatusCode: base.StatusBadRequest,
|
||||||
}, nil, fmt.Errorf("invalid path (%s)", req.URL)
|
}, nil, fmt.Errorf("invalid path (%s)", ctx.Req.URL)
|
||||||
}
|
}
|
||||||
|
|
||||||
ts.mutex.Lock()
|
ts.mutex.Lock()
|
||||||
@@ -106,18 +105,18 @@ func (ts *testServ) handleConn(conn *ServerConn) {
|
|||||||
}, ts.sdp, nil
|
}, ts.sdp, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
onAnnounce := func(req *base.Request, tracks Tracks) (*base.Response, error) {
|
onAnnounce := func(ctx *ServerConnAnnounceCtx) (*base.Response, error) {
|
||||||
reqPath, ok := req.URL.RTSPPath()
|
reqPath, ok := ctx.Req.URL.RTSPPath()
|
||||||
if !ok {
|
if !ok {
|
||||||
return &base.Response{
|
return &base.Response{
|
||||||
StatusCode: base.StatusBadRequest,
|
StatusCode: base.StatusBadRequest,
|
||||||
}, fmt.Errorf("invalid path (%s)", req.URL)
|
}, fmt.Errorf("invalid path (%s)", ctx.Req.URL)
|
||||||
}
|
}
|
||||||
|
|
||||||
if reqPath != "teststream" {
|
if reqPath != "teststream" {
|
||||||
return &base.Response{
|
return &base.Response{
|
||||||
StatusCode: base.StatusBadRequest,
|
StatusCode: base.StatusBadRequest,
|
||||||
}, fmt.Errorf("invalid path (%s)", req.URL)
|
}, fmt.Errorf("invalid path (%s)", ctx.Req.URL)
|
||||||
}
|
}
|
||||||
|
|
||||||
ts.mutex.Lock()
|
ts.mutex.Lock()
|
||||||
@@ -130,7 +129,7 @@ func (ts *testServ) handleConn(conn *ServerConn) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
ts.publisher = conn
|
ts.publisher = conn
|
||||||
ts.sdp = tracks.Write()
|
ts.sdp = ctx.Tracks.Write()
|
||||||
|
|
||||||
return &base.Response{
|
return &base.Response{
|
||||||
StatusCode: base.StatusOK,
|
StatusCode: base.StatusOK,
|
||||||
@@ -140,11 +139,11 @@ func (ts *testServ) handleConn(conn *ServerConn) {
|
|||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
onSetup := func(req *base.Request, th *headers.Transport, path string, trackID int) (*base.Response, error) {
|
onSetup := func(ctx *ServerConnSetupCtx) (*base.Response, error) {
|
||||||
if path != "teststream" {
|
if ctx.Path != "teststream" {
|
||||||
return &base.Response{
|
return &base.Response{
|
||||||
StatusCode: base.StatusBadRequest,
|
StatusCode: base.StatusBadRequest,
|
||||||
}, fmt.Errorf("invalid path (%s)", req.URL)
|
}, fmt.Errorf("invalid path (%s)", ctx.Req.URL)
|
||||||
}
|
}
|
||||||
|
|
||||||
return &base.Response{
|
return &base.Response{
|
||||||
@@ -155,12 +154,12 @@ func (ts *testServ) handleConn(conn *ServerConn) {
|
|||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
onPlay := func(req *base.Request) (*base.Response, error) {
|
onPlay := func(ctx *ServerConnPlayCtx) (*base.Response, error) {
|
||||||
reqPath, ok := req.URL.RTSPPath()
|
reqPath, ok := ctx.Req.URL.RTSPPath()
|
||||||
if !ok {
|
if !ok {
|
||||||
return &base.Response{
|
return &base.Response{
|
||||||
StatusCode: base.StatusBadRequest,
|
StatusCode: base.StatusBadRequest,
|
||||||
}, fmt.Errorf("invalid path (%s)", req.URL)
|
}, fmt.Errorf("invalid path (%s)", ctx.Req.URL)
|
||||||
}
|
}
|
||||||
|
|
||||||
// path can end with a slash, remove it
|
// path can end with a slash, remove it
|
||||||
@@ -169,7 +168,7 @@ func (ts *testServ) handleConn(conn *ServerConn) {
|
|||||||
if reqPath != "teststream" {
|
if reqPath != "teststream" {
|
||||||
return &base.Response{
|
return &base.Response{
|
||||||
StatusCode: base.StatusBadRequest,
|
StatusCode: base.StatusBadRequest,
|
||||||
}, fmt.Errorf("invalid path (%s)", req.URL)
|
}, fmt.Errorf("invalid path (%s)", ctx.Req.URL)
|
||||||
}
|
}
|
||||||
|
|
||||||
ts.mutex.Lock()
|
ts.mutex.Lock()
|
||||||
@@ -185,12 +184,12 @@ func (ts *testServ) handleConn(conn *ServerConn) {
|
|||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
onRecord := func(req *base.Request) (*base.Response, error) {
|
onRecord := func(ctx *ServerConnRecordCtx) (*base.Response, error) {
|
||||||
reqPath, ok := req.URL.RTSPPath()
|
reqPath, ok := ctx.Req.URL.RTSPPath()
|
||||||
if !ok {
|
if !ok {
|
||||||
return &base.Response{
|
return &base.Response{
|
||||||
StatusCode: base.StatusBadRequest,
|
StatusCode: base.StatusBadRequest,
|
||||||
}, fmt.Errorf("invalid path (%s)", req.URL)
|
}, fmt.Errorf("invalid path (%s)", ctx.Req.URL)
|
||||||
}
|
}
|
||||||
|
|
||||||
// path can end with a slash, remove it
|
// path can end with a slash, remove it
|
||||||
@@ -199,7 +198,7 @@ func (ts *testServ) handleConn(conn *ServerConn) {
|
|||||||
if reqPath != "teststream" {
|
if reqPath != "teststream" {
|
||||||
return &base.Response{
|
return &base.Response{
|
||||||
StatusCode: base.StatusBadRequest,
|
StatusCode: base.StatusBadRequest,
|
||||||
}, fmt.Errorf("invalid path (%s)", req.URL)
|
}, fmt.Errorf("invalid path (%s)", ctx.Req.URL)
|
||||||
}
|
}
|
||||||
|
|
||||||
ts.mutex.Lock()
|
ts.mutex.Lock()
|
||||||
|
@@ -86,14 +86,14 @@ func TestServerConnPublishSetupPath(t *testing.T) {
|
|||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
defer conn.Close()
|
defer conn.Close()
|
||||||
|
|
||||||
onAnnounce := func(req *base.Request, tracks Tracks) (*base.Response, error) {
|
onAnnounce := func(ctx *ServerConnAnnounceCtx) (*base.Response, error) {
|
||||||
return &base.Response{
|
return &base.Response{
|
||||||
StatusCode: base.StatusOK,
|
StatusCode: base.StatusOK,
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
onSetup := func(req *base.Request, th *headers.Transport, path string, trackID int) (*base.Response, error) {
|
onSetup := func(ctx *ServerConnSetupCtx) (*base.Response, error) {
|
||||||
setupDone <- pathTrackIDPair{path, trackID}
|
setupDone <- pathTrackIDPair{ctx.Path, ctx.TrackID}
|
||||||
return &base.Response{
|
return &base.Response{
|
||||||
StatusCode: base.StatusOK,
|
StatusCode: base.StatusOK,
|
||||||
}, nil
|
}, nil
|
||||||
@@ -201,13 +201,13 @@ func TestServerConnPublishSetupDifferentPaths(t *testing.T) {
|
|||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
defer conn.Close()
|
defer conn.Close()
|
||||||
|
|
||||||
onAnnounce := func(req *base.Request, tracks Tracks) (*base.Response, error) {
|
onAnnounce := func(ctx *ServerConnAnnounceCtx) (*base.Response, error) {
|
||||||
return &base.Response{
|
return &base.Response{
|
||||||
StatusCode: base.StatusOK,
|
StatusCode: base.StatusOK,
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
onSetup := func(req *base.Request, th *headers.Transport, path string, trackID int) (*base.Response, error) {
|
onSetup := func(ctx *ServerConnSetupCtx) (*base.Response, error) {
|
||||||
return &base.Response{
|
return &base.Response{
|
||||||
StatusCode: base.StatusOK,
|
StatusCode: base.StatusOK,
|
||||||
}, nil
|
}, nil
|
||||||
@@ -299,13 +299,13 @@ func TestServerConnPublishSetupDouble(t *testing.T) {
|
|||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
defer conn.Close()
|
defer conn.Close()
|
||||||
|
|
||||||
onAnnounce := func(req *base.Request, tracks Tracks) (*base.Response, error) {
|
onAnnounce := func(ctx *ServerConnAnnounceCtx) (*base.Response, error) {
|
||||||
return &base.Response{
|
return &base.Response{
|
||||||
StatusCode: base.StatusOK,
|
StatusCode: base.StatusOK,
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
onSetup := func(req *base.Request, th *headers.Transport, path string, trackID int) (*base.Response, error) {
|
onSetup := func(ctx *ServerConnSetupCtx) (*base.Response, error) {
|
||||||
return &base.Response{
|
return &base.Response{
|
||||||
StatusCode: base.StatusOK,
|
StatusCode: base.StatusOK,
|
||||||
}, nil
|
}, nil
|
||||||
@@ -411,19 +411,19 @@ func TestServerConnPublishRecordPartialTracks(t *testing.T) {
|
|||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
defer conn.Close()
|
defer conn.Close()
|
||||||
|
|
||||||
onAnnounce := func(req *base.Request, tracks Tracks) (*base.Response, error) {
|
onAnnounce := func(ctx *ServerConnAnnounceCtx) (*base.Response, error) {
|
||||||
return &base.Response{
|
return &base.Response{
|
||||||
StatusCode: base.StatusOK,
|
StatusCode: base.StatusOK,
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
onSetup := func(req *base.Request, th *headers.Transport, path string, trackID int) (*base.Response, error) {
|
onSetup := func(ctx *ServerConnSetupCtx) (*base.Response, error) {
|
||||||
return &base.Response{
|
return &base.Response{
|
||||||
StatusCode: base.StatusOK,
|
StatusCode: base.StatusOK,
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
onRecord := func(req *base.Request) (*base.Response, error) {
|
onRecord := func(ctx *ServerConnRecordCtx) (*base.Response, error) {
|
||||||
return &base.Response{
|
return &base.Response{
|
||||||
StatusCode: base.StatusOK,
|
StatusCode: base.StatusOK,
|
||||||
}, nil
|
}, nil
|
||||||
@@ -544,19 +544,19 @@ func TestServerConnPublishReceivePackets(t *testing.T) {
|
|||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
defer conn.Close()
|
defer conn.Close()
|
||||||
|
|
||||||
onAnnounce := func(req *base.Request, tracks Tracks) (*base.Response, error) {
|
onAnnounce := func(ctx *ServerConnAnnounceCtx) (*base.Response, error) {
|
||||||
return &base.Response{
|
return &base.Response{
|
||||||
StatusCode: base.StatusOK,
|
StatusCode: base.StatusOK,
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
onSetup := func(req *base.Request, th *headers.Transport, path string, trackID int) (*base.Response, error) {
|
onSetup := func(ctx *ServerConnSetupCtx) (*base.Response, error) {
|
||||||
return &base.Response{
|
return &base.Response{
|
||||||
StatusCode: base.StatusOK,
|
StatusCode: base.StatusOK,
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
onRecord := func(req *base.Request) (*base.Response, error) {
|
onRecord := func(ctx *ServerConnRecordCtx) (*base.Response, error) {
|
||||||
return &base.Response{
|
return &base.Response{
|
||||||
StatusCode: base.StatusOK,
|
StatusCode: base.StatusOK,
|
||||||
}, nil
|
}, nil
|
||||||
|
@@ -77,8 +77,8 @@ func TestServerConnReadSetupPath(t *testing.T) {
|
|||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
defer conn.Close()
|
defer conn.Close()
|
||||||
|
|
||||||
onSetup := func(req *base.Request, th *headers.Transport, path string, trackID int) (*base.Response, error) {
|
onSetup := func(ctx *ServerConnSetupCtx) (*base.Response, error) {
|
||||||
setupDone <- pathTrackIDPair{path, trackID}
|
setupDone <- pathTrackIDPair{ctx.Path, ctx.TrackID}
|
||||||
return &base.Response{
|
return &base.Response{
|
||||||
StatusCode: base.StatusOK,
|
StatusCode: base.StatusOK,
|
||||||
}, nil
|
}, nil
|
||||||
@@ -145,7 +145,7 @@ func TestServerConnReadSetupDifferentPaths(t *testing.T) {
|
|||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
defer conn.Close()
|
defer conn.Close()
|
||||||
|
|
||||||
onSetup := func(req *base.Request, th *headers.Transport, path string, trackID int) (*base.Response, error) {
|
onSetup := func(ctx *ServerConnSetupCtx) (*base.Response, error) {
|
||||||
return &base.Response{
|
return &base.Response{
|
||||||
StatusCode: base.StatusOK,
|
StatusCode: base.StatusOK,
|
||||||
}, nil
|
}, nil
|
||||||
@@ -226,7 +226,7 @@ func TestServerConnReadSetupDouble(t *testing.T) {
|
|||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
defer conn.Close()
|
defer conn.Close()
|
||||||
|
|
||||||
onSetup := func(req *base.Request, th *headers.Transport, path string, trackID int) (*base.Response, error) {
|
onSetup := func(ctx *ServerConnSetupCtx) (*base.Response, error) {
|
||||||
return &base.Response{
|
return &base.Response{
|
||||||
StatusCode: base.StatusOK,
|
StatusCode: base.StatusOK,
|
||||||
}, nil
|
}, nil
|
||||||
@@ -317,13 +317,13 @@ func TestServerConnReadReceivePackets(t *testing.T) {
|
|||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
defer conn.Close()
|
defer conn.Close()
|
||||||
|
|
||||||
onSetup := func(req *base.Request, th *headers.Transport, path string, trackID int) (*base.Response, error) {
|
onSetup := func(ctx *ServerConnSetupCtx) (*base.Response, error) {
|
||||||
return &base.Response{
|
return &base.Response{
|
||||||
StatusCode: base.StatusOK,
|
StatusCode: base.StatusOK,
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
onPlay := func(req *base.Request) (*base.Response, error) {
|
onPlay := func(ctx *ServerConnPlayCtx) (*base.Response, error) {
|
||||||
return &base.Response{
|
return &base.Response{
|
||||||
StatusCode: base.StatusOK,
|
StatusCode: base.StatusOK,
|
||||||
}, nil
|
}, nil
|
||||||
@@ -442,13 +442,13 @@ func TestServerConnReadTCPResponseBeforeFrames(t *testing.T) {
|
|||||||
writerTerminate := make(chan struct{})
|
writerTerminate := make(chan struct{})
|
||||||
defer close(writerTerminate)
|
defer close(writerTerminate)
|
||||||
|
|
||||||
onSetup := func(req *base.Request, th *headers.Transport, path string, trackID int) (*base.Response, error) {
|
onSetup := func(ctx *ServerConnSetupCtx) (*base.Response, error) {
|
||||||
return &base.Response{
|
return &base.Response{
|
||||||
StatusCode: base.StatusOK,
|
StatusCode: base.StatusOK,
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
onPlay := func(req *base.Request) (*base.Response, error) {
|
onPlay := func(ctx *ServerConnPlayCtx) (*base.Response, error) {
|
||||||
go func() {
|
go func() {
|
||||||
defer close(writerDone)
|
defer close(writerDone)
|
||||||
|
|
||||||
@@ -549,13 +549,13 @@ func TestServerConnReadPlayMultiple(t *testing.T) {
|
|||||||
writerTerminate := make(chan struct{})
|
writerTerminate := make(chan struct{})
|
||||||
defer close(writerTerminate)
|
defer close(writerTerminate)
|
||||||
|
|
||||||
onSetup := func(req *base.Request, th *headers.Transport, path string, trackID int) (*base.Response, error) {
|
onSetup := func(ctx *ServerConnSetupCtx) (*base.Response, error) {
|
||||||
return &base.Response{
|
return &base.Response{
|
||||||
StatusCode: base.StatusOK,
|
StatusCode: base.StatusOK,
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
onPlay := func(req *base.Request) (*base.Response, error) {
|
onPlay := func(ctx *ServerConnPlayCtx) (*base.Response, error) {
|
||||||
if conn.State() != ServerConnStatePlay {
|
if conn.State() != ServerConnStatePlay {
|
||||||
go func() {
|
go func() {
|
||||||
defer close(writerDone)
|
defer close(writerDone)
|
||||||
@@ -663,13 +663,13 @@ func TestServerConnReadPauseMultiple(t *testing.T) {
|
|||||||
writerTerminate := make(chan struct{})
|
writerTerminate := make(chan struct{})
|
||||||
defer close(writerTerminate)
|
defer close(writerTerminate)
|
||||||
|
|
||||||
onSetup := func(req *base.Request, th *headers.Transport, path string, trackID int) (*base.Response, error) {
|
onSetup := func(ctx *ServerConnSetupCtx) (*base.Response, error) {
|
||||||
return &base.Response{
|
return &base.Response{
|
||||||
StatusCode: base.StatusOK,
|
StatusCode: base.StatusOK,
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
onPlay := func(req *base.Request) (*base.Response, error) {
|
onPlay := func(ctx *ServerConnPlayCtx) (*base.Response, error) {
|
||||||
go func() {
|
go func() {
|
||||||
defer close(writerDone)
|
defer close(writerDone)
|
||||||
|
|
||||||
@@ -691,7 +691,7 @@ func TestServerConnReadPauseMultiple(t *testing.T) {
|
|||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
onPause := func(req *base.Request) (*base.Response, error) {
|
onPause := func(ctx *ServerConnPauseCtx) (*base.Response, error) {
|
||||||
return &base.Response{
|
return &base.Response{
|
||||||
StatusCode: base.StatusOK,
|
StatusCode: base.StatusOK,
|
||||||
}, nil
|
}, nil
|
||||||
|
Reference in New Issue
Block a user