1#!/usr/bin/env python3
2
3import argparse
4import logging
5import os
6import sys
7from typing import Any
8
9_dir = os.path.dirname(__file__)
10
11
12def get_parser() -> argparse.ArgumentParser:
13    parser = argparse.ArgumentParser(description='QUIC server')
14    parser.add_argument(
15        '-c',
16        '--certificate',
17        type=str,
18        default=os.path.join(_dir, 'certs', 'cert.pem'),
19        help='load the TLS certificate from the specified file',
20    )
21    parser.add_argument(
22        '--host',
23        type=str,
24        default='::',
25        help='listen on the specified address (defaults to ::)',
26    )
27    parser.add_argument(
28        '--port',
29        type=int,
30        default=4433,
31        help='listen on the specified port (defaults to 4433)',
32    )
33    parser.add_argument(
34        '-k',
35        '--private-key',
36        type=str,
37        default=os.path.join(_dir, 'certs', 'cert.key'),
38        help='load the TLS private key from the specified file',
39    )
40    parser.add_argument(
41        '--handlers-path',
42        type=str,
43        default=os.path.join(
44            _dir, '..', '..', 'webtransport', 'quic', 'handlers'),
45        help='the directory path of QuicTransport event handlers',
46    )
47    parser.add_argument(
48        '-v',
49        '--verbose',
50        action='store_true',
51        help='increase logging verbosity'
52    )
53    return parser
54
55
56def run(venv: Any, **kwargs: Any) -> None:
57    # The venv argument is passed with `wpt serve-quic-transport` but is unused.
58    assert sys.version_info.major == 3, 'QUIC server only runs in Python 3'
59    logging.basicConfig(
60        format='%(asctime)s %(levelname)s %(name)s %(message)s',
61        level=logging.DEBUG if kwargs.get('verbose') else logging.INFO,
62    )
63
64    # Delay import after version check to make the error easier to understand.
65    from .quic_transport_server import start
66    start(**kwargs)
67
68
69def main() -> None:
70    # This is only used when executing the script directly. Users are
71    # responsible for managing venv themselves. `wpt serve-quic-transport` does
72    # NOT use this code path.
73    kwargs = vars(get_parser().parse_args())
74    run(None, **kwargs)
75
76
77if __name__ == '__main__':
78    main()
79