44from jupyter_server .utils import url_path_join as ujoin
55from tornado import web
66
7- from .manager import manager
8-
97
108class ServersInfoHandler (JupyterHandler ):
119 def initialize (self , server_processes ):
@@ -36,8 +34,9 @@ async def get(self):
3634 self .write ({"server_processes" : data })
3735
3836
39- # Took it from JupyterHub LogoHandler
40- class IconHandler (web .StaticFileHandler ):
37+ # IconHandler has been copied from JupyterHub's IconHandler:
38+ # https://github.com/jupyterhub/jupyterhub/blob/4.0.0b2/jupyterhub/handlers/static.py#L22-L31
39+ class ServersIconHandler (web .StaticFileHandler ):
4140 """A singular handler for serving the icon."""
4241
4342 def get (self ):
@@ -52,13 +51,22 @@ def get_absolute_path(cls, root, path):
5251
5352
5453class ServersAPIHandler (JupyterHandler ):
55- """Handler to get metadata or terminate of a given server"""
54+ """Handler to get metadata or terminate of a given server or all servers"""
55+
56+ def initialize (self , manager ):
57+ self .manager = manager
5658
5759 @web .authenticated
5860 async def delete (self , name ):
5961 """Delete a server proxy by name"""
62+ if not name :
63+ raise web .HTTPError (
64+ 403 , "Please set the name of a running server proxy that "
65+ "user wishes to terminate"
66+ )
67+
6068 try :
61- val = await manager .terminate_server_proxy_app (name )
69+ val = await self . manager .terminate_server_proxy_app (name )
6270 if val is None :
6371 raise Exception (
6472 f"Proxy { name } not found. Are you sure the { name } "
@@ -73,17 +81,48 @@ async def delete(self, name):
7381 @web .authenticated
7482 async def get (self , name ):
7583 """Get meta data of a running server proxy"""
76- app = manager .get_server_proxy_app (name )
84+ if name :
85+ apps = self .manager .get_server_proxy_app (name )._asdict ()
86+ # If no server proxy found this will be a dict with empty values
87+ if not apps ['name' ]:
88+ raise web .HTTPError (
89+ 404 , f"Server proxy { name } not found"
90+ )
91+ else :
92+ apps = [app ._asdict () for app in self .manager .list_server_proxy_apps ()]
93+
7794 self .set_status (200 )
78- self .finish (json .dumps (app . _asdict () ))
95+ self .finish (json .dumps (apps ))
7996
8097
81- class ListServersAPIHandler (JupyterHandler ):
82- """Handler to list all running server proxies"""
98+ def setup_api_handlers (web_app , manager , server_processes ):
99+ base_url = web_app .settings ["base_url" ]
100+
101+ # Make a list of icon handlers
102+ icon_handlers = []
103+ for sp in server_processes :
104+ if sp .launcher_entry .enabled and sp .launcher_entry .icon_path :
105+ icon_handlers .append (
106+ (
107+ ujoin (base_url , f"server-proxy/icon/{ sp .name } " ),
108+ ServersIconHandler ,
109+ {"path" : sp .launcher_entry .icon_path },
110+ )
111+ )
112+
113+ web_app .add_handlers (
114+ ".*" ,
115+ [
116+ (
117+ ujoin (base_url , "server-proxy/api/servers-info" ),
118+ ServersInfoHandler ,
119+ {"server_processes" : server_processes },
120+ ),
121+ (
122+ ujoin (base_url , r"server-proxy/api/servers/(?P<name>.*)" ),
123+ ServersAPIHandler ,
124+ {"manager" : manager }
125+ ),
126+ ] + icon_handlers
127+ )
83128
84- @web .authenticated
85- async def get (self ):
86- """list running servers"""
87- apps = manager .list_server_proxy_apps ()
88- self .set_status (200 )
89- self .finish (json .dumps ([app ._asdict () for app in apps ]))
0 commit comments