Repository: bluenviron/gortsplib
Pull request #444 (2023-10-17 18:25:52)

server: add methods SetuppedStream, SetuppedPath, SetuppedQuery

codecov[bot]: ## [Codecov](https://app.codecov.io/gh/bluenviron/gortsplib/pull/444?src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=bluenviron) Report
> Merging [#444](https://app.codecov.io/gh/bluenviron/gortsplib/pull/444?src=pr&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=bluenviron) (c1fa13e) into [main](https://app.codecov.io/gh/bluenviron/gortsplib/commit/90dec27a5be5dddd7dd838d3d9afe4e837f4162f?el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=bluenviron) (90dec27) will **increase** coverage by `0.01%`.
> The diff coverage is `50.00%`.

```diff
@@            Coverage Diff             @@
##             main     #444      +/-   ##
==========================================
+ Coverage   84.44%   84.46%   +0.01%     
==========================================
  Files         106      106              
  Lines       10893    10900       +7     
==========================================
+ Hits         9199     9207       +8     
+ Misses       1299     1297       -2     
- Partials      395      396       +1     
```


| [Files](https://app.codecov.io/gh/bluenviron/gortsplib/pull/444?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=bluenviron) | Coverage Δ | |
|---|---|---|
| [server\_session.go](https://app.codecov.io/gh/bluenviron/gortsplib/pull/444?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=bluenviron#diff-c2VydmVyX3Nlc3Npb24uZ28=) | `79.23% <50.00%> (+0.58%)` | :arrow_up: |

... and [2 files with indirect coverage changes](https://app.codecov.io/gh/bluenviron/gortsplib/pull/444/indirect-changes?src=pr&el=tree-more&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=bluenviron)

:mega: We’re building smart automated test selection to slash your CI/CD build times. [Learn more](https://about.codecov.io/iterative-testing/?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=bluenviron)


Patch:
diff --git a/server_session.go b/server_session.go
index a035f628..862407c6 100644
--- a/server_session.go
+++ b/server_session.go
@@ -194,7 +194,7 @@ type ServerSession struct {
 	tcpCallbackByChannel  map[int]readFunc
 	setuppedTransport     *Transport
 	setuppedStream        *ServerStream // read
-	setuppedPath          *string
+	setuppedPath          string
 	setuppedQuery         string
 	lastRequestTime       time.Time
 	tcpConn               *ServerConn
@@ -266,6 +266,21 @@ func (ss *ServerSession) SetuppedTransport() *Transport {
 	return ss.setuppedTransport
 }
 
+// SetuppedStream returns the stream associated with the session.
+func (ss *ServerSession) SetuppedStream() *ServerStream {
+	return ss.setuppedStream
+}
+
+// SetuppedPath returns the path sent during SETUP or ANNOUNCE.
+func (ss *ServerSession) SetuppedPath() string {
+	return ss.setuppedPath
+}
+
+// SetuppedQuery returns the query sent during SETUP or ANNOUNCE.
+func (ss *ServerSession) SetuppedQuery() string {
+	return ss.setuppedQuery
+}
+
 // AnnouncedDescription returns the announced stream description.
 func (ss *ServerSession) AnnouncedDescription() *description.Session {
 	return ss.announcedDesc
@@ -624,7 +639,7 @@ func (ss *ServerSession) handleRequestInner(sc *ServerConn, req *base.Request) (
 		}
 
 		ss.state = ServerSessionStatePreRecord
-		ss.setuppedPath = &path
+		ss.setuppedPath = path
 		ss.setuppedQuery = query
 		ss.announcedDesc = &desc
 
@@ -670,14 +685,14 @@ func (ss *ServerSession) handleRequestInner(sc *ServerConn, req *base.Request) (
 				}, err
 			}
 
-			if ss.setuppedPath != nil && path != *ss.setuppedPath {
+			if ss.state == ServerSessionStatePrePlay && path != ss.setuppedPath {
 				return &base.Response{
 					StatusCode: base.StatusBadRequest,
 				}, liberrors.ErrServerMediasDifferentPaths{}
 			}
 
 		default: // record
-			path = *ss.setuppedPath
+			path = ss.setuppedPath
 			query = ss.setuppedQuery
 		}
 
@@ -799,7 +814,8 @@ func (ss *ServerSession) handleRequestInner(sc *ServerConn, req *base.Request) (
 			}
 
 			ss.state = ServerSessionStatePrePlay
-			ss.setuppedPath = &path
+			ss.setuppedPath = path
+			ss.setuppedQuery = query
 			ss.setuppedStream = stream
 		}
 
@@ -886,10 +902,10 @@ func (ss *ServerSession) handleRequestInner(sc *ServerConn, req *base.Request) (
 			}, err
 		}
 
-		if ss.State() == ServerSessionStatePrePlay && path != *ss.setuppedPath {
+		if ss.State() == ServerSessionStatePrePlay && path != ss.setuppedPath {
 			return &base.Response{
 				StatusCode: base.StatusBadRequest,
-			}, liberrors.ErrServerPathHasChanged{Prev: *ss.setuppedPath, Cur: path}
+			}, liberrors.ErrServerPathHasChanged{Prev: ss.setuppedPath, Cur: path}
 		}
 
 		// allocate writeBuffer before calling OnPlay().
@@ -950,7 +966,7 @@ func (ss *ServerSession) handleRequestInner(sc *ServerConn, req *base.Request) (
 			ss.s.timeNow(),
 			ss.setuppedMediasOrdered,
 			ss.setuppedStream,
-			*ss.setuppedPath,
+			ss.setuppedPath,
 			req.URL)
 
 		if ok {
@@ -978,10 +994,10 @@ func (ss *ServerSession) handleRequestInner(sc *ServerConn, req *base.Request) (
 			}, liberrors.ErrServerNotAllAnnouncedMediasSetup{}
 		}
 
-		if path != *ss.setuppedPath {
+		if path != ss.setuppedPath {
 			return &base.Response{
 				StatusCode: base.StatusBadRequest,
-			}, liberrors.ErrServerPathHasChanged{Prev: *ss.setuppedPath, Cur: path}
+			}, liberrors.ErrServerPathHasChanged{Prev: ss.setuppedPath, Cur: path}
 		}
 
 		// allocate writeBuffer before calling OnRecord().


Test patch:
diff --git a/server_play_test.go b/server_play_test.go
index 7d41d707..a0ee42c1 100644
--- a/server_play_test.go
+++ b/server_play_test.go
@@ -78,7 +78,7 @@ func absoluteControlAttribute(md *psdp.MediaDescription) string {
 func doDescribe(t *testing.T, conn *conn.Conn) *sdp.SessionDescription {
 	res, err := writeReqReadRes(conn, base.Request{
 		Method: base.Describe,
-		URL:    mustParseURL("rtsp://localhost:8554/teststream"),
+		URL:    mustParseURL("rtsp://localhost:8554/teststream?param=value"),
 		Header: base.Header{
 			"CSeq": base.HeaderValue{"1"},
 		},
@@ -553,6 +553,23 @@ func TestServerPlay(t *testing.T) {
 						}, stream, nil
 					},
 					onPlay: func(ctx *ServerHandlerOnPlayCtx) (*base.Response, error) {
+						switch transport {
+						case "udp":
+							v := TransportUDP
+							require.Equal(t, &v, ctx.Session.SetuppedTransport())
+
+						case "tcp", "tls":
+							v := TransportTCP
+							require.Equal(t, &v, ctx.Session.SetuppedTransport())
+
+						case "multicast":
+							v := TransportUDPMulticast
+							require.Equal(t, &v, ctx.Session.SetuppedTransport())
+						}
+
+						require.Equal(t, "param=value", ctx.Session.SetuppedQuery())
+						require.Equal(t, stream.Description().Medias, ctx.Session.SetuppedMedias())
+
 						// send RTCP packets directly to the session.
 						// these are sent after the response, only if onPlay returns StatusOK.
 						if transport != "multicast" {
diff --git a/server_record_test.go b/server_record_test.go
index fe85f606..296eff58 100644
--- a/server_record_test.go
+++ b/server_record_test.go
@@ -519,6 +519,19 @@ func TestServerRecord(t *testing.T) {
 						}, nil, nil
 					},
 					onRecord: func(ctx *ServerHandlerOnRecordCtx) (*base.Response, error) {
+						switch transport {
+						case "udp":
+							v := TransportUDP
+							require.Equal(t, &v, ctx.Session.SetuppedTransport())
+
+						case "tcp", "tls":
+							v := TransportTCP
+							require.Equal(t, &v, ctx.Session.SetuppedTransport())
+						}
+
+						require.Equal(t, "param=value", ctx.Session.SetuppedQuery())
+						require.Equal(t, ctx.Session.AnnouncedDescription().Medias, ctx.Session.SetuppedMedias())
+
 						// queue sending of RTCP packets.
 						// these are sent after the response, only if onRecord returns StatusOK.
 						err := ctx.Session.WritePacketRTCP(ctx.Session.AnnouncedDescription().Medias[0], &testRTCPPacket)
@@ -602,7 +615,7 @@ func TestServerRecord(t *testing.T) {
 				},
 			}
 
-			doAnnounce(t, conn, "rtsp://localhost:8554/teststream", medias)
+			doAnnounce(t, conn, "rtsp://localhost:8554/teststream?param=value", medias)
 
 			<-sessionOpened
 
@@ -639,7 +652,7 @@ func TestServerRecord(t *testing.T) {
 					inTH.InterleavedIDs = &[2]int{2 + i*2, 3 + i*2}
 				}
 
-				res, th := doSetup(t, conn, "rtsp://localhost:8554/teststream/"+medias[i].Control, inTH, "")
+				res, th := doSetup(t, conn, "rtsp://localhost:8554/teststream?param=value/"+medias[i].Control, inTH, "")
 
 				session = readSession(t, res)