@@ -3,6 +3,7 @@ package gortsplib
3
3
import (
4
4
"bufio"
5
5
"bytes"
6
+ "context"
6
7
"crypto/tls"
7
8
"net"
8
9
"net/http"
@@ -593,7 +594,7 @@ func TestClientRelativeContentBase(t *testing.T) {
593
594
require .Equal (t , "rtsp://localhost:8554/relative-content-base" , desc .BaseURL .String ())
594
595
}
595
596
596
- func TestClientHTTPTunnel (t * testing.T ) {
597
+ func TestClientTunnelHTTP (t * testing.T ) {
597
598
for _ , ca := range []string {"http" , "https" } {
598
599
t .Run (ca , func (t * testing.T ) {
599
600
var l net.Listener
@@ -768,8 +769,103 @@ func TestClientHTTPTunnel(t *testing.T) {
768
769
require .NoError (t , err )
769
770
defer c .Close ()
770
771
771
- _ , _ , err = c .Describe (u )
772
+ _ , res , err : = c .Describe (u )
772
773
require .NoError (t , err )
774
+ require .Equal (t , base .StatusOK , res .StatusCode )
775
+ })
776
+ }
777
+ }
778
+
779
+ func TestClientTunnelWebSocket (t * testing.T ) {
780
+ for _ , ca := range []string {"ws" , "wss" } {
781
+ t .Run (ca , func (t * testing.T ) {
782
+ var scheme string
783
+ if ca == "ws" {
784
+ scheme = "rtsp"
785
+ } else {
786
+ scheme = "rtsps"
787
+ }
788
+
789
+ s := & http.Server {
790
+ Handler : http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
791
+ require .Equal (t , r .Header .Get ("Sec-WebSocket-Protocol" ), "rtsp.onvif.org" )
792
+
793
+ wconn , err := upgrader .Upgrade (w , r , nil )
794
+ require .NoError (t , err )
795
+ defer wconn .Close () //nolint:errcheck
796
+
797
+ conn := conn .NewConn (bufio .NewReader (& wsReader {wc : wconn }), & wsWriter {wc : wconn })
798
+
799
+ req , err2 := conn .ReadRequest ()
800
+ require .NoError (t , err2 )
801
+ require .Equal (t , base .Options , req .Method )
802
+
803
+ err2 = conn .WriteResponse (& base.Response {
804
+ StatusCode : base .StatusOK ,
805
+ Header : base.Header {
806
+ "Public" : base.HeaderValue {strings .Join ([]string {
807
+ string (base .Describe ),
808
+ }, ", " )},
809
+ },
810
+ })
811
+ require .NoError (t , err2 )
812
+
813
+ req , err2 = conn .ReadRequest ()
814
+ require .NoError (t , err2 )
815
+ require .Equal (t , base .Describe , req .Method )
816
+ require .Equal (t , mustParseURL (scheme + "://localhost:8554/teststream" ), req .URL )
817
+
818
+ medias := []* description.Media {testH264Media }
819
+
820
+ err2 = conn .WriteResponse (& base.Response {
821
+ StatusCode : base .StatusOK ,
822
+ Header : base.Header {
823
+ "Content-Type" : base.HeaderValue {"application/sdp; charset=utf-8" },
824
+ "Content-Base" : base.HeaderValue {"/relative-content-base" },
825
+ },
826
+ Body : mediasToSDP (medias ),
827
+ })
828
+ require .NoError (t , err2 )
829
+ }),
830
+ }
831
+
832
+ var ln net.Listener
833
+
834
+ if ca == "ws" {
835
+ var err error
836
+ ln , err = net .Listen ("tcp" , "localhost:8554" )
837
+ require .NoError (t , err )
838
+ } else {
839
+ cert , err := tls .X509KeyPair (serverCert , serverKey )
840
+ require .NoError (t , err )
841
+
842
+ ln , err = tls .Listen ("tcp" , "localhost:8554" , & tls.Config {Certificates : []tls.Certificate {cert }})
843
+ require .NoError (t , err )
844
+ defer ln .Close ()
845
+ }
846
+
847
+ go s .Serve (ln )
848
+ defer s .Shutdown (context .Background ())
849
+
850
+ u , err := base .ParseURL (scheme + "://localhost:8554/teststream" )
851
+ require .NoError (t , err )
852
+
853
+ c := Client {
854
+ Scheme : u .Scheme ,
855
+ Host : u .Host ,
856
+ Tunnel : TunnelWebSocket ,
857
+ TLSConfig : & tls.Config {
858
+ InsecureSkipVerify : true ,
859
+ },
860
+ }
861
+
862
+ err = c .Start ()
863
+ require .NoError (t , err )
864
+ defer c .Close ()
865
+
866
+ _ , res , err := c .Describe (u )
867
+ require .NoError (t , err )
868
+ require .Equal (t , base .StatusOK , res .StatusCode )
773
869
})
774
870
}
775
871
}
0 commit comments