Find an available port starting from start_port. Skips ports that browsers block for security reasons.
(start_port: int, host: str = "127.0.0.1")
| 43 | |
| 44 | |
| 45 | def find_available_port(start_port: int, host: str = "127.0.0.1") -> int: |
| 46 | """Find an available port starting from start_port. |
| 47 | |
| 48 | Skips ports that browsers block for security reasons. |
| 49 | """ |
| 50 | port = start_port |
| 51 | while port < start_port + 100: |
| 52 | if port in UNSAFE_PORTS: |
| 53 | port += 1 |
| 54 | continue |
| 55 | with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: |
| 56 | try: |
| 57 | s.bind((host, port)) |
| 58 | return port |
| 59 | except OSError: |
| 60 | port += 1 |
| 61 | raise RuntimeError( |
| 62 | f"No available port found in range {start_port}-{start_port + 99}" |
| 63 | ) |
| 64 | |
| 65 | |
| 66 | # ============================================================================= |