@@ -1093,3 +1093,68 @@ func TestProxyWithAuthorizationHeader(t *testing.T) {
10931093	assert .Equal (t , "target 2" , rec .Body .String ())
10941094	assert .Equal (t , "" , receivedAuthHeader )
10951095}
1096+ 
1097+ func  TestProxyWithConfigWebSocketAuthorizationHeader (t  * testing.T ) {
1098+ 	// Capture the authorization header received by the WebSocket server 
1099+ 	var  receivedAuthHeader  string 
1100+ 	var  authHeaderMutex  sync.Mutex 
1101+ 
1102+ 	// Create a WebSocket server that captures the Authorization header 
1103+ 	wsServer  :=  httptest .NewServer (http .HandlerFunc (func (w  http.ResponseWriter , r  * http.Request ) {
1104+ 		authHeaderMutex .Lock ()
1105+ 		receivedAuthHeader  =  r .Header .Get ("Authorization" )
1106+ 		authHeaderMutex .Unlock ()
1107+ 
1108+ 		wsHandler  :=  func (conn  * websocket.Conn ) {
1109+ 			defer  conn .Close ()
1110+ 			for  {
1111+ 				var  msg  string 
1112+ 				err  :=  websocket .Message .Receive (conn , & msg )
1113+ 				if  err  !=  nil  {
1114+ 					return 
1115+ 				}
1116+ 				// Echo message back to the client 
1117+ 				websocket .Message .Send (conn , msg )
1118+ 			}
1119+ 		}
1120+ 		websocket.Server {Handler : wsHandler }.ServeHTTP (w , r )
1121+ 	}))
1122+ 	defer  wsServer .Close ()
1123+ 
1124+ 	// Create proxy server with target URL containing user:pass credentials 
1125+ 	targetURL , _  :=  url .Parse (wsServer .URL )
1126+ 	targetURL .User  =  url .UserPassword ("wsuser" , "wspass" )
1127+ 
1128+ 	e  :=  echo .New ()
1129+ 	balancer  :=  NewRandomBalancer ([]* ProxyTarget {{URL : targetURL }})
1130+ 	e .Use (ProxyWithConfig (ProxyConfig {Balancer : balancer }))
1131+ 
1132+ 	proxyServer  :=  httptest .NewServer (e )
1133+ 	defer  proxyServer .Close ()
1134+ 
1135+ 	// Connect to the proxy WebSocket 
1136+ 	proxyURL , _  :=  url .Parse (proxyServer .URL )
1137+ 	proxyURL .Scheme  =  "ws" 
1138+ 	proxyURL .Path  =  "/" 
1139+ 
1140+ 	wsConn , err  :=  websocket .Dial (proxyURL .String (), "" , "http://localhost/" )
1141+ 	assert .NoError (t , err )
1142+ 	defer  wsConn .Close ()
1143+ 
1144+ 	// Send message to verify WebSocket connection works 
1145+ 	sendMsg  :=  "Hello, WebSocket with Auth!" 
1146+ 	err  =  websocket .Message .Send (wsConn , sendMsg )
1147+ 	assert .NoError (t , err )
1148+ 
1149+ 	// Read response 
1150+ 	var  recvMsg  string 
1151+ 	err  =  websocket .Message .Receive (wsConn , & recvMsg )
1152+ 	assert .NoError (t , err )
1153+ 	assert .Equal (t , sendMsg , recvMsg )
1154+ 
1155+ 	// Verify authorization header was forwarded 
1156+ 	authHeaderMutex .Lock ()
1157+ 	expectedAuth  :=  "Basic d3N1c2VyOndzcGFzcw=="  // base64 of "wsuser:wspass" 
1158+ 	assert .Equal (t , expectedAuth , receivedAuthHeader )
1159+ 	authHeaderMutex .Unlock ()
1160+ }
0 commit comments