mirror of
https://github.com/aler9/gortsplib
synced 2025-10-05 15:16:51 +08:00
server: remove Session header from ANNOUNCE responses (https://github.com/aler9/rtsp-simple-server/issues/840)
This commit is contained in:
@@ -305,17 +305,12 @@ func TestServerPublishSetupPath(t *testing.T) {
|
|||||||
InterleavedIDs: &[2]int{0, 1},
|
InterleavedIDs: &[2]int{0, 1},
|
||||||
}
|
}
|
||||||
|
|
||||||
var sx headers.Session
|
|
||||||
err = sx.Read(res.Header["Session"])
|
|
||||||
require.NoError(t, err)
|
|
||||||
|
|
||||||
res, err = writeReqReadRes(conn, br, base.Request{
|
res, err = writeReqReadRes(conn, br, base.Request{
|
||||||
Method: base.Setup,
|
Method: base.Setup,
|
||||||
URL: mustParseURL(ca.url),
|
URL: mustParseURL(ca.url),
|
||||||
Header: base.Header{
|
Header: base.Header{
|
||||||
"CSeq": base.HeaderValue{"2"},
|
"CSeq": base.HeaderValue{"2"},
|
||||||
"Transport": th.Write(),
|
"Transport": th.Write(),
|
||||||
"Session": base.HeaderValue{sx.Session},
|
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
@@ -386,17 +381,12 @@ func TestServerPublishErrorSetupDifferentPaths(t *testing.T) {
|
|||||||
InterleavedIDs: &[2]int{0, 1},
|
InterleavedIDs: &[2]int{0, 1},
|
||||||
}
|
}
|
||||||
|
|
||||||
var sx headers.Session
|
|
||||||
err = sx.Read(res.Header["Session"])
|
|
||||||
require.NoError(t, err)
|
|
||||||
|
|
||||||
res, err = writeReqReadRes(conn, br, base.Request{
|
res, err = writeReqReadRes(conn, br, base.Request{
|
||||||
Method: base.Setup,
|
Method: base.Setup,
|
||||||
URL: mustParseURL("rtsp://localhost:8554/test2stream/trackID=0"),
|
URL: mustParseURL("rtsp://localhost:8554/test2stream/trackID=0"),
|
||||||
Header: base.Header{
|
Header: base.Header{
|
||||||
"CSeq": base.HeaderValue{"2"},
|
"CSeq": base.HeaderValue{"2"},
|
||||||
"Transport": th.Write(),
|
"Transport": th.Write(),
|
||||||
"Session": base.HeaderValue{sx.Session},
|
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
@@ -468,22 +458,21 @@ func TestServerPublishErrorSetupTrackTwice(t *testing.T) {
|
|||||||
InterleavedIDs: &[2]int{0, 1},
|
InterleavedIDs: &[2]int{0, 1},
|
||||||
}
|
}
|
||||||
|
|
||||||
var sx headers.Session
|
|
||||||
err = sx.Read(res.Header["Session"])
|
|
||||||
require.NoError(t, err)
|
|
||||||
|
|
||||||
res, err = writeReqReadRes(conn, br, base.Request{
|
res, err = writeReqReadRes(conn, br, base.Request{
|
||||||
Method: base.Setup,
|
Method: base.Setup,
|
||||||
URL: mustParseURL("rtsp://localhost:8554/teststream/trackID=0"),
|
URL: mustParseURL("rtsp://localhost:8554/teststream/trackID=0"),
|
||||||
Header: base.Header{
|
Header: base.Header{
|
||||||
"CSeq": base.HeaderValue{"2"},
|
"CSeq": base.HeaderValue{"2"},
|
||||||
"Transport": th.Write(),
|
"Transport": th.Write(),
|
||||||
"Session": base.HeaderValue{sx.Session},
|
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.Equal(t, base.StatusOK, res.StatusCode)
|
require.Equal(t, base.StatusOK, res.StatusCode)
|
||||||
|
|
||||||
|
var sx headers.Session
|
||||||
|
err = sx.Read(res.Header["Session"])
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
res, err = writeReqReadRes(conn, br, base.Request{
|
res, err = writeReqReadRes(conn, br, base.Request{
|
||||||
Method: base.Setup,
|
Method: base.Setup,
|
||||||
URL: mustParseURL("rtsp://localhost:8554/teststream/trackID=0"),
|
URL: mustParseURL("rtsp://localhost:8554/teststream/trackID=0"),
|
||||||
@@ -570,22 +559,21 @@ func TestServerPublishErrorRecordPartialTracks(t *testing.T) {
|
|||||||
InterleavedIDs: &[2]int{0, 1},
|
InterleavedIDs: &[2]int{0, 1},
|
||||||
}
|
}
|
||||||
|
|
||||||
var sx headers.Session
|
|
||||||
err = sx.Read(res.Header["Session"])
|
|
||||||
require.NoError(t, err)
|
|
||||||
|
|
||||||
res, err = writeReqReadRes(conn, br, base.Request{
|
res, err = writeReqReadRes(conn, br, base.Request{
|
||||||
Method: base.Setup,
|
Method: base.Setup,
|
||||||
URL: mustParseURL("rtsp://localhost:8554/teststream/trackID=0"),
|
URL: mustParseURL("rtsp://localhost:8554/teststream/trackID=0"),
|
||||||
Header: base.Header{
|
Header: base.Header{
|
||||||
"CSeq": base.HeaderValue{"2"},
|
"CSeq": base.HeaderValue{"2"},
|
||||||
"Transport": th.Write(),
|
"Transport": th.Write(),
|
||||||
"Session": base.HeaderValue{sx.Session},
|
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.Equal(t, base.StatusOK, res.StatusCode)
|
require.Equal(t, base.StatusOK, res.StatusCode)
|
||||||
|
|
||||||
|
var sx headers.Session
|
||||||
|
err = sx.Read(res.Header["Session"])
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
res, err = writeReqReadRes(conn, br, base.Request{
|
res, err = writeReqReadRes(conn, br, base.Request{
|
||||||
Method: base.Record,
|
Method: base.Record,
|
||||||
URL: mustParseURL("rtsp://localhost:8554/teststream"),
|
URL: mustParseURL("rtsp://localhost:8554/teststream"),
|
||||||
@@ -739,22 +727,21 @@ func TestServerPublish(t *testing.T) {
|
|||||||
inTH.InterleavedIDs = &[2]int{0, 1}
|
inTH.InterleavedIDs = &[2]int{0, 1}
|
||||||
}
|
}
|
||||||
|
|
||||||
var sx headers.Session
|
|
||||||
err = sx.Read(res.Header["Session"])
|
|
||||||
require.NoError(t, err)
|
|
||||||
|
|
||||||
res, err = writeReqReadRes(conn, br, base.Request{
|
res, err = writeReqReadRes(conn, br, base.Request{
|
||||||
Method: base.Setup,
|
Method: base.Setup,
|
||||||
URL: mustParseURL("rtsp://localhost:8554/teststream/trackID=0"),
|
URL: mustParseURL("rtsp://localhost:8554/teststream/trackID=0"),
|
||||||
Header: base.Header{
|
Header: base.Header{
|
||||||
"CSeq": base.HeaderValue{"2"},
|
"CSeq": base.HeaderValue{"2"},
|
||||||
"Transport": inTH.Write(),
|
"Transport": inTH.Write(),
|
||||||
"Session": base.HeaderValue{sx.Session},
|
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.Equal(t, base.StatusOK, res.StatusCode)
|
require.Equal(t, base.StatusOK, res.StatusCode)
|
||||||
|
|
||||||
|
var sx headers.Session
|
||||||
|
err = sx.Read(res.Header["Session"])
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
var th headers.Transport
|
var th headers.Transport
|
||||||
err = th.Read(res.Header["Transport"])
|
err = th.Read(res.Header["Transport"])
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
@@ -937,22 +924,21 @@ func TestServerPublishNonStandardFrameSize(t *testing.T) {
|
|||||||
InterleavedIDs: &[2]int{0, 1},
|
InterleavedIDs: &[2]int{0, 1},
|
||||||
}
|
}
|
||||||
|
|
||||||
var sx headers.Session
|
|
||||||
err = sx.Read(res.Header["Session"])
|
|
||||||
require.NoError(t, err)
|
|
||||||
|
|
||||||
res, err = writeReqReadRes(conn, br, base.Request{
|
res, err = writeReqReadRes(conn, br, base.Request{
|
||||||
Method: base.Setup,
|
Method: base.Setup,
|
||||||
URL: mustParseURL("rtsp://localhost:8554/teststream/trackID=0"),
|
URL: mustParseURL("rtsp://localhost:8554/teststream/trackID=0"),
|
||||||
Header: base.Header{
|
Header: base.Header{
|
||||||
"CSeq": base.HeaderValue{"2"},
|
"CSeq": base.HeaderValue{"2"},
|
||||||
"Transport": inTH.Write(),
|
"Transport": inTH.Write(),
|
||||||
"Session": base.HeaderValue{sx.Session},
|
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.Equal(t, base.StatusOK, res.StatusCode)
|
require.Equal(t, base.StatusOK, res.StatusCode)
|
||||||
|
|
||||||
|
var sx headers.Session
|
||||||
|
err = sx.Read(res.Header["Session"])
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
res, err = writeReqReadRes(conn, br, base.Request{
|
res, err = writeReqReadRes(conn, br, base.Request{
|
||||||
Method: base.Record,
|
Method: base.Record,
|
||||||
URL: mustParseURL("rtsp://localhost:8554/teststream"),
|
URL: mustParseURL("rtsp://localhost:8554/teststream"),
|
||||||
@@ -1042,22 +1028,21 @@ func TestServerPublishErrorInvalidProtocol(t *testing.T) {
|
|||||||
ClientPorts: &[2]int{35466, 35467},
|
ClientPorts: &[2]int{35466, 35467},
|
||||||
}
|
}
|
||||||
|
|
||||||
var sx headers.Session
|
|
||||||
err = sx.Read(res.Header["Session"])
|
|
||||||
require.NoError(t, err)
|
|
||||||
|
|
||||||
res, err = writeReqReadRes(conn, br, base.Request{
|
res, err = writeReqReadRes(conn, br, base.Request{
|
||||||
Method: base.Setup,
|
Method: base.Setup,
|
||||||
URL: mustParseURL("rtsp://localhost:8554/teststream/trackID=0"),
|
URL: mustParseURL("rtsp://localhost:8554/teststream/trackID=0"),
|
||||||
Header: base.Header{
|
Header: base.Header{
|
||||||
"CSeq": base.HeaderValue{"2"},
|
"CSeq": base.HeaderValue{"2"},
|
||||||
"Transport": inTH.Write(),
|
"Transport": inTH.Write(),
|
||||||
"Session": base.HeaderValue{sx.Session},
|
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.Equal(t, base.StatusOK, res.StatusCode)
|
require.Equal(t, base.StatusOK, res.StatusCode)
|
||||||
|
|
||||||
|
var sx headers.Session
|
||||||
|
err = sx.Read(res.Header["Session"])
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
var th headers.Transport
|
var th headers.Transport
|
||||||
err = th.Read(res.Header["Transport"])
|
err = th.Read(res.Header["Transport"])
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
@@ -1141,10 +1126,6 @@ func TestServerPublishRTCPReport(t *testing.T) {
|
|||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
defer l2.Close()
|
defer l2.Close()
|
||||||
|
|
||||||
var sx headers.Session
|
|
||||||
err = sx.Read(res.Header["Session"])
|
|
||||||
require.NoError(t, err)
|
|
||||||
|
|
||||||
res, err = writeReqReadRes(conn, br, base.Request{
|
res, err = writeReqReadRes(conn, br, base.Request{
|
||||||
Method: base.Setup,
|
Method: base.Setup,
|
||||||
URL: mustParseURL("rtsp://localhost:8554/teststream/trackID=0"),
|
URL: mustParseURL("rtsp://localhost:8554/teststream/trackID=0"),
|
||||||
@@ -1162,12 +1143,15 @@ func TestServerPublishRTCPReport(t *testing.T) {
|
|||||||
Protocol: headers.TransportProtocolUDP,
|
Protocol: headers.TransportProtocolUDP,
|
||||||
ClientPorts: &[2]int{34556, 34557},
|
ClientPorts: &[2]int{34556, 34557},
|
||||||
}.Write(),
|
}.Write(),
|
||||||
"Session": base.HeaderValue{sx.Session},
|
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.Equal(t, base.StatusOK, res.StatusCode)
|
require.Equal(t, base.StatusOK, res.StatusCode)
|
||||||
|
|
||||||
|
var sx headers.Session
|
||||||
|
err = sx.Read(res.Header["Session"])
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
var th headers.Transport
|
var th headers.Transport
|
||||||
err = th.Read(res.Header["Transport"])
|
err = th.Read(res.Header["Transport"])
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
@@ -1327,22 +1311,21 @@ func TestServerPublishTimeout(t *testing.T) {
|
|||||||
inTH.InterleavedIDs = &[2]int{0, 1}
|
inTH.InterleavedIDs = &[2]int{0, 1}
|
||||||
}
|
}
|
||||||
|
|
||||||
var sx headers.Session
|
|
||||||
err = sx.Read(res.Header["Session"])
|
|
||||||
require.NoError(t, err)
|
|
||||||
|
|
||||||
res, err = writeReqReadRes(conn, br, base.Request{
|
res, err = writeReqReadRes(conn, br, base.Request{
|
||||||
Method: base.Setup,
|
Method: base.Setup,
|
||||||
URL: mustParseURL("rtsp://localhost:8554/teststream/trackID=0"),
|
URL: mustParseURL("rtsp://localhost:8554/teststream/trackID=0"),
|
||||||
Header: base.Header{
|
Header: base.Header{
|
||||||
"CSeq": base.HeaderValue{"2"},
|
"CSeq": base.HeaderValue{"2"},
|
||||||
"Transport": inTH.Write(),
|
"Transport": inTH.Write(),
|
||||||
"Session": base.HeaderValue{sx.Session},
|
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.Equal(t, base.StatusOK, res.StatusCode)
|
require.Equal(t, base.StatusOK, res.StatusCode)
|
||||||
|
|
||||||
|
var sx headers.Session
|
||||||
|
err = sx.Read(res.Header["Session"])
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
var th headers.Transport
|
var th headers.Transport
|
||||||
err = th.Read(res.Header["Transport"])
|
err = th.Read(res.Header["Transport"])
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
@@ -1454,22 +1437,21 @@ func TestServerPublishWithoutTeardown(t *testing.T) {
|
|||||||
inTH.InterleavedIDs = &[2]int{0, 1}
|
inTH.InterleavedIDs = &[2]int{0, 1}
|
||||||
}
|
}
|
||||||
|
|
||||||
var sx headers.Session
|
|
||||||
err = sx.Read(res.Header["Session"])
|
|
||||||
require.NoError(t, err)
|
|
||||||
|
|
||||||
res, err = writeReqReadRes(conn, br, base.Request{
|
res, err = writeReqReadRes(conn, br, base.Request{
|
||||||
Method: base.Setup,
|
Method: base.Setup,
|
||||||
URL: mustParseURL("rtsp://localhost:8554/teststream/trackID=0"),
|
URL: mustParseURL("rtsp://localhost:8554/teststream/trackID=0"),
|
||||||
Header: base.Header{
|
Header: base.Header{
|
||||||
"CSeq": base.HeaderValue{"2"},
|
"CSeq": base.HeaderValue{"2"},
|
||||||
"Transport": inTH.Write(),
|
"Transport": inTH.Write(),
|
||||||
"Session": base.HeaderValue{sx.Session},
|
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.Equal(t, base.StatusOK, res.StatusCode)
|
require.Equal(t, base.StatusOK, res.StatusCode)
|
||||||
|
|
||||||
|
var sx headers.Session
|
||||||
|
err = sx.Read(res.Header["Session"])
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
var th headers.Transport
|
var th headers.Transport
|
||||||
err = th.Read(res.Header["Transport"])
|
err = th.Read(res.Header["Transport"])
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
@@ -1567,22 +1549,21 @@ func TestServerPublishUDPChangeConn(t *testing.T) {
|
|||||||
ClientPorts: &[2]int{35466, 35467},
|
ClientPorts: &[2]int{35466, 35467},
|
||||||
}
|
}
|
||||||
|
|
||||||
var sx headers.Session
|
|
||||||
err = sx.Read(res.Header["Session"])
|
|
||||||
require.NoError(t, err)
|
|
||||||
|
|
||||||
res, err = writeReqReadRes(conn, br, base.Request{
|
res, err = writeReqReadRes(conn, br, base.Request{
|
||||||
Method: base.Setup,
|
Method: base.Setup,
|
||||||
URL: mustParseURL("rtsp://localhost:8554/teststream/trackID=0"),
|
URL: mustParseURL("rtsp://localhost:8554/teststream/trackID=0"),
|
||||||
Header: base.Header{
|
Header: base.Header{
|
||||||
"CSeq": base.HeaderValue{"2"},
|
"CSeq": base.HeaderValue{"2"},
|
||||||
"Transport": inTH.Write(),
|
"Transport": inTH.Write(),
|
||||||
"Session": base.HeaderValue{sx.Session},
|
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.Equal(t, base.StatusOK, res.StatusCode)
|
require.Equal(t, base.StatusOK, res.StatusCode)
|
||||||
|
|
||||||
|
var sx headers.Session
|
||||||
|
err = sx.Read(res.Header["Session"])
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
res, err = writeReqReadRes(conn, br, base.Request{
|
res, err = writeReqReadRes(conn, br, base.Request{
|
||||||
Method: base.Record,
|
Method: base.Record,
|
||||||
URL: mustParseURL("rtsp://localhost:8554/teststream"),
|
URL: mustParseURL("rtsp://localhost:8554/teststream"),
|
||||||
|
@@ -1186,12 +1186,6 @@ func TestServerErrorInvalidPath(t *testing.T) {
|
|||||||
})
|
})
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.Equal(t, base.StatusOK, res.StatusCode)
|
require.Equal(t, base.StatusOK, res.StatusCode)
|
||||||
|
|
||||||
var sx headers.Session
|
|
||||||
err = sx.Read(res.Header["Session"])
|
|
||||||
require.NoError(t, err)
|
|
||||||
|
|
||||||
sxID = sx.Session
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if method == base.Play || method == base.Record || method == base.Pause {
|
if method == base.Play || method == base.Record || method == base.Pause {
|
||||||
|
@@ -543,11 +543,15 @@ func (sc *ServerConn) handleRequestInSession(
|
|||||||
) (*base.Response, error) {
|
) (*base.Response, error) {
|
||||||
// handle directly in Session
|
// handle directly in Session
|
||||||
if sc.session != nil {
|
if sc.session != nil {
|
||||||
// the connection can't communicate with two sessions at once.
|
// the SETUP request after ANNOUNCE don't have the session ID
|
||||||
if sxID != sc.session.secretID {
|
// since ANNOUNCE didn't provide it.
|
||||||
return &base.Response{
|
if req.Method != base.Setup || sxID != "" {
|
||||||
StatusCode: base.StatusBadRequest,
|
// the connection can't communicate with two sessions at once.
|
||||||
}, liberrors.ErrServerLinkedToOtherSession{}
|
if sxID != sc.session.secretID {
|
||||||
|
return &base.Response{
|
||||||
|
StatusCode: base.StatusBadRequest,
|
||||||
|
}, liberrors.ErrServerLinkedToOtherSession{}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
cres := make(chan sessionRequestRes)
|
cres := make(chan sessionRequestRes)
|
||||||
|
@@ -281,17 +281,20 @@ func (ss *ServerSession) run() {
|
|||||||
|
|
||||||
var returnedSession *ServerSession
|
var returnedSession *ServerSession
|
||||||
if err == nil || err == errSwitchReadFunc {
|
if err == nil || err == errSwitchReadFunc {
|
||||||
if res.Header == nil {
|
// ANNOUNCE responses don't contain the session header.
|
||||||
res.Header = make(base.Header)
|
if req.req.Method != base.Announce {
|
||||||
}
|
if res.Header == nil {
|
||||||
|
res.Header = make(base.Header)
|
||||||
|
}
|
||||||
|
|
||||||
res.Header["Session"] = headers.Session{
|
res.Header["Session"] = headers.Session{
|
||||||
Session: ss.secretID,
|
Session: ss.secretID,
|
||||||
Timeout: func() *uint {
|
Timeout: func() *uint {
|
||||||
v := uint(ss.s.sessionTimeout / time.Second)
|
v := uint(ss.s.sessionTimeout / time.Second)
|
||||||
return &v
|
return &v
|
||||||
}(),
|
}(),
|
||||||
}.Write()
|
}.Write()
|
||||||
|
}
|
||||||
|
|
||||||
if req.req.Method != base.Teardown {
|
if req.req.Method != base.Teardown {
|
||||||
returnedSession = ss
|
returnedSession = ss
|
||||||
|
Reference in New Issue
Block a user