mirror of
				https://github.com/aler9/gortsplib
				synced 2025-10-31 18:42:40 +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
	 aler9
					aler9