22Traitlets based configuration for jupyter_server_proxy
33"""
44
5+ from __future__ import annotations
6+
57import sys
68from textwrap import dedent , indent
79from warnings import warn
@@ -263,60 +265,83 @@ def cats_only(response, path):
263265 """ ,
264266 ).tag (config = True )
265267
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 ()
266289
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
320345
321346
322347def get_entrypoint_server_processes (serverproxy_config ):
@@ -332,21 +357,21 @@ def get_entrypoint_server_processes(serverproxy_config):
332357 return sps
333358
334359
335- def make_handlers (base_url , server_processes ):
360+ def make_handlers (base_url : str , server_processes : list [ ServerProcess ] ):
336361 """
337362 Get tornado handlers for registered server_processes
338363 """
339364 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 ( )
342367 if not handler :
343368 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 ))
346371 return handlers
347372
348373
349- def make_server_process (name , server_process_config , serverproxy_config ):
374+ def make_server_process (name : str , server_process_config : dict , serverproxy_config ):
350375 return ServerProcess (name = name , ** server_process_config )
351376
352377
0 commit comments