|  |  | @ -88,23 +88,28 @@ def read_segment_list(segment_list_path): | 
			
		
	
		
		
			
				
					
					|  |  |  |   return [(platform[2:], segment) for platform, segment in zip(seg_list[::2], seg_list[1::2], strict=True)] |  |  |  |   return [(platform[2:], segment) for platform, segment in zip(seg_list[::2], seg_list[1::2], strict=True)] | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | @contextlib.contextmanager | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | def http_server_context(handler, setup=None): | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   host = '127.0.0.1' | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   server = http.server.HTTPServer((host, 0), handler) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   port = server.server_port | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   t = threading.Thread(target=server.serve_forever) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   t.start() | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   if setup is not None: | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     setup(host, port) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   try: | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     yield (host, port) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   finally: | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     server.shutdown() | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     server.server_close() | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     t.join() | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | def with_http_server(func, handler=http.server.BaseHTTPRequestHandler, setup=None): |  |  |  | def with_http_server(func, handler=http.server.BaseHTTPRequestHandler, setup=None): | 
			
		
	
		
		
			
				
					
					|  |  |  |   @wraps(func) |  |  |  |   @wraps(func) | 
			
		
	
		
		
			
				
					
					|  |  |  |   def inner(*args, **kwargs): |  |  |  |   def inner(*args, **kwargs): | 
			
		
	
		
		
			
				
					
					|  |  |  |     host = '127.0.0.1' |  |  |  |     with http_server_context(handler, setup) as (host, port): | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |     server = http.server.HTTPServer((host, 0), handler) |  |  |  |       return func(*args, f"http://{host}:{port}", **kwargs) | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |     port = server.server_port |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     t = threading.Thread(target=server.serve_forever) |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     t.start() |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     if setup is not None: |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |       setup(host, port) |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     try: |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |       return func(*args, f'http://{host}:{port}', **kwargs) |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     finally: |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |       server.shutdown() |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |       server.server_close() |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |       t.join() |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  |   return inner |  |  |  |   return inner | 
			
		
	
	
		
		
			
				
					|  |  | 
 |