diff --git a/server_conn.go b/server_conn.go index eac113bf..35e65064 100644 --- a/server_conn.go +++ b/server_conn.go @@ -208,10 +208,15 @@ func (sc *ServerConn) handleRequestInner(req *base.Request) (*base.Response, err if cseq, ok := req.Header["CSeq"]; !ok || len(cseq) != 1 { return &base.Response{ StatusCode: base.StatusBadRequest, - Header: base.Header{}, }, liberrors.ErrServerCSeqMissing{} } + if req.Method != base.Options && req.URL == nil { + return &base.Response{ + StatusCode: base.StatusBadRequest, + }, liberrors.ErrServerInvalidPath{} + } + sxID := getSessionID(req.Header) var path string diff --git a/server_test.go b/server_test.go index e8445f3c..4f0a4234 100644 --- a/server_test.go +++ b/server_test.go @@ -311,7 +311,40 @@ func TestServerErrorCSeqMissing(t *testing.T) { res, err := writeReqReadRes(conn, base.Request{ Method: base.Options, URL: mustParseURL("rtsp://localhost:8554/"), - Header: base.Header{}, + }) + require.NoError(t, err) + require.Equal(t, base.StatusBadRequest, res.StatusCode) + + <-nconnClosed +} + +func TestServerErrorNilURL(t *testing.T) { + nconnClosed := make(chan struct{}) + + s := &Server{ + Handler: &testServerHandler{ + onConnClose: func(ctx *ServerHandlerOnConnCloseCtx) { + require.EqualError(t, ctx.Error, "invalid path") + close(nconnClosed) + }, + }, + RTSPAddress: "localhost:8554", + } + err := s.Start() + require.NoError(t, err) + defer s.Close() + + nconn, err := net.Dial("tcp", "localhost:8554") + require.NoError(t, err) + defer nconn.Close() + conn := conn.NewConn(nconn) + + res, err := writeReqReadRes(conn, base.Request{ + Method: base.Describe, + URL: nil, + Header: base.Header{ + "CSeq": base.HeaderValue{"1"}, + }, }) require.NoError(t, err) require.Equal(t, base.StatusBadRequest, res.StatusCode)