mirror of
https://github.com/aler9/gortsplib
synced 2025-10-05 23:26:54 +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/pkg/base"
|
||||
"github.com/aler9/gortsplib/pkg/headers"
|
||||
)
|
||||
|
||||
// This example shows how to
|
||||
@@ -28,7 +27,7 @@ func handleConn(conn *gortsplib.ServerConn) {
|
||||
log.Printf("client connected")
|
||||
|
||||
// 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()
|
||||
defer mutex.Unlock()
|
||||
|
||||
@@ -45,7 +44,7 @@ func handleConn(conn *gortsplib.ServerConn) {
|
||||
}
|
||||
|
||||
// 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()
|
||||
defer mutex.Unlock()
|
||||
|
||||
@@ -56,7 +55,7 @@ func handleConn(conn *gortsplib.ServerConn) {
|
||||
}
|
||||
|
||||
publisher = conn
|
||||
sdp = tracks.Write()
|
||||
sdp = ctx.Tracks.Write()
|
||||
|
||||
return &base.Response{
|
||||
StatusCode: base.StatusOK,
|
||||
@@ -67,7 +66,7 @@ func handleConn(conn *gortsplib.ServerConn) {
|
||||
}
|
||||
|
||||
// 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{
|
||||
StatusCode: base.StatusOK,
|
||||
Header: base.Header{
|
||||
@@ -77,7 +76,7 @@ func handleConn(conn *gortsplib.ServerConn) {
|
||||
}
|
||||
|
||||
// called after receiving a PLAY request.
|
||||
onPlay := func(req *base.Request) (*base.Response, error) {
|
||||
onPlay := func(ctx *gortsplib.ServerConnPlayCtx) (*base.Response, error) {
|
||||
mutex.Lock()
|
||||
defer mutex.Unlock()
|
||||
|
||||
@@ -92,7 +91,7 @@ func handleConn(conn *gortsplib.ServerConn) {
|
||||
}
|
||||
|
||||
// called after receiving a RECORD request.
|
||||
onRecord := func(req *base.Request) (*base.Response, error) {
|
||||
onRecord := func(ctx *gortsplib.ServerConnRecordCtx) (*base.Response, error) {
|
||||
mutex.Lock()
|
||||
defer mutex.Unlock()
|
||||
|
||||
|
@@ -7,7 +7,6 @@ import (
|
||||
|
||||
"github.com/aler9/gortsplib"
|
||||
"github.com/aler9/gortsplib/pkg/base"
|
||||
"github.com/aler9/gortsplib/pkg/headers"
|
||||
)
|
||||
|
||||
// This example shows how to
|
||||
@@ -27,7 +26,7 @@ func handleConn(conn *gortsplib.ServerConn) {
|
||||
log.Printf("client connected")
|
||||
|
||||
// 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()
|
||||
defer mutex.Unlock()
|
||||
|
||||
@@ -44,7 +43,7 @@ func handleConn(conn *gortsplib.ServerConn) {
|
||||
}
|
||||
|
||||
// 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()
|
||||
defer mutex.Unlock()
|
||||
|
||||
@@ -55,7 +54,7 @@ func handleConn(conn *gortsplib.ServerConn) {
|
||||
}
|
||||
|
||||
publisher = conn
|
||||
sdp = tracks.Write()
|
||||
sdp = ctx.Tracks.Write()
|
||||
|
||||
return &base.Response{
|
||||
StatusCode: base.StatusOK,
|
||||
@@ -66,7 +65,7 @@ func handleConn(conn *gortsplib.ServerConn) {
|
||||
}
|
||||
|
||||
// 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{
|
||||
StatusCode: base.StatusOK,
|
||||
Header: base.Header{
|
||||
@@ -76,7 +75,7 @@ func handleConn(conn *gortsplib.ServerConn) {
|
||||
}
|
||||
|
||||
// called after receiving a PLAY request.
|
||||
onPlay := func(req *base.Request) (*base.Response, error) {
|
||||
onPlay := func(ctx *gortsplib.ServerConnPlayCtx) (*base.Response, error) {
|
||||
mutex.Lock()
|
||||
defer mutex.Unlock()
|
||||
|
||||
@@ -91,7 +90,7 @@ func handleConn(conn *gortsplib.ServerConn) {
|
||||
}
|
||||
|
||||
// called after receiving a RECORD request.
|
||||
onRecord := func(req *base.Request) (*base.Response, error) {
|
||||
onRecord := func(ctx *gortsplib.ServerConnRecordCtx) (*base.Response, error) {
|
||||
mutex.Lock()
|
||||
defer mutex.Unlock()
|
||||
|
||||
|
@@ -7,7 +7,6 @@ import (
|
||||
|
||||
"github.com/aler9/gortsplib"
|
||||
"github.com/aler9/gortsplib/pkg/base"
|
||||
"github.com/aler9/gortsplib/pkg/headers"
|
||||
)
|
||||
|
||||
// This example shows how to
|
||||
@@ -27,7 +26,7 @@ func handleConn(conn *gortsplib.ServerConn) {
|
||||
log.Printf("client connected")
|
||||
|
||||
// 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()
|
||||
defer mutex.Unlock()
|
||||
|
||||
@@ -44,7 +43,7 @@ func handleConn(conn *gortsplib.ServerConn) {
|
||||
}
|
||||
|
||||
// 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()
|
||||
defer mutex.Unlock()
|
||||
|
||||
@@ -55,7 +54,7 @@ func handleConn(conn *gortsplib.ServerConn) {
|
||||
}
|
||||
|
||||
publisher = conn
|
||||
sdp = tracks.Write()
|
||||
sdp = ctx.Tracks.Write()
|
||||
|
||||
return &base.Response{
|
||||
StatusCode: base.StatusOK,
|
||||
@@ -66,7 +65,7 @@ func handleConn(conn *gortsplib.ServerConn) {
|
||||
}
|
||||
|
||||
// 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{
|
||||
StatusCode: base.StatusOK,
|
||||
Header: base.Header{
|
||||
@@ -76,7 +75,7 @@ func handleConn(conn *gortsplib.ServerConn) {
|
||||
}
|
||||
|
||||
// called after receiving a PLAY request.
|
||||
onPlay := func(req *base.Request) (*base.Response, error) {
|
||||
onPlay := func(ctx *gortsplib.ServerConnPlayCtx) (*base.Response, error) {
|
||||
mutex.Lock()
|
||||
defer mutex.Unlock()
|
||||
|
||||
@@ -91,7 +90,7 @@ func handleConn(conn *gortsplib.ServerConn) {
|
||||
}
|
||||
|
||||
// called after receiving a RECORD request.
|
||||
onRecord := func(req *base.Request) (*base.Response, error) {
|
||||
onRecord := func(ctx *gortsplib.ServerConnRecordCtx) (*base.Response, error) {
|
||||
mutex.Lock()
|
||||
defer mutex.Unlock()
|
||||
|
||||
|
118
serverconn.go
118
serverconn.go
@@ -132,6 +132,60 @@ type ServerConnAnnouncedTrack struct {
|
||||
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.
|
||||
// all fields are optional.
|
||||
type ServerConnReadHandlers struct {
|
||||
@@ -143,37 +197,37 @@ type ServerConnReadHandlers struct {
|
||||
|
||||
// called after receiving a OPTIONS request.
|
||||
// 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.
|
||||
// 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.
|
||||
OnAnnounce func(req *base.Request, tracks Tracks) (*base.Response, error)
|
||||
OnAnnounce func(ctx *ServerConnAnnounceCtx) (*base.Response, error)
|
||||
|
||||
// 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.
|
||||
OnPlay func(req *base.Request) (*base.Response, error)
|
||||
OnPlay func(ctx *ServerConnPlayCtx) (*base.Response, error)
|
||||
|
||||
// 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.
|
||||
OnPause func(req *base.Request) (*base.Response, error)
|
||||
OnPause func(ctx *ServerConnPauseCtx) (*base.Response, error)
|
||||
|
||||
// called after receiving a GET_PARAMETER request.
|
||||
// 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.
|
||||
OnSetParameter func(req *base.Request) (*base.Response, error)
|
||||
OnSetParameter func(ctx *ServerConnSetParameterCtx) (*base.Response, error)
|
||||
|
||||
// called after receiving a TEARDOWN request.
|
||||
// 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.
|
||||
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 {
|
||||
case base.Options:
|
||||
if sc.readHandlers.OnOptions != nil {
|
||||
return sc.readHandlers.OnOptions(req)
|
||||
return sc.readHandlers.OnOptions(&ServerConnOptionsCtx{
|
||||
Req: req,
|
||||
})
|
||||
}
|
||||
|
||||
var methods []string
|
||||
@@ -445,7 +501,9 @@ func (sc *ServerConn) handleRequest(req *base.Request) (*base.Response, error) {
|
||||
}, 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.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 {
|
||||
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")
|
||||
}
|
||||
|
||||
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 {
|
||||
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")
|
||||
}
|
||||
|
||||
res, err := sc.readHandlers.OnPlay(req)
|
||||
res, err := sc.readHandlers.OnPlay(&ServerConnPlayCtx{
|
||||
Req: req,
|
||||
})
|
||||
|
||||
if res.StatusCode == base.StatusOK && 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")
|
||||
}
|
||||
|
||||
res, err := sc.readHandlers.OnRecord(req)
|
||||
res, err := sc.readHandlers.OnRecord(&ServerConnRecordCtx{
|
||||
Req: req,
|
||||
})
|
||||
|
||||
if res.StatusCode == base.StatusOK {
|
||||
sc.state = ServerConnStateRecord
|
||||
@@ -778,7 +848,9 @@ func (sc *ServerConn) handleRequest(req *base.Request) (*base.Response, error) {
|
||||
}, err
|
||||
}
|
||||
|
||||
res, err := sc.readHandlers.OnPause(req)
|
||||
res, err := sc.readHandlers.OnPause(&ServerConnPauseCtx{
|
||||
Req: req,
|
||||
})
|
||||
|
||||
if res.StatusCode == base.StatusOK {
|
||||
switch sc.state {
|
||||
@@ -797,7 +869,9 @@ func (sc *ServerConn) handleRequest(req *base.Request) (*base.Response, error) {
|
||||
|
||||
case base.GetParameter:
|
||||
if sc.readHandlers.OnGetParameter != nil {
|
||||
return sc.readHandlers.OnGetParameter(req)
|
||||
return sc.readHandlers.OnGetParameter(&ServerConnGetParameterCtx{
|
||||
Req: req,
|
||||
})
|
||||
}
|
||||
|
||||
// GET_PARAMETER is used like a ping
|
||||
@@ -811,12 +885,16 @@ func (sc *ServerConn) handleRequest(req *base.Request) (*base.Response, error) {
|
||||
|
||||
case base.SetParameter:
|
||||
if sc.readHandlers.OnSetParameter != nil {
|
||||
return sc.readHandlers.OnSetParameter(req)
|
||||
return sc.readHandlers.OnSetParameter(&ServerConnSetParameterCtx{
|
||||
Req: req,
|
||||
})
|
||||
}
|
||||
|
||||
case base.Teardown:
|
||||
if sc.readHandlers.OnTeardown != nil {
|
||||
return sc.readHandlers.OnTeardown(req)
|
||||
return sc.readHandlers.OnTeardown(&ServerConnTeardownCtx{
|
||||
Req: req,
|
||||
})
|
||||
}
|
||||
|
||||
return &base.Response{
|
||||
|
@@ -14,7 +14,6 @@ import (
|
||||
"github.com/stretchr/testify/require"
|
||||
|
||||
"github.com/aler9/gortsplib/pkg/base"
|
||||
"github.com/aler9/gortsplib/pkg/headers"
|
||||
)
|
||||
|
||||
type testServ struct {
|
||||
@@ -78,18 +77,18 @@ func (ts *testServ) handleConn(conn *ServerConn) {
|
||||
defer ts.wg.Done()
|
||||
defer conn.Close()
|
||||
|
||||
onDescribe := func(req *base.Request) (*base.Response, []byte, error) {
|
||||
reqPath, ok := req.URL.RTSPPath()
|
||||
onDescribe := func(ctx *ServerConnDescribeCtx) (*base.Response, []byte, error) {
|
||||
reqPath, ok := ctx.Req.URL.RTSPPath()
|
||||
if !ok {
|
||||
return &base.Response{
|
||||
StatusCode: base.StatusBadRequest,
|
||||
}, nil, fmt.Errorf("invalid path (%s)", req.URL)
|
||||
}, nil, fmt.Errorf("invalid path (%s)", ctx.Req.URL)
|
||||
}
|
||||
|
||||
if reqPath != "teststream" {
|
||||
return &base.Response{
|
||||
StatusCode: base.StatusBadRequest,
|
||||
}, nil, fmt.Errorf("invalid path (%s)", req.URL)
|
||||
}, nil, fmt.Errorf("invalid path (%s)", ctx.Req.URL)
|
||||
}
|
||||
|
||||
ts.mutex.Lock()
|
||||
@@ -106,18 +105,18 @@ func (ts *testServ) handleConn(conn *ServerConn) {
|
||||
}, ts.sdp, nil
|
||||
}
|
||||
|
||||
onAnnounce := func(req *base.Request, tracks Tracks) (*base.Response, error) {
|
||||
reqPath, ok := req.URL.RTSPPath()
|
||||
onAnnounce := func(ctx *ServerConnAnnounceCtx) (*base.Response, error) {
|
||||
reqPath, ok := ctx.Req.URL.RTSPPath()
|
||||
if !ok {
|
||||
return &base.Response{
|
||||
StatusCode: base.StatusBadRequest,
|
||||
}, fmt.Errorf("invalid path (%s)", req.URL)
|
||||
}, fmt.Errorf("invalid path (%s)", ctx.Req.URL)
|
||||
}
|
||||
|
||||
if reqPath != "teststream" {
|
||||
return &base.Response{
|
||||
StatusCode: base.StatusBadRequest,
|
||||
}, fmt.Errorf("invalid path (%s)", req.URL)
|
||||
}, fmt.Errorf("invalid path (%s)", ctx.Req.URL)
|
||||
}
|
||||
|
||||
ts.mutex.Lock()
|
||||
@@ -130,7 +129,7 @@ func (ts *testServ) handleConn(conn *ServerConn) {
|
||||
}
|
||||
|
||||
ts.publisher = conn
|
||||
ts.sdp = tracks.Write()
|
||||
ts.sdp = ctx.Tracks.Write()
|
||||
|
||||
return &base.Response{
|
||||
StatusCode: base.StatusOK,
|
||||
@@ -140,11 +139,11 @@ func (ts *testServ) handleConn(conn *ServerConn) {
|
||||
}, nil
|
||||
}
|
||||
|
||||
onSetup := func(req *base.Request, th *headers.Transport, path string, trackID int) (*base.Response, error) {
|
||||
if path != "teststream" {
|
||||
onSetup := func(ctx *ServerConnSetupCtx) (*base.Response, error) {
|
||||
if ctx.Path != "teststream" {
|
||||
return &base.Response{
|
||||
StatusCode: base.StatusBadRequest,
|
||||
}, fmt.Errorf("invalid path (%s)", req.URL)
|
||||
}, fmt.Errorf("invalid path (%s)", ctx.Req.URL)
|
||||
}
|
||||
|
||||
return &base.Response{
|
||||
@@ -155,12 +154,12 @@ func (ts *testServ) handleConn(conn *ServerConn) {
|
||||
}, nil
|
||||
}
|
||||
|
||||
onPlay := func(req *base.Request) (*base.Response, error) {
|
||||
reqPath, ok := req.URL.RTSPPath()
|
||||
onPlay := func(ctx *ServerConnPlayCtx) (*base.Response, error) {
|
||||
reqPath, ok := ctx.Req.URL.RTSPPath()
|
||||
if !ok {
|
||||
return &base.Response{
|
||||
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
|
||||
@@ -169,7 +168,7 @@ func (ts *testServ) handleConn(conn *ServerConn) {
|
||||
if reqPath != "teststream" {
|
||||
return &base.Response{
|
||||
StatusCode: base.StatusBadRequest,
|
||||
}, fmt.Errorf("invalid path (%s)", req.URL)
|
||||
}, fmt.Errorf("invalid path (%s)", ctx.Req.URL)
|
||||
}
|
||||
|
||||
ts.mutex.Lock()
|
||||
@@ -185,12 +184,12 @@ func (ts *testServ) handleConn(conn *ServerConn) {
|
||||
}, nil
|
||||
}
|
||||
|
||||
onRecord := func(req *base.Request) (*base.Response, error) {
|
||||
reqPath, ok := req.URL.RTSPPath()
|
||||
onRecord := func(ctx *ServerConnRecordCtx) (*base.Response, error) {
|
||||
reqPath, ok := ctx.Req.URL.RTSPPath()
|
||||
if !ok {
|
||||
return &base.Response{
|
||||
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
|
||||
@@ -199,7 +198,7 @@ func (ts *testServ) handleConn(conn *ServerConn) {
|
||||
if reqPath != "teststream" {
|
||||
return &base.Response{
|
||||
StatusCode: base.StatusBadRequest,
|
||||
}, fmt.Errorf("invalid path (%s)", req.URL)
|
||||
}, fmt.Errorf("invalid path (%s)", ctx.Req.URL)
|
||||
}
|
||||
|
||||
ts.mutex.Lock()
|
||||
|
@@ -86,14 +86,14 @@ func TestServerConnPublishSetupPath(t *testing.T) {
|
||||
require.NoError(t, err)
|
||||
defer conn.Close()
|
||||
|
||||
onAnnounce := func(req *base.Request, tracks Tracks) (*base.Response, error) {
|
||||
onAnnounce := func(ctx *ServerConnAnnounceCtx) (*base.Response, error) {
|
||||
return &base.Response{
|
||||
StatusCode: base.StatusOK,
|
||||
}, nil
|
||||
}
|
||||
|
||||
onSetup := func(req *base.Request, th *headers.Transport, path string, trackID int) (*base.Response, error) {
|
||||
setupDone <- pathTrackIDPair{path, trackID}
|
||||
onSetup := func(ctx *ServerConnSetupCtx) (*base.Response, error) {
|
||||
setupDone <- pathTrackIDPair{ctx.Path, ctx.TrackID}
|
||||
return &base.Response{
|
||||
StatusCode: base.StatusOK,
|
||||
}, nil
|
||||
@@ -201,13 +201,13 @@ func TestServerConnPublishSetupDifferentPaths(t *testing.T) {
|
||||
require.NoError(t, err)
|
||||
defer conn.Close()
|
||||
|
||||
onAnnounce := func(req *base.Request, tracks Tracks) (*base.Response, error) {
|
||||
onAnnounce := func(ctx *ServerConnAnnounceCtx) (*base.Response, error) {
|
||||
return &base.Response{
|
||||
StatusCode: base.StatusOK,
|
||||
}, 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{
|
||||
StatusCode: base.StatusOK,
|
||||
}, nil
|
||||
@@ -299,13 +299,13 @@ func TestServerConnPublishSetupDouble(t *testing.T) {
|
||||
require.NoError(t, err)
|
||||
defer conn.Close()
|
||||
|
||||
onAnnounce := func(req *base.Request, tracks Tracks) (*base.Response, error) {
|
||||
onAnnounce := func(ctx *ServerConnAnnounceCtx) (*base.Response, error) {
|
||||
return &base.Response{
|
||||
StatusCode: base.StatusOK,
|
||||
}, 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{
|
||||
StatusCode: base.StatusOK,
|
||||
}, nil
|
||||
@@ -411,19 +411,19 @@ func TestServerConnPublishRecordPartialTracks(t *testing.T) {
|
||||
require.NoError(t, err)
|
||||
defer conn.Close()
|
||||
|
||||
onAnnounce := func(req *base.Request, tracks Tracks) (*base.Response, error) {
|
||||
onAnnounce := func(ctx *ServerConnAnnounceCtx) (*base.Response, error) {
|
||||
return &base.Response{
|
||||
StatusCode: base.StatusOK,
|
||||
}, 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{
|
||||
StatusCode: base.StatusOK,
|
||||
}, nil
|
||||
}
|
||||
|
||||
onRecord := func(req *base.Request) (*base.Response, error) {
|
||||
onRecord := func(ctx *ServerConnRecordCtx) (*base.Response, error) {
|
||||
return &base.Response{
|
||||
StatusCode: base.StatusOK,
|
||||
}, nil
|
||||
@@ -544,19 +544,19 @@ func TestServerConnPublishReceivePackets(t *testing.T) {
|
||||
require.NoError(t, err)
|
||||
defer conn.Close()
|
||||
|
||||
onAnnounce := func(req *base.Request, tracks Tracks) (*base.Response, error) {
|
||||
onAnnounce := func(ctx *ServerConnAnnounceCtx) (*base.Response, error) {
|
||||
return &base.Response{
|
||||
StatusCode: base.StatusOK,
|
||||
}, 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{
|
||||
StatusCode: base.StatusOK,
|
||||
}, nil
|
||||
}
|
||||
|
||||
onRecord := func(req *base.Request) (*base.Response, error) {
|
||||
onRecord := func(ctx *ServerConnRecordCtx) (*base.Response, error) {
|
||||
return &base.Response{
|
||||
StatusCode: base.StatusOK,
|
||||
}, nil
|
||||
|
@@ -77,8 +77,8 @@ func TestServerConnReadSetupPath(t *testing.T) {
|
||||
require.NoError(t, err)
|
||||
defer conn.Close()
|
||||
|
||||
onSetup := func(req *base.Request, th *headers.Transport, path string, trackID int) (*base.Response, error) {
|
||||
setupDone <- pathTrackIDPair{path, trackID}
|
||||
onSetup := func(ctx *ServerConnSetupCtx) (*base.Response, error) {
|
||||
setupDone <- pathTrackIDPair{ctx.Path, ctx.TrackID}
|
||||
return &base.Response{
|
||||
StatusCode: base.StatusOK,
|
||||
}, nil
|
||||
@@ -145,7 +145,7 @@ func TestServerConnReadSetupDifferentPaths(t *testing.T) {
|
||||
require.NoError(t, err)
|
||||
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{
|
||||
StatusCode: base.StatusOK,
|
||||
}, nil
|
||||
@@ -226,7 +226,7 @@ func TestServerConnReadSetupDouble(t *testing.T) {
|
||||
require.NoError(t, err)
|
||||
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{
|
||||
StatusCode: base.StatusOK,
|
||||
}, nil
|
||||
@@ -317,13 +317,13 @@ func TestServerConnReadReceivePackets(t *testing.T) {
|
||||
require.NoError(t, err)
|
||||
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{
|
||||
StatusCode: base.StatusOK,
|
||||
}, nil
|
||||
}
|
||||
|
||||
onPlay := func(req *base.Request) (*base.Response, error) {
|
||||
onPlay := func(ctx *ServerConnPlayCtx) (*base.Response, error) {
|
||||
return &base.Response{
|
||||
StatusCode: base.StatusOK,
|
||||
}, nil
|
||||
@@ -442,13 +442,13 @@ func TestServerConnReadTCPResponseBeforeFrames(t *testing.T) {
|
||||
writerTerminate := make(chan struct{})
|
||||
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{
|
||||
StatusCode: base.StatusOK,
|
||||
}, nil
|
||||
}
|
||||
|
||||
onPlay := func(req *base.Request) (*base.Response, error) {
|
||||
onPlay := func(ctx *ServerConnPlayCtx) (*base.Response, error) {
|
||||
go func() {
|
||||
defer close(writerDone)
|
||||
|
||||
@@ -549,13 +549,13 @@ func TestServerConnReadPlayMultiple(t *testing.T) {
|
||||
writerTerminate := make(chan struct{})
|
||||
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{
|
||||
StatusCode: base.StatusOK,
|
||||
}, nil
|
||||
}
|
||||
|
||||
onPlay := func(req *base.Request) (*base.Response, error) {
|
||||
onPlay := func(ctx *ServerConnPlayCtx) (*base.Response, error) {
|
||||
if conn.State() != ServerConnStatePlay {
|
||||
go func() {
|
||||
defer close(writerDone)
|
||||
@@ -663,13 +663,13 @@ func TestServerConnReadPauseMultiple(t *testing.T) {
|
||||
writerTerminate := make(chan struct{})
|
||||
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{
|
||||
StatusCode: base.StatusOK,
|
||||
}, nil
|
||||
}
|
||||
|
||||
onPlay := func(req *base.Request) (*base.Response, error) {
|
||||
onPlay := func(ctx *ServerConnPlayCtx) (*base.Response, error) {
|
||||
go func() {
|
||||
defer close(writerDone)
|
||||
|
||||
@@ -691,7 +691,7 @@ func TestServerConnReadPauseMultiple(t *testing.T) {
|
||||
}, nil
|
||||
}
|
||||
|
||||
onPause := func(req *base.Request) (*base.Response, error) {
|
||||
onPause := func(ctx *ServerConnPauseCtx) (*base.Response, error) {
|
||||
return &base.Response{
|
||||
StatusCode: base.StatusOK,
|
||||
}, nil
|
||||
|
Reference in New Issue
Block a user