diff --git a/zerver/management/commands/runtornado.py b/zerver/management/commands/runtornado.py index de3adfe1ad..749f4cc325 100644 --- a/zerver/management/commands/runtornado.py +++ b/zerver/management/commands/runtornado.py @@ -1,6 +1,7 @@ import logging import sys from typing import Any, Callable +from urllib.parse import SplitResult from django.conf import settings from django.core.management.base import BaseCommand, CommandError, CommandParser @@ -58,17 +59,17 @@ class Command(BaseCommand): import django from tornado import httpserver - try: - addr, port = addrport.split(':') - except ValueError: - addr, port = '', addrport + if addrport.isdigit(): + addr, port = "", int(addrport) + else: + r = SplitResult("", addrport, "", "", "") + if r.port is None: + raise CommandError(f"{addrport!r} does not have a valid port number.") + addr, port = r.hostname or "", r.port if not addr: addr = '127.0.0.1' - if not port.isdigit(): - raise CommandError(f"{port!r} is not a valid port number.") - xheaders = options.get('xheaders', True) no_keep_alive = options.get('no_keep_alive', False) @@ -89,13 +90,13 @@ class Command(BaseCommand): if settings.USING_RABBITMQ: queue_client = get_queue_client() # Process notifications received via RabbitMQ - queue_name = notify_tornado_queue_name(int(port)) + queue_name = notify_tornado_queue_name(port) queue_client.register_json_consumer(queue_name, get_wrapped_process_notification(queue_name)) try: # Application is an instance of Django's standard wsgi handler. - application = create_tornado_application(int(port)) + application = create_tornado_application(port) if settings.AUTORELOAD: zulip_autoreload_start() @@ -103,11 +104,11 @@ class Command(BaseCommand): http_server = httpserver.HTTPServer(application, xheaders=xheaders, no_keep_alive=no_keep_alive) - http_server.listen(int(port), address=addr) + http_server.listen(port, address=addr) from zerver.tornado.ioloop_logging import logging_data - logging_data['port'] = port - setup_event_queue(int(port)) + logging_data['port'] = str(port) + setup_event_queue(port) add_client_gc_hook(missedmessage_hook) setup_tornado_rabbitmq() diff --git a/zerver/tornado/sharding.py b/zerver/tornado/sharding.py index b83ecc04cf..230e011095 100644 --- a/zerver/tornado/sharding.py +++ b/zerver/tornado/sharding.py @@ -1,5 +1,6 @@ import json import os +from urllib.parse import urlsplit from django.conf import settings @@ -14,7 +15,9 @@ def get_tornado_port(realm: Realm) -> int: if settings.TORNADO_SERVER is None: return 9993 if settings.TORNADO_PROCESSES == 1: - return int(settings.TORNADO_SERVER.split(":")[-1]) + r = urlsplit(settings.TORNADO_SERVER) + assert r.port is not None + return r.port return shard_map.get(realm.host, 9800) def get_tornado_uri(realm: Realm) -> str: