diff --git a/client_read_test.go b/client_read_test.go index a1808ee9..0194cf7c 100644 --- a/client_read_test.go +++ b/client_read_test.go @@ -201,7 +201,7 @@ func TestClientRead(t *testing.T) { req, err := readRequest(bconn.Reader) require.NoError(t, err) require.Equal(t, base.Options, req.Method) - require.Equal(t, mustParseURL(scheme+"://"+listenIP+":8554/teststream"), req.URL) + require.Equal(t, mustParseURL(scheme+"://"+listenIP+":8554/test/stream?param=value"), req.URL) err = base.Response{ StatusCode: base.StatusOK, @@ -218,27 +218,30 @@ func TestClientRead(t *testing.T) { req, err = readRequest(bconn.Reader) require.NoError(t, err) require.Equal(t, base.Describe, req.Method) - require.Equal(t, mustParseURL(scheme+"://"+listenIP+":8554/teststream"), req.URL) + require.Equal(t, mustParseURL(scheme+"://"+listenIP+":8554/test/stream?param=value"), req.URL) track, err := NewTrackH264(96, &TrackConfigH264{[]byte{0x01, 0x02, 0x03, 0x04}, []byte{0x01, 0x02, 0x03, 0x04}}) require.NoError(t, err) - tracks := cloneAndClearTracks(Tracks{track}) + track.Media.Attributes = append(track.Media.Attributes, psdp.Attribute{ + Key: "control", + Value: "trackID=0", + }) err = base.Response{ StatusCode: base.StatusOK, Header: base.Header{ "Content-Type": base.HeaderValue{"application/sdp"}, - "Content-Base": base.HeaderValue{scheme + "://" + listenIP + ":8554/teststream/"}, + "Content-Base": base.HeaderValue{scheme + "://" + listenIP + ":8554/test/stream?param=value/"}, }, - Body: tracks.Write(), + Body: Tracks{track}.Write(), }.Write(bconn.Writer) require.NoError(t, err) req, err = readRequest(bconn.Reader) require.NoError(t, err) require.Equal(t, base.Setup, req.Method) - require.Equal(t, mustParseURL(scheme+"://"+listenIP+":8554/teststream/trackID=0"), req.URL) + require.Equal(t, mustParseURL(scheme+"://"+listenIP+":8554/test/stream?param=value/trackID=0"), req.URL) var inTH headers.Transport err = inTH.Read(req.Header["Transport"]) @@ -319,7 +322,7 @@ func TestClientRead(t *testing.T) { req, err = readRequest(bconn.Reader) require.NoError(t, err) require.Equal(t, base.Play, req.Method) - require.Equal(t, mustParseURL(scheme+"://"+listenIP+":8554/teststream/"), req.URL) + require.Equal(t, mustParseURL(scheme+"://"+listenIP+":8554/test/stream?param=value/"), req.URL) require.Equal(t, base.HeaderValue{"npt=0-"}, req.Header["Range"]) err = base.Response{ @@ -380,7 +383,7 @@ func TestClientRead(t *testing.T) { req, err = readRequest(bconn.Reader) require.NoError(t, err) require.Equal(t, base.Teardown, req.Method) - require.Equal(t, mustParseURL(scheme+"://"+listenIP+":8554/teststream/"), req.URL) + require.Equal(t, mustParseURL(scheme+"://"+listenIP+":8554/test/stream?param=value/"), req.URL) err = base.Response{ StatusCode: base.StatusOK, @@ -406,7 +409,7 @@ func TestClientRead(t *testing.T) { }(), } - conn, err := c.DialRead(scheme + "://" + listenIP + ":8554/teststream") + conn, err := c.DialRead(scheme + "://" + listenIP + ":8554/test/stream?param=value") require.NoError(t, err) done := make(chan struct{}) diff --git a/track.go b/track.go index edfcdd8f..4360d379 100644 --- a/track.go +++ b/track.go @@ -27,9 +27,9 @@ func (t *Track) hasControlAttribute() bool { } // URL returns the track URL. -func (t *Track) URL(baseURL *base.URL) (*base.URL, error) { - if baseURL == nil { - return nil, fmt.Errorf("empty base URL") +func (t *Track) URL(contentBase *base.URL) (*base.URL, error) { + if contentBase == nil { + return nil, fmt.Errorf("no Content-Base header provided") } controlAttr := func() string { @@ -43,7 +43,7 @@ func (t *Track) URL(baseURL *base.URL) (*base.URL, error) { // no control attribute, use base URL if controlAttr == "" { - return baseURL, nil + return contentBase, nil } // control attribute contains an absolute path @@ -54,8 +54,8 @@ func (t *Track) URL(baseURL *base.URL) (*base.URL, error) { } // copy host and credentials - ur.Host = baseURL.Host - ur.User = baseURL.User + ur.Host = contentBase.Host + ur.User = contentBase.User return ur, nil } @@ -63,7 +63,7 @@ func (t *Track) URL(baseURL *base.URL) (*base.URL, error) { // insert the control attribute at the end of the URL // if there's a query, insert it after the query // otherwise insert it after the path - strURL := baseURL.String() + strURL := contentBase.String() if controlAttr[0] != '?' && !strings.HasSuffix(strURL, "/") { strURL += "/" }