diff --git a/examples/server-tls/main.go b/examples/server-tls/main.go index fdab6e8c..b7684036 100644 --- a/examples/server-tls/main.go +++ b/examples/server-tls/main.go @@ -28,7 +28,7 @@ func handleConn(conn *gortsplib.ServerConn) { log.Printf("client connected") // called after receiving a DESCRIBE request. - onDescribe := func(req *base.Request) (*base.Response, error) { + onDescribe := func(req *base.Request) (*base.Response, []byte, error) { mutex.Lock() defer mutex.Unlock() @@ -36,17 +36,12 @@ func handleConn(conn *gortsplib.ServerConn) { if publisher == nil { return &base.Response{ StatusCode: base.StatusNotFound, - }, nil + }, nil, nil } return &base.Response{ StatusCode: base.StatusOK, - Header: base.Header{ - "Content-Base": base.HeaderValue{req.URL.String() + "/"}, - "Content-Type": base.HeaderValue{"application/sdp"}, - }, - Body: sdp, - }, nil + }, sdp, nil } // called after receiving an ANNOUNCE request. diff --git a/examples/server-udp/main.go b/examples/server-udp/main.go index fb226d0a..0b9a84d4 100644 --- a/examples/server-udp/main.go +++ b/examples/server-udp/main.go @@ -27,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, error) { + onDescribe := func(req *base.Request) (*base.Response, []byte, error) { mutex.Lock() defer mutex.Unlock() @@ -35,17 +35,12 @@ func handleConn(conn *gortsplib.ServerConn) { if publisher == nil { return &base.Response{ StatusCode: base.StatusNotFound, - }, nil + }, nil, nil } return &base.Response{ StatusCode: base.StatusOK, - Header: base.Header{ - "Content-Base": base.HeaderValue{req.URL.String() + "/"}, - "Content-Type": base.HeaderValue{"application/sdp"}, - }, - Body: sdp, - }, nil + }, sdp, nil } // called after receiving an ANNOUNCE request. diff --git a/examples/server/main.go b/examples/server/main.go index 73067cc0..982024f2 100644 --- a/examples/server/main.go +++ b/examples/server/main.go @@ -27,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, error) { + onDescribe := func(req *base.Request) (*base.Response, []byte, error) { mutex.Lock() defer mutex.Unlock() @@ -35,17 +35,12 @@ func handleConn(conn *gortsplib.ServerConn) { if publisher == nil { return &base.Response{ StatusCode: base.StatusNotFound, - }, nil + }, nil, nil } return &base.Response{ StatusCode: base.StatusOK, - Header: base.Header{ - "Content-Base": base.HeaderValue{req.URL.String() + "/"}, - "Content-Type": base.HeaderValue{"application/sdp"}, - }, - Body: sdp, - }, nil + }, sdp, nil } // called after receiving an ANNOUNCE request. diff --git a/serverconn.go b/serverconn.go index 8eef85cb..384c83cb 100644 --- a/serverconn.go +++ b/serverconn.go @@ -146,7 +146,8 @@ type ServerConnReadHandlers struct { OnOptions func(req *base.Request) (*base.Response, error) // called after receiving a DESCRIBE request. - OnDescribe func(req *base.Request) (*base.Response, error) + // the 2nd return value is a SDP, that is inserted into the response. + OnDescribe func(req *base.Request) (*base.Response, []byte, error) // called after receiving an ANNOUNCE request. OnAnnounce func(req *base.Request, tracks Tracks) (*base.Response, error) @@ -444,7 +445,19 @@ func (sc *ServerConn) handleRequest(req *base.Request) (*base.Response, error) { }, err } - return sc.readHandlers.OnDescribe(req) + res, sdp, err := sc.readHandlers.OnDescribe(req) + + if res.StatusCode == base.StatusOK && sdp != nil { + if res.Header == nil { + res.Header = make(base.Header) + } + + res.Header["Content-Base"] = base.HeaderValue{req.URL.String() + "/"} + res.Header["Content-Type"] = base.HeaderValue{"application/sdp"} + res.Body = sdp + } + + return res, err } case base.Announce: @@ -516,7 +529,7 @@ func (sc *ServerConn) handleRequest(req *base.Request) (*base.Response, error) { res, err := sc.readHandlers.OnAnnounce(req, tracks) - if res.StatusCode == 200 { + if res.StatusCode == base.StatusOK { sc.state = ServerConnStatePreRecord sc.setupPath = &reqPath @@ -629,7 +642,7 @@ func (sc *ServerConn) handleRequest(req *base.Request) (*base.Response, error) { res, err := sc.readHandlers.OnSetup(req, th, path, trackID) - if res.StatusCode == 200 { + if res.StatusCode == base.StatusOK { sc.setupProtocol = &th.Protocol if sc.setuppedTracks == nil { @@ -710,7 +723,7 @@ func (sc *ServerConn) handleRequest(req *base.Request) (*base.Response, error) { res, err := sc.readHandlers.OnPlay(req) - if res.StatusCode == 200 && sc.state != ServerConnStatePlay { + if res.StatusCode == base.StatusOK && sc.state != ServerConnStatePlay { sc.state = ServerConnStatePlay sc.frameModeEnable() } @@ -743,7 +756,7 @@ func (sc *ServerConn) handleRequest(req *base.Request) (*base.Response, error) { res, err := sc.readHandlers.OnRecord(req) - if res.StatusCode == 200 { + if res.StatusCode == base.StatusOK { sc.state = ServerConnStateRecord sc.frameModeEnable() } @@ -767,7 +780,7 @@ func (sc *ServerConn) handleRequest(req *base.Request) (*base.Response, error) { res, err := sc.readHandlers.OnPause(req) - if res.StatusCode == 200 { + if res.StatusCode == base.StatusOK { switch sc.state { case ServerConnStatePlay: sc.frameModeDisable() diff --git a/serverconn_test.go b/serverconn_test.go index 050d0319..ff680b59 100644 --- a/serverconn_test.go +++ b/serverconn_test.go @@ -78,18 +78,18 @@ func (ts *testServ) handleConn(conn *ServerConn) { defer ts.wg.Done() defer conn.Close() - onDescribe := func(req *base.Request) (*base.Response, error) { + onDescribe := func(req *base.Request) (*base.Response, []byte, error) { reqPath, ok := req.URL.RTSPPath() if !ok { return &base.Response{ StatusCode: base.StatusBadRequest, - }, fmt.Errorf("invalid path (%s)", req.URL) + }, nil, fmt.Errorf("invalid path (%s)", req.URL) } if reqPath != "teststream" { return &base.Response{ StatusCode: base.StatusBadRequest, - }, fmt.Errorf("invalid path (%s)", req.URL) + }, nil, fmt.Errorf("invalid path (%s)", req.URL) } ts.mutex.Lock() @@ -98,17 +98,12 @@ func (ts *testServ) handleConn(conn *ServerConn) { if ts.publisher == nil { return &base.Response{ StatusCode: base.StatusNotFound, - }, nil + }, nil, nil } return &base.Response{ StatusCode: base.StatusOK, - Header: base.Header{ - "Content-Base": base.HeaderValue{req.URL.String() + "/"}, - "Content-Type": base.HeaderValue{"application/sdp"}, - }, - Body: ts.sdp, - }, nil + }, ts.sdp, nil } onAnnounce := func(req *base.Request, tracks Tracks) (*base.Response, error) {