client: support cameras that provide base URL inside control attribute (https://github.com/aler9/rtsp-simple-server/issues/683)

This commit is contained in:
aler9
2022-05-11 16:51:48 +02:00
parent c1b10a80be
commit 811e189b43
7 changed files with 151 additions and 107 deletions

View File

@@ -1237,7 +1237,25 @@ func (c *Client) doDescribe(u *base.URL) (Tracks, *base.URL, *base.Response, err
return nil, nil, nil, liberrors.ErrClientContentTypeUnsupported{CT: ct}
}
tracks, sd, err := ReadTracks(res.Body, true)
if err != nil {
return nil, nil, nil, err
}
baseURL, err := func() (*base.URL, error) {
// use global control attribute
if control, ok := sd.Attribute("control"); ok && control != "*" {
ret, err := base.ParseURL(control)
if err != nil {
return nil, fmt.Errorf("invalid control attribute: '%v'", control)
}
// add credentials
ret.User = u.User
return ret, nil
}
// use Content-Base
if cb, ok := res.Header["Content-Base"]; ok {
if len(cb) != 1 {
@@ -1249,24 +1267,19 @@ func (c *Client) doDescribe(u *base.URL) (Tracks, *base.URL, *base.Response, err
return nil, fmt.Errorf("invalid Content-Base: '%v'", cb)
}
// add credentials from URL of request
// add credentials
ret.User = u.User
return ret, nil
}
// if not provided, use URL of request
// use URL of request
return u, nil
}()
if err != nil {
return nil, nil, nil, err
}
tracks, err := ReadTracks(res.Body, true)
if err != nil {
return nil, nil, nil, err
}
c.lastDescribeURL = u
return tracks, baseURL, res, nil