2
2
Traitlets based configuration for jupyter_server_proxy
3
3
"""
4
4
5
+ from __future__ import annotations
6
+
5
7
import sys
6
8
from textwrap import dedent , indent
7
9
from warnings import warn
@@ -263,60 +265,83 @@ def cats_only(response, path):
263
265
""" ,
264
266
).tag (config = True )
265
267
268
+ def get_proxy_base_class (self ) -> tuple [type | None , dict ]:
269
+ """
270
+ Return the appropriate ProxyHandler Subclass and its kwargs
271
+ """
272
+ if self .command :
273
+ return (
274
+ SuperviseAndRawSocketHandler
275
+ if self .raw_socket_proxy
276
+ else SuperviseAndProxyHandler
277
+ ), dict (state = {})
278
+
279
+ if not (self .port or isinstance (self .unix_socket , str )):
280
+ warn (
281
+ f"""Server proxy { self .name } does not have a command, port number or unix_socket path.
282
+ At least one of these is required."""
283
+ )
284
+ return None , dict ()
285
+
286
+ return (
287
+ RawSocketHandler if self .raw_socket_proxy else NamedLocalProxyHandler
288
+ ), dict ()
266
289
267
- def _make_proxy_handler (sp : ServerProcess ):
268
- """
269
- Create an appropriate handler with given parameters
270
- """
271
- if sp .command :
272
- cls = (
273
- SuperviseAndRawSocketHandler
274
- if sp .raw_socket_proxy
275
- else SuperviseAndProxyHandler
276
- )
277
- args = dict (state = {})
278
- elif not (sp .port or isinstance (sp .unix_socket , str )):
279
- warn (
280
- f"Server proxy { sp .name } does not have a command, port "
281
- f"number or unix_socket path. At least one of these is "
282
- f"required."
283
- )
284
- return
285
- else :
286
- cls = RawSocketHandler if sp .raw_socket_proxy else NamedLocalProxyHandler
287
- args = {}
288
-
289
- # FIXME: Set 'name' properly
290
- class _Proxy (cls ):
291
- kwargs = args
292
-
293
- def __init__ (self , * args , ** kwargs ):
294
- super ().__init__ (* args , ** kwargs )
295
- self .name = sp .name
296
- self .command = sp .command
297
- self .proxy_base = sp .name
298
- self .absolute_url = sp .absolute_url
299
- if sp .command :
300
- self .requested_port = sp .port
301
- self .requested_unix_socket = sp .unix_socket
302
- else :
303
- self .port = sp .port
304
- self .unix_socket = sp .unix_socket
305
- self .mappath = sp .mappath
306
- self .rewrite_response = sp .rewrite_response
307
- self .update_last_activity = sp .update_last_activity
308
-
309
- def get_request_headers_override (self ):
310
- return self ._realize_rendered_template (sp .request_headers_override )
311
-
312
- # these two methods are only used in supervise classes, but do no harm otherwise
313
- def get_env (self ):
314
- return self ._realize_rendered_template (sp .environment )
315
-
316
- def get_timeout (self ):
317
- return sp .timeout
318
-
319
- return _Proxy
290
+ def get_proxy_attributes (self ) -> dict :
291
+ """
292
+ Return the required attributes, which will be set on the proxy handler
293
+ """
294
+ attributes = {
295
+ "name" : self .name ,
296
+ "command" : self .command ,
297
+ "proxy_base" : self .name ,
298
+ "absolute_url" : self .absolute_url ,
299
+ "mappath" : self .mappath ,
300
+ "rewrite_response" : self .rewrite_response ,
301
+ "update_last_activity" : self .update_last_activity ,
302
+ "request_headers_override" : self .request_headers_override ,
303
+ }
304
+
305
+ if self .command :
306
+ attributes ["requested_port" ] = self .port
307
+ attributes ["requested_unix_socket" ] = self .unix_socket
308
+ attributes ["environment" ] = self .environment
309
+ attributes ["timeout" ] = self .timeout
310
+ else :
311
+ attributes ["port" ] = self .port
312
+ attributes ["unix_socket" ] = self .unix_socket
313
+
314
+ return attributes
315
+
316
+ def make_proxy_handler (self ) -> tuple [type | None , dict ]:
317
+ """
318
+ Create an appropriate handler for this ServerProxy Configuration
319
+ """
320
+ cls , proxy_kwargs = self .get_proxy_base_class ()
321
+ if cls is None :
322
+ return None , proxy_kwargs
323
+
324
+ # FIXME: Set 'name' properly
325
+ attributes = self .get_proxy_attributes ()
326
+
327
+ class _Proxy (cls ):
328
+ def __init__ (self , * args , ** kwargs ):
329
+ super ().__init__ (* args , ** kwargs )
330
+
331
+ for name , value in attributes .items ():
332
+ setattr (self , name , value )
333
+
334
+ def get_request_headers_override (self ):
335
+ return self ._realize_rendered_template (self .request_headers_override )
336
+
337
+ # these two methods are only used in supervise classes, but do no harm otherwise
338
+ def get_env (self ):
339
+ return self ._realize_rendered_template (self .environment )
340
+
341
+ def get_timeout (self ):
342
+ return self .timeout
343
+
344
+ return _Proxy , proxy_kwargs
320
345
321
346
322
347
def get_entrypoint_server_processes (serverproxy_config ):
@@ -332,21 +357,21 @@ def get_entrypoint_server_processes(serverproxy_config):
332
357
return sps
333
358
334
359
335
- def make_handlers (base_url , server_processes ):
360
+ def make_handlers (base_url : str , server_processes : list [ ServerProcess ] ):
336
361
"""
337
362
Get tornado handlers for registered server_processes
338
363
"""
339
364
handlers = []
340
- for sp in server_processes :
341
- handler = _make_proxy_handler ( sp )
365
+ for server in server_processes :
366
+ handler , kwargs = server . make_proxy_handler ( )
342
367
if not handler :
343
368
continue
344
- handlers .append ((ujoin (base_url , sp .name , r"(.*)" ), handler , handler . kwargs ))
345
- handlers .append ((ujoin (base_url , sp .name ), AddSlashHandler ))
369
+ handlers .append ((ujoin (base_url , server .name , r"(.*)" ), handler , kwargs ))
370
+ handlers .append ((ujoin (base_url , server .name ), AddSlashHandler ))
346
371
return handlers
347
372
348
373
349
- def make_server_process (name , server_process_config , serverproxy_config ):
374
+ def make_server_process (name : str , server_process_config : dict , serverproxy_config ):
350
375
return ServerProcess (name = name , ** server_process_config )
351
376
352
377
0 commit comments