@@ -1022,6 +1022,92 @@ func TestExecdAuthHeader(t *testing.T) {
10221022 require .NoErrorf (t , err , "Ping" )
10231023}
10241024
1025+ // TestResolveExecdForwardsAllEndpointHeaders verifies that every header
1026+ // returned by GetEndpoint (auth tokens, routing hints, sticky-session keys,
1027+ // etc.) is forwarded as-is on subsequent execd requests, mirroring the
1028+ // Python SDK behavior.
1029+ func TestResolveExecdForwardsAllEndpointHeaders (t * testing.T ) {
1030+ endpointHeaders := map [string ]string {
1031+ "X-EXECD-ACCESS-TOKEN" : "execd-tok" ,
1032+ "X-Route-Hint" : "vip-pool" ,
1033+ "X-Sticky-Session" : "sess-abc" ,
1034+ }
1035+
1036+ execdSrv := httptest .NewServer (http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
1037+ for k , want := range endpointHeaders {
1038+ if got := r .Header .Get (k ); got != want {
1039+ assert .Fail (t , fmt .Sprintf ("header %s = %q, want %q" , k , got , want ))
1040+ }
1041+ }
1042+ w .WriteHeader (http .StatusOK )
1043+ }))
1044+ defer execdSrv .Close ()
1045+
1046+ lifecycleSrv := httptest .NewServer (http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
1047+ if r .Method == http .MethodGet && strings .Contains (r .URL .Path , "/endpoints/" ) {
1048+ jsonResponse (w , http .StatusOK , Endpoint {
1049+ Endpoint : execdSrv .URL ,
1050+ Headers : endpointHeaders ,
1051+ })
1052+ return
1053+ }
1054+ w .WriteHeader (http .StatusNotFound )
1055+ }))
1056+ defer lifecycleSrv .Close ()
1057+
1058+ config := ConnectionConfig {Domain : lifecycleSrv .URL }
1059+ sb := & Sandbox {
1060+ id : "sbx-headers" ,
1061+ config : & config ,
1062+ lifecycle : config .lifecycleClient (),
1063+ }
1064+
1065+ require .NoErrorf (t , sb .resolveExecd (context .Background ()), "resolveExecd" )
1066+ require .NoErrorf (t , sb .execd .Ping (context .Background ()), "Ping" )
1067+ }
1068+
1069+ // TestResolveEgressForwardsAllEndpointHeaders verifies the same forwarding
1070+ // behavior for the egress sidecar client.
1071+ func TestResolveEgressForwardsAllEndpointHeaders (t * testing.T ) {
1072+ endpointHeaders := map [string ]string {
1073+ "OPENSANDBOX-EGRESS-AUTH" : "egress-tok" ,
1074+ "X-Route-Hint" : "egress-vip" ,
1075+ }
1076+
1077+ egressSrv := httptest .NewServer (http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
1078+ for k , want := range endpointHeaders {
1079+ if got := r .Header .Get (k ); got != want {
1080+ assert .Fail (t , fmt .Sprintf ("header %s = %q, want %q" , k , got , want ))
1081+ }
1082+ }
1083+ jsonResponse (w , http .StatusOK , PolicyStatusResponse {Status : "ok" })
1084+ }))
1085+ defer egressSrv .Close ()
1086+
1087+ lifecycleSrv := httptest .NewServer (http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
1088+ if r .Method == http .MethodGet && strings .Contains (r .URL .Path , "/endpoints/" ) {
1089+ jsonResponse (w , http .StatusOK , Endpoint {
1090+ Endpoint : egressSrv .URL ,
1091+ Headers : endpointHeaders ,
1092+ })
1093+ return
1094+ }
1095+ w .WriteHeader (http .StatusNotFound )
1096+ }))
1097+ defer lifecycleSrv .Close ()
1098+
1099+ config := ConnectionConfig {Domain : lifecycleSrv .URL }
1100+ sb := & Sandbox {
1101+ id : "sbx-egress-headers" ,
1102+ config : & config ,
1103+ lifecycle : config .lifecycleClient (),
1104+ }
1105+
1106+ require .NoErrorf (t , sb .resolveEgress (context .Background ()), "resolveEgress" )
1107+ _ , err := sb .egress .GetPolicy (context .Background ())
1108+ require .NoErrorf (t , err , "GetPolicy" )
1109+ }
1110+
10251111func TestSandboxManager_ListFilter (t * testing.T ) {
10261112 now := time .Now ().UTC ().Truncate (time .Second )
10271113 want := ListSandboxesResponse {
0 commit comments