mirror of
https://github.com/aler9/gortsplib
synced 2025-10-15 19:50:45 +08:00
client: call Options() automatically
This commit is contained in:
28
client.go
28
client.go
@@ -208,6 +208,7 @@ type Client struct {
|
||||
session string
|
||||
sender *auth.Sender
|
||||
cseq int
|
||||
optionsSent bool
|
||||
useGetParameter bool
|
||||
lastDescribeURL *base.URL
|
||||
streamBaseURL *base.URL
|
||||
@@ -338,12 +339,6 @@ func (c *Client) StartReading(address string) error {
|
||||
return err
|
||||
}
|
||||
|
||||
_, err = c.Options(u)
|
||||
if err != nil {
|
||||
c.Close()
|
||||
return err
|
||||
}
|
||||
|
||||
tracks, baseURL, _, err := c.Describe(u)
|
||||
if err != nil {
|
||||
c.Close()
|
||||
@@ -376,12 +371,6 @@ func (c *Client) StartPublishing(address string, tracks Tracks) error {
|
||||
return err
|
||||
}
|
||||
|
||||
_, err = c.Options(u)
|
||||
if err != nil {
|
||||
c.Close()
|
||||
return err
|
||||
}
|
||||
|
||||
_, err = c.Announce(u, tracks)
|
||||
if err != nil {
|
||||
c.Close()
|
||||
@@ -627,6 +616,7 @@ func (c *Client) reset() {
|
||||
c.session = ""
|
||||
c.sender = nil
|
||||
c.cseq = 0
|
||||
c.optionsSent = false
|
||||
c.useGetParameter = false
|
||||
c.streamBaseURL = 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 {
|
||||
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}
|
||||
}
|
||||
|
||||
c.optionsSent = true
|
||||
|
||||
c.useGetParameter = func() bool {
|
||||
pub, ok := res.Header["Public"]
|
||||
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.host = u.Host
|
||||
|
||||
_, err = c.doOptions(u)
|
||||
if err != nil {
|
||||
return nil, nil, nil, err
|
||||
}
|
||||
|
||||
return c.doDescribe(u)
|
||||
}
|
||||
|
||||
|
@@ -580,6 +580,23 @@ func TestClientReadPartial(t *testing.T) {
|
||||
|
||||
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)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, base.Describe, req.Method)
|
||||
require.Equal(t, mustParseURL("rtsp://"+listenIP+":8554/teststream"), req.URL)
|
||||
|
||||
@@ -1222,6 +1239,23 @@ func TestClientReadAutomaticProtocol(t *testing.T) {
|
||||
require.NoError(t, err)
|
||||
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)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, base.Describe, req.Method)
|
||||
@@ -2463,9 +2497,6 @@ func TestClientReadSeek(t *testing.T) {
|
||||
require.NoError(t, err)
|
||||
defer c.Close()
|
||||
|
||||
_, err = c.Options(u)
|
||||
require.NoError(t, err)
|
||||
|
||||
tracks, baseURL, _, err := c.Describe(u)
|
||||
require.NoError(t, err)
|
||||
|
||||
|
@@ -147,9 +147,6 @@ func TestClientSession(t *testing.T) {
|
||||
require.NoError(t, err)
|
||||
defer c.Close()
|
||||
|
||||
_, err = c.Options(u)
|
||||
require.NoError(t, err)
|
||||
|
||||
_, _, _, err = c.Describe(u)
|
||||
require.NoError(t, err)
|
||||
}
|
||||
@@ -233,9 +230,6 @@ func TestClientAuth(t *testing.T) {
|
||||
require.NoError(t, err)
|
||||
defer c.Close()
|
||||
|
||||
_, err = c.Options(u)
|
||||
require.NoError(t, err)
|
||||
|
||||
_, _, _, err = c.Describe(u)
|
||||
require.NoError(t, err)
|
||||
}
|
||||
@@ -300,9 +294,6 @@ func TestClientDescribeCharset(t *testing.T) {
|
||||
require.NoError(t, err)
|
||||
defer c.Close()
|
||||
|
||||
_, err = c.Options(u)
|
||||
require.NoError(t, err)
|
||||
|
||||
_, _, _, err = c.Describe(u)
|
||||
require.NoError(t, err)
|
||||
}
|
||||
|
@@ -25,11 +25,6 @@ func main() {
|
||||
}
|
||||
defer c.Close()
|
||||
|
||||
_, err = c.Options(u)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
tracks, _, _, err := c.Describe(u)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
|
@@ -30,12 +30,6 @@ func main() {
|
||||
}
|
||||
defer c.Close()
|
||||
|
||||
// get available methods
|
||||
_, err = c.Options(u)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
// find published tracks
|
||||
tracks, baseURL, _, err := c.Describe(u)
|
||||
if err != nil {
|
||||
|
@@ -56,12 +56,6 @@ func main() {
|
||||
}
|
||||
defer c.Close()
|
||||
|
||||
// get available methods
|
||||
_, err = c.Options(u)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
// find published tracks
|
||||
tracks, baseURL, _, err := c.Describe(u)
|
||||
if err != nil {
|
||||
|
@@ -28,12 +28,6 @@ func main() {
|
||||
}
|
||||
defer c.Close()
|
||||
|
||||
// get available methods
|
||||
_, err = c.Options(u)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
// find published tracks
|
||||
tracks, baseURL, _, err := c.Describe(u)
|
||||
if err != nil {
|
||||
|
@@ -33,12 +33,6 @@ func main() {
|
||||
}
|
||||
defer c.Close()
|
||||
|
||||
// get available methods
|
||||
_, err = c.Options(u)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
// find published tracks
|
||||
tracks, baseURL, _, err := c.Describe(u)
|
||||
if err != nil {
|
||||
|
@@ -37,11 +37,6 @@ func main() {
|
||||
}
|
||||
defer c.Close()
|
||||
|
||||
_, err = c.Options(u)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
tracks, baseURL, _, err := c.Describe(u)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
|
@@ -28,12 +28,6 @@ func main() {
|
||||
}
|
||||
defer reader.Close()
|
||||
|
||||
// get available methods
|
||||
_, err = reader.Options(sourceURL)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
// find published tracks
|
||||
tracks, baseURL, _, err := reader.Describe(sourceURL)
|
||||
if err != nil {
|
||||
|
Reference in New Issue
Block a user