@@ -813,14 +813,8 @@ func TestModifyResponseUseContext(t *testing.T) {
813
813
assert .Equal (t , "CUSTOM_BALANCER" , rec .Header ().Get ("FROM_BALANCER" ))
814
814
}
815
815
816
- func TestProxyWithConfigWebSocketTCP (t * testing.T ) {
817
- /*
818
- Arrange
819
- */
820
- e := echo .New ()
821
-
822
- // Create a WebSocket test server
823
- srv := httptest .NewServer (http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
816
+ func createSimpleWebSocketServer (serveTLS bool ) * httptest.Server {
817
+ handler := http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
824
818
wsHandler := func (conn * websocket.Conn ) {
825
819
defer conn .Close ()
826
820
for {
@@ -834,15 +828,59 @@ func TestProxyWithConfigWebSocketTCP(t *testing.T) {
834
828
}
835
829
}
836
830
websocket.Server {Handler : wsHandler }.ServeHTTP (w , r )
837
- }))
838
- defer srv .Close ()
831
+ })
832
+ if serveTLS {
833
+ return httptest .NewTLSServer (handler )
834
+ }
835
+ return httptest .NewServer (handler )
836
+ }
839
837
840
- tgtURL , _ := url . Parse ( srv . URL )
841
- balancer := NewRandomBalancer ([] * ProxyTarget {{ URL : tgtURL }} )
838
+ func createSimpleProxyServer ( t * testing. T , srv * httptest. Server , serveTLS bool , toTLS bool ) * httptest. Server {
839
+ e := echo . New ( )
842
840
843
- e .Use (ProxyWithConfig (ProxyConfig {Balancer : balancer }))
841
+ if toTLS {
842
+ // proxy to tls target
843
+ tgtURL , _ := url .Parse (srv .URL )
844
+ tgtURL .Scheme = "wss"
845
+ balancer := NewRandomBalancer ([]* ProxyTarget {{URL : tgtURL }})
844
846
847
+ defaultTransport , ok := http .DefaultTransport .(* http.Transport )
848
+ if ! ok {
849
+ t .Fatal ("Default transport is not of type *http.Transport" )
850
+ }
851
+ transport := defaultTransport .Clone ()
852
+ transport .TLSClientConfig = & tls.Config {
853
+ InsecureSkipVerify : true ,
854
+ }
855
+ e .Use (ProxyWithConfig (ProxyConfig {Balancer : balancer , Transport : transport }))
856
+ } else {
857
+ // proxy to non-TLS target
858
+ tgtURL , _ := url .Parse (srv .URL )
859
+ balancer := NewRandomBalancer ([]* ProxyTarget {{URL : tgtURL }})
860
+ e .Use (ProxyWithConfig (ProxyConfig {Balancer : balancer }))
861
+ }
862
+
863
+ if serveTLS {
864
+ // serve proxy server with TLS
865
+ ts := httptest .NewTLSServer (e )
866
+ return ts
867
+ }
868
+ // serve proxy server without TLS
845
869
ts := httptest .NewServer (e )
870
+ return ts
871
+ }
872
+
873
+ // TestProxyWithConfigWebSocketNonTLS2NonTLS tests the proxy with non-TLS to non-TLS WebSocket connection.
874
+ func TestProxyWithConfigWebSocketNonTLS2NonTLS (t * testing.T ) {
875
+ /*
876
+ Arrange
877
+ */
878
+ // Create a WebSocket test server (non-TLS)
879
+ srv := createSimpleWebSocketServer (false )
880
+ defer srv .Close ()
881
+
882
+ // create proxy server (non-TLS to non-TLS)
883
+ ts := createSimpleProxyServer (t , srv , false , false )
846
884
defer ts .Close ()
847
885
848
886
tsURL , _ := url .Parse (ts .URL )
@@ -859,7 +897,7 @@ func TestProxyWithConfigWebSocketTCP(t *testing.T) {
859
897
defer wsConn .Close ()
860
898
861
899
// Send message
862
- sendMsg := "Hello, WebSocket!"
900
+ sendMsg := "Hello, Non TLS WebSocket!"
863
901
err = websocket .Message .Send (wsConn , sendMsg )
864
902
assert .NoError (t , err )
865
903
@@ -873,48 +911,103 @@ func TestProxyWithConfigWebSocketTCP(t *testing.T) {
873
911
assert .Equal (t , sendMsg , recvMsg )
874
912
}
875
913
876
- func TestProxyWithConfigWebSocketTLS (t * testing.T ) {
914
+ // TestProxyWithConfigWebSocketTLS2TLS tests the proxy with TLS to TLS WebSocket connection.
915
+ func TestProxyWithConfigWebSocketTLS2TLS (t * testing.T ) {
877
916
/*
878
917
Arrange
879
918
*/
880
- e := echo .New ()
881
-
882
- // Create a WebSocket test server
883
- srv := httptest .NewTLSServer (http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
884
- wsHandler := func (conn * websocket.Conn ) {
885
- defer conn .Close ()
886
- for {
887
- var msg string
888
- err := websocket .Message .Receive (conn , & msg )
889
- if err != nil {
890
- return
891
- }
892
- // message back to the client
893
- websocket .Message .Send (conn , msg )
894
- }
895
- }
896
- websocket.Server {Handler : wsHandler }.ServeHTTP (w , r )
897
- }))
919
+ // Create a WebSocket test server (TLS)
920
+ srv := createSimpleWebSocketServer (true )
898
921
defer srv .Close ()
899
922
900
- // create proxy server
901
- tgtURL , _ := url . Parse ( srv . URL )
902
- tgtURL . Scheme = "wss"
923
+ // create proxy server (TLS to TLS)
924
+ ts := createSimpleProxyServer ( t , srv , true , true )
925
+ defer ts . Close ()
903
926
904
- balancer := NewRandomBalancer ([]* ProxyTarget {{URL : tgtURL }})
927
+ tsURL , _ := url .Parse (ts .URL )
928
+ tsURL .Scheme = "wss"
929
+ tsURL .Path = "/"
905
930
906
- defaultTransport , ok := http .DefaultTransport .(* http.Transport )
907
- if ! ok {
908
- t .Fatal ("Default transport is not of type *http.Transport" )
909
- }
910
- transport := defaultTransport .Clone ()
911
- transport .TLSClientConfig = & tls.Config {
912
- InsecureSkipVerify : true ,
931
+ /*
932
+ Act
933
+ */
934
+ origin , err := url .Parse (ts .URL )
935
+ assert .NoError (t , err )
936
+ config := & websocket.Config {
937
+ Location : tsURL ,
938
+ Origin : origin ,
939
+ TlsConfig : & tls.Config {InsecureSkipVerify : true }, // skip verify for testing
940
+ Version : websocket .ProtocolVersionHybi13 ,
913
941
}
914
- e .Use (ProxyWithConfig (ProxyConfig {Balancer : balancer , Transport : transport }))
942
+ wsConn , err := websocket .DialConfig (config )
943
+ assert .NoError (t , err )
944
+ defer wsConn .Close ()
945
+
946
+ // Send message
947
+ sendMsg := "Hello, TLS to TLS WebSocket!"
948
+ err = websocket .Message .Send (wsConn , sendMsg )
949
+ assert .NoError (t , err )
950
+
951
+ // Read response
952
+ var recvMsg string
953
+ err = websocket .Message .Receive (wsConn , & recvMsg )
954
+ assert .NoError (t , err )
955
+ assert .Equal (t , sendMsg , recvMsg )
956
+ }
957
+
958
+ // TestProxyWithConfigWebSocketNonTLS2TLS tests the proxy with non-TLS to TLS WebSocket connection.
959
+ func TestProxyWithConfigWebSocketNonTLS2TLS (t * testing.T ) {
960
+ /*
961
+ Arrange
962
+ */
963
+
964
+ // Create a WebSocket test server (TLS)
965
+ srv := createSimpleWebSocketServer (true )
966
+ defer srv .Close ()
967
+
968
+ // create proxy server (Non-TLS to TLS)
969
+ ts := createSimpleProxyServer (t , srv , false , true )
970
+ defer ts .Close ()
971
+
972
+ tsURL , _ := url .Parse (ts .URL )
973
+ tsURL .Scheme = "ws"
974
+ tsURL .Path = "/"
975
+
976
+ /*
977
+ Act
978
+ */
979
+ // Connect to the proxy WebSocket
980
+ wsConn , err := websocket .Dial (tsURL .String (), "" , "http://localhost/" )
981
+ assert .NoError (t , err )
982
+ defer wsConn .Close ()
983
+
984
+ // Send message
985
+ sendMsg := "Hello, Non TLS to TLS WebSocket!"
986
+ err = websocket .Message .Send (wsConn , sendMsg )
987
+ assert .NoError (t , err )
988
+
989
+ /*
990
+ Assert
991
+ */
992
+ // Read response
993
+ var recvMsg string
994
+ err = websocket .Message .Receive (wsConn , & recvMsg )
995
+ assert .NoError (t , err )
996
+ assert .Equal (t , sendMsg , recvMsg )
997
+ }
998
+
999
+ // TestProxyWithConfigWebSocketTLSToNoneTLS tests the proxy with TLS to non-TLS WebSocket connection. (TLS termination)
1000
+ func TestProxyWithConfigWebSocketTLS2NonTLS (t * testing.T ) {
1001
+ /*
1002
+ Arrange
1003
+ */
1004
+
1005
+ // Create a WebSocket test server (non-TLS)
1006
+ srv := createSimpleWebSocketServer (false )
1007
+ defer srv .Close ()
915
1008
916
- // Start test server
917
- ts := httptest . NewTLSServer ( e )
1009
+ // create proxy server (TLS to non-TLS)
1010
+ ts := createSimpleProxyServer ( t , srv , true , false )
918
1011
defer ts .Close ()
919
1012
920
1013
tsURL , _ := url .Parse (ts .URL )
@@ -937,7 +1030,7 @@ func TestProxyWithConfigWebSocketTLS(t *testing.T) {
937
1030
defer wsConn .Close ()
938
1031
939
1032
// Send message
940
- sendMsg := "Hello, TLS WebSocket!"
1033
+ sendMsg := "Hello, TLS to NoneTLS WebSocket!"
941
1034
err = websocket .Message .Send (wsConn , sendMsg )
942
1035
assert .NoError (t , err )
943
1036
0 commit comments