client: call Options() automatically

This commit is contained in:
aler9
2022-02-19 22:51:54 +01:00
parent 95117f0aa4
commit bc9be686d9
10 changed files with 45 additions and 69 deletions

View File

@@ -208,6 +208,7 @@ type Client struct {
session string session string
sender *auth.Sender sender *auth.Sender
cseq int cseq int
optionsSent bool
useGetParameter bool useGetParameter bool
lastDescribeURL *base.URL lastDescribeURL *base.URL
streamBaseURL *base.URL streamBaseURL *base.URL
@@ -338,12 +339,6 @@ func (c *Client) StartReading(address string) error {
return err return err
} }
_, err = c.Options(u)
if err != nil {
c.Close()
return err
}
tracks, baseURL, _, err := c.Describe(u) tracks, baseURL, _, err := c.Describe(u)
if err != nil { if err != nil {
c.Close() c.Close()
@@ -376,12 +371,6 @@ func (c *Client) StartPublishing(address string, tracks Tracks) error {
return err return err
} }
_, err = c.Options(u)
if err != nil {
c.Close()
return err
}
_, err = c.Announce(u, tracks) _, err = c.Announce(u, tracks)
if err != nil { if err != nil {
c.Close() c.Close()
@@ -627,6 +616,7 @@ func (c *Client) reset() {
c.session = "" c.session = ""
c.sender = nil c.sender = nil
c.cseq = 0 c.cseq = 0
c.optionsSent = false
c.useGetParameter = false c.useGetParameter = false
c.streamBaseURL = nil c.streamBaseURL = nil
c.protocol = nil c.protocol = nil
@@ -939,6 +929,13 @@ func (c *Client) do(req *base.Request, skipResponse bool, allowFrames bool) (*ba
} }
} }
if !c.optionsSent && req.Method != base.Options {
_, err := c.doOptions(req.URL)
if err != nil {
return nil, err
}
}
if req.Header == nil { if req.Header == nil {
req.Header = make(base.Header) req.Header = make(base.Header)
} }
@@ -1063,6 +1060,8 @@ func (c *Client) doOptions(u *base.URL) (*base.Response, error) {
return nil, liberrors.ErrClientBadStatusCode{Code: res.StatusCode, Message: res.StatusMessage} return nil, liberrors.ErrClientBadStatusCode{Code: res.StatusCode, Message: res.StatusMessage}
} }
c.optionsSent = true
c.useGetParameter = func() bool { c.useGetParameter = func() bool {
pub, ok := res.Header["Public"] pub, ok := res.Header["Public"]
if !ok || len(pub) != 1 { if !ok || len(pub) != 1 {
@@ -1130,11 +1129,6 @@ func (c *Client) doDescribe(u *base.URL) (Tracks, *base.URL, *base.Response, err
c.scheme = u.Scheme c.scheme = u.Scheme
c.host = u.Host c.host = u.Host
_, err = c.doOptions(u)
if err != nil {
return nil, nil, nil, err
}
return c.doDescribe(u) return c.doDescribe(u)
} }

View File

@@ -580,6 +580,23 @@ func TestClientReadPartial(t *testing.T) {
req, err := readRequest(br) req, err := readRequest(br)
require.NoError(t, err) require.NoError(t, err)
require.Equal(t, base.Options, req.Method)
base.Response{
StatusCode: base.StatusOK,
Header: base.Header{
"Public": base.HeaderValue{strings.Join([]string{
string(base.Describe),
string(base.Setup),
string(base.Play),
}, ", ")},
},
}.Write(&bb)
_, err = conn.Write(bb.Bytes())
require.NoError(t, err)
req, err = readRequest(br)
require.NoError(t, err)
require.Equal(t, base.Describe, req.Method) require.Equal(t, base.Describe, req.Method)
require.Equal(t, mustParseURL("rtsp://"+listenIP+":8554/teststream"), req.URL) require.Equal(t, mustParseURL("rtsp://"+listenIP+":8554/teststream"), req.URL)
@@ -1222,6 +1239,23 @@ func TestClientReadAutomaticProtocol(t *testing.T) {
require.NoError(t, err) require.NoError(t, err)
br = bufio.NewReader(conn) br = bufio.NewReader(conn)
req, err = readRequest(br)
require.NoError(t, err)
require.Equal(t, base.Options, req.Method)
base.Response{
StatusCode: base.StatusOK,
Header: base.Header{
"Public": base.HeaderValue{strings.Join([]string{
string(base.Describe),
string(base.Setup),
string(base.Play),
}, ", ")},
},
}.Write(&bb)
_, err = conn.Write(bb.Bytes())
require.NoError(t, err)
req, err = readRequest(br) req, err = readRequest(br)
require.NoError(t, err) require.NoError(t, err)
require.Equal(t, base.Describe, req.Method) require.Equal(t, base.Describe, req.Method)
@@ -2463,9 +2497,6 @@ func TestClientReadSeek(t *testing.T) {
require.NoError(t, err) require.NoError(t, err)
defer c.Close() defer c.Close()
_, err = c.Options(u)
require.NoError(t, err)
tracks, baseURL, _, err := c.Describe(u) tracks, baseURL, _, err := c.Describe(u)
require.NoError(t, err) require.NoError(t, err)

View File

@@ -147,9 +147,6 @@ func TestClientSession(t *testing.T) {
require.NoError(t, err) require.NoError(t, err)
defer c.Close() defer c.Close()
_, err = c.Options(u)
require.NoError(t, err)
_, _, _, err = c.Describe(u) _, _, _, err = c.Describe(u)
require.NoError(t, err) require.NoError(t, err)
} }
@@ -233,9 +230,6 @@ func TestClientAuth(t *testing.T) {
require.NoError(t, err) require.NoError(t, err)
defer c.Close() defer c.Close()
_, err = c.Options(u)
require.NoError(t, err)
_, _, _, err = c.Describe(u) _, _, _, err = c.Describe(u)
require.NoError(t, err) require.NoError(t, err)
} }
@@ -300,9 +294,6 @@ func TestClientDescribeCharset(t *testing.T) {
require.NoError(t, err) require.NoError(t, err)
defer c.Close() defer c.Close()
_, err = c.Options(u)
require.NoError(t, err)
_, _, _, err = c.Describe(u) _, _, _, err = c.Describe(u)
require.NoError(t, err) require.NoError(t, err)
} }

View File

@@ -25,11 +25,6 @@ func main() {
} }
defer c.Close() defer c.Close()
_, err = c.Options(u)
if err != nil {
panic(err)
}
tracks, _, _, err := c.Describe(u) tracks, _, _, err := c.Describe(u)
if err != nil { if err != nil {
panic(err) panic(err)

View File

@@ -30,12 +30,6 @@ func main() {
} }
defer c.Close() defer c.Close()
// get available methods
_, err = c.Options(u)
if err != nil {
panic(err)
}
// find published tracks // find published tracks
tracks, baseURL, _, err := c.Describe(u) tracks, baseURL, _, err := c.Describe(u)
if err != nil { if err != nil {

View File

@@ -56,12 +56,6 @@ func main() {
} }
defer c.Close() defer c.Close()
// get available methods
_, err = c.Options(u)
if err != nil {
panic(err)
}
// find published tracks // find published tracks
tracks, baseURL, _, err := c.Describe(u) tracks, baseURL, _, err := c.Describe(u)
if err != nil { if err != nil {

View File

@@ -28,12 +28,6 @@ func main() {
} }
defer c.Close() defer c.Close()
// get available methods
_, err = c.Options(u)
if err != nil {
panic(err)
}
// find published tracks // find published tracks
tracks, baseURL, _, err := c.Describe(u) tracks, baseURL, _, err := c.Describe(u)
if err != nil { if err != nil {

View File

@@ -33,12 +33,6 @@ func main() {
} }
defer c.Close() defer c.Close()
// get available methods
_, err = c.Options(u)
if err != nil {
panic(err)
}
// find published tracks // find published tracks
tracks, baseURL, _, err := c.Describe(u) tracks, baseURL, _, err := c.Describe(u)
if err != nil { if err != nil {

View File

@@ -37,11 +37,6 @@ func main() {
} }
defer c.Close() defer c.Close()
_, err = c.Options(u)
if err != nil {
panic(err)
}
tracks, baseURL, _, err := c.Describe(u) tracks, baseURL, _, err := c.Describe(u)
if err != nil { if err != nil {
panic(err) panic(err)

View File

@@ -28,12 +28,6 @@ func main() {
} }
defer reader.Close() defer reader.Close()
// get available methods
_, err = reader.Options(sourceURL)
if err != nil {
panic(err)
}
// find published tracks // find published tracks
tracks, baseURL, _, err := reader.Describe(sourceURL) tracks, baseURL, _, err := reader.Describe(sourceURL)
if err != nil { if err != nil {