mirror of
https://github.com/aler9/gortsplib
synced 2025-10-28 01:21:35 +08:00
server: return error in case of unexpected interleaved frames
This commit is contained in:
@@ -253,3 +253,11 @@ type ErrServerSessionNotInUse struct{}
|
|||||||
func (e ErrServerSessionNotInUse) Error() string {
|
func (e ErrServerSessionNotInUse) Error() string {
|
||||||
return "not in use"
|
return "not in use"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ErrServerUnexpectedFrame is an error that can be returned by a server.
|
||||||
|
type ErrServerUnexpectedFrame struct{}
|
||||||
|
|
||||||
|
// Error implements the error interface.
|
||||||
|
func (e ErrServerUnexpectedFrame) Error() string {
|
||||||
|
return "received unexpected interleaved frame"
|
||||||
|
}
|
||||||
|
|||||||
@@ -832,8 +832,14 @@ func TestServerPublish(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestServerPublishErrorInvalidProtocol(t *testing.T) {
|
func TestServerPublishErrorInvalidProtocol(t *testing.T) {
|
||||||
|
errorRecv := make(chan struct{})
|
||||||
|
|
||||||
s := &Server{
|
s := &Server{
|
||||||
Handler: &testServerHandler{
|
Handler: &testServerHandler{
|
||||||
|
onConnClose: func(ctx *ServerHandlerOnConnCloseCtx) {
|
||||||
|
require.EqualError(t, ctx.Error, "received unexpected interleaved frame")
|
||||||
|
close(errorRecv)
|
||||||
|
},
|
||||||
onAnnounce: func(ctx *ServerHandlerOnAnnounceCtx) (*base.Response, error) {
|
onAnnounce: func(ctx *ServerHandlerOnAnnounceCtx) (*base.Response, error) {
|
||||||
return &base.Response{
|
return &base.Response{
|
||||||
StatusCode: base.StatusOK,
|
StatusCode: base.StatusOK,
|
||||||
@@ -937,6 +943,8 @@ func TestServerPublishErrorInvalidProtocol(t *testing.T) {
|
|||||||
Payload: []byte{0x01, 0x02, 0x03, 0x04},
|
Payload: []byte{0x01, 0x02, 0x03, 0x04},
|
||||||
}, make([]byte, 1024))
|
}, make([]byte, 1024))
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
<-errorRecv
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestServerPublishRTCPReport(t *testing.T) {
|
func TestServerPublishRTCPReport(t *testing.T) {
|
||||||
|
|||||||
@@ -210,14 +210,16 @@ func (sc *ServerConn) readFuncStandard(readRequest chan readReq) error {
|
|||||||
sc.nconn.SetReadDeadline(time.Time{})
|
sc.nconn.SetReadDeadline(time.Time{})
|
||||||
|
|
||||||
for {
|
for {
|
||||||
req, err := sc.conn.ReadRequest()
|
any, err := sc.conn.ReadInterleavedFrameOrRequest()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
switch what := any.(type) {
|
||||||
|
case *base.Request:
|
||||||
cres := make(chan error)
|
cres := make(chan error)
|
||||||
select {
|
select {
|
||||||
case readRequest <- readReq{req: req, res: cres}:
|
case readRequest <- readReq{req: what, res: cres}:
|
||||||
err = <-cres
|
err = <-cres
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
@@ -226,6 +228,10 @@ func (sc *ServerConn) readFuncStandard(readRequest chan readReq) error {
|
|||||||
case <-sc.ctx.Done():
|
case <-sc.ctx.Done():
|
||||||
return liberrors.ErrServerTerminated{}
|
return liberrors.ErrServerTerminated{}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
default:
|
||||||
|
return liberrors.ErrServerUnexpectedFrame{}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user