1- from typing import Any , Self , Callable
1+ from typing import Any , Self , Callable , TypeAlias
22
33from os import chdir
44from threading import Thread
99
1010from utils .logger import logger
1111
12+ class ActiveServerData :
13+ server : HTTPServer | None
14+ thread : Thread | None
15+
16+ def __init__ (self : Self ) -> None :
17+ logger .log ("Initializing ActiveServerData" )
18+ self .server = None
19+ self .thread = None
20+
21+ def setServer (self : Self , server : HTTPServer ) -> None :
22+ logger .log ("Setting server in ActiveServerData" )
23+ self .server = server
24+
25+ def setThread (self : Self , thread : Thread ) -> None :
26+ logger .log ("Setting thread in ActiveServerData" )
27+ self .thread = thread
28+
29+ active_servers : dict [int , ActiveServerData ] = {}
30+
1231class SilentHandler (SimpleHTTPRequestHandler ):
1332 def __init__ (
1433 self : Self ,
@@ -28,6 +47,8 @@ def host(path: str) -> tuple[int, Thread]:
2847 PORT : int = randint (49152 , 65535 )
2948 logger .log (f"Selected random port: { PORT } " )
3049
50+ active_servers [PORT ] = ActiveServerData ()
51+
3152 def start_server (path : str , port : int ) -> None :
3253 logger .log (f"Starting HTTP server on port: { port } with path: { path } " )
3354
@@ -42,6 +63,7 @@ def start_server(path: str, port: int) -> None:
4263
4364 with HTTPServer (* server_args ) as httpd :
4465 logger .log (f"HTTP server started on port: { port } " )
66+ active_servers [port ].setServer (httpd )
4567 httpd .serve_forever ()
4668
4769 logger .log (f"Creating thread for HTTP server on port: { PORT } " )
@@ -52,7 +74,26 @@ def start_server(path: str, port: int) -> None:
5274 )
5375
5476 logger .log (f"Starting thread for HTTP server on port: { PORT } " )
77+ active_servers [PORT ].setThread (thread )
5578 thread .start ()
5679
5780 return PORT , thread
5881
82+ def close_server (port : int ) -> None :
83+ logger .log (f"Closing server on port: { port } " )
84+ if port not in active_servers :
85+ logger .log (f"No active server found on port: { port } " )
86+ return
87+
88+ server_data = active_servers [port ]
89+ if server_data .server :
90+ server_data .server .shutdown ()
91+ logger .log (f"Server on port { port } has been shut down" )
92+
93+ if server_data .thread :
94+ server_data .thread .join ()
95+ logger .log (f"Thread for port { port } has been joined" )
96+
97+ del active_servers [port ]
98+ logger .log (f"Removed active server data for port: { port } " )
99+
0 commit comments