@@ -130,30 +130,15 @@ func (c completedConfig) New(delegationTarget genericapiserver.DelegationTarget)
130
130
131
131
delegate := delegationTarget .UnprotectedHandler ()
132
132
if delegate == nil {
133
+ // To prevent anomalous requests from being sent to member clusters due to improper usage,
134
+ // we do not allow proxying requests with unmatched prefixes to member clusters.
133
135
delegate = http .NotFoundHandler ()
134
136
}
135
137
136
138
restManager := NewRESTManager (c .GenericConfig .Serializer , runtime .ContentTypeJSON , c .StorageFactory , c .InitialAPIGroupResources )
137
139
discoveryManager := discovery .NewDiscoveryManager (c .GenericConfig .Serializer , restManager , delegate )
138
140
139
- // handle root discovery request
140
- genericserver .Handler .NonGoRestfulMux .Handle ("/api" , discoveryManager )
141
- genericserver .Handler .NonGoRestfulMux .Handle ("/apis" , discoveryManager )
142
-
143
- resourceHandler := & ResourceHandler {
144
- minRequestTimeout : time .Duration (c .GenericConfig .MinRequestTimeout ) * time .Second ,
145
-
146
- delegate : delegate ,
147
- rest : restManager ,
148
- discovery : discoveryManager ,
149
- clusterLister : c .InformerFactory .Cluster ().V1alpha2 ().PediaClusters ().Lister (),
150
- }
151
- genericserver .Handler .NonGoRestfulMux .HandlePrefix ("/api/" , resourceHandler )
152
- genericserver .Handler .NonGoRestfulMux .HandlePrefix ("/apis/" , resourceHandler )
153
-
154
141
clusterInformer := c .InformerFactory .Cluster ().V1alpha2 ().PediaClusters ()
155
- _ = NewClusterResourceController (restManager , discoveryManager , clusterInformer )
156
-
157
142
connector := proxyrest .NewProxyConnector (clusterInformer .Lister (), c .ExtraConfig .AllowPediaClusterConfigReuse , c .ExtraConfig .ExtraProxyRequestHeaderPrefixes )
158
143
159
144
methodSet := sets .New ("GET" )
@@ -181,8 +166,30 @@ func (c completedConfig) New(delegationTarget genericapiserver.DelegationTarget)
181
166
methods = append (methods , m )
182
167
}
183
168
}
169
+ proxy := proxyrest .NewRemoteProxyREST (c .GenericConfig .Serializer , connector )
170
+
171
+ // forward request
172
+ genericserver .Handler .NonGoRestfulMux .HandlePrefix ("/proxy/" , http .StripPrefix ("/proxy" , proxy ))
173
+
174
+ // handle root discovery request
175
+ discoveryHandler := WrapForwardRequestHandler (discoveryManager , proxy )
176
+ genericserver .Handler .NonGoRestfulMux .Handle ("/api" , discoveryHandler )
177
+ genericserver .Handler .NonGoRestfulMux .Handle ("/apis" , discoveryHandler )
184
178
185
- resourceHandler .proxy = proxyrest .NewRemoteProxyREST (c .GenericConfig .Serializer , connector )
179
+ resourceHandler := & ResourceHandler {
180
+ minRequestTimeout : time .Duration (c .GenericConfig .MinRequestTimeout ) * time .Second ,
181
+
182
+ delegate : delegate ,
183
+ proxy : proxy ,
184
+ rest : restManager ,
185
+ discovery : discoveryManager ,
186
+ clusterLister : c .InformerFactory .Cluster ().V1alpha2 ().PediaClusters ().Lister (),
187
+ }
188
+
189
+ genericserver .Handler .NonGoRestfulMux .HandlePrefix ("/api/" , resourceHandler )
190
+ genericserver .Handler .NonGoRestfulMux .HandlePrefix ("/apis/" , resourceHandler )
191
+
192
+ _ = NewClusterResourceController (restManager , discoveryManager , clusterInformer )
186
193
return genericserver , methods , nil
187
194
}
188
195
@@ -228,3 +235,13 @@ func (r wrapRequestInfoResolverForNamespace) NewRequestInfo(req *http.Request) (
228
235
}
229
236
return info , nil
230
237
}
238
+
239
+ func WrapForwardRequestHandler (handler http.Handler , proxy http.Handler ) http.Handler {
240
+ return http .HandlerFunc (func (rw http.ResponseWriter , req * http.Request ) {
241
+ if HasForwardRequestHeader (req ) {
242
+ proxy .ServeHTTP (rw , req )
243
+ return
244
+ }
245
+ handler .ServeHTTP (rw , req )
246
+ })
247
+ }
0 commit comments