File: //usr/local/CyberPanel/lib64/python3.10/site-packages/tornado/__pycache__/tcpserver.cpython-310.pyc
o
��h�: � @ s� d Z ddlZddlZddlZddlZddlmZ ddlmZ ddl m
Z
ddlmZm
Z
ddlmZmZmZmZ ddlmZ dd lmZ ddlZdd
lmZmZmZmZmZmZ ejrcddlmZmZ G dd
� d
e �Z!dS )z+A non-blocking, single-threaded TCP server.� N)�gen)�app_log)�IOLoop)�IOStream�SSLIOStream)�bind_sockets�add_accept_handler�ssl_wrap_socket�_DEFAULT_BACKLOG)�process)�errno_from_exception)�Union�Dict�Any�Iterable�Optional� Awaitable)�Callable�Listc @ sZ e Zd ZdZ d'deeeeef e j
f dee dee ddfdd�Zde
jedd fd
edee de
jd
edee deddfdd�Zdee
j
ddfdd�Zde
j
ddfdd�Zde
jedd fd
edee de
jd
edee deddfdd�Z d(dee dee ddfdd�Zd)dd �Zd!ededeed fd"d#�Zd$e
j
deddfd%d&�ZdS )*� TCPServeraN A non-blocking, single-threaded TCP server.
To use `TCPServer`, define a subclass which overrides the `handle_stream`
method. For example, a simple echo server could be defined like this::
from tornado.tcpserver import TCPServer
from tornado.iostream import StreamClosedError
class EchoServer(TCPServer):
async def handle_stream(self, stream, address):
while True:
try:
data = await stream.read_until(b"\n") await
stream.write(data)
except StreamClosedError:
break
To make this server serve SSL traffic, send the ``ssl_options`` keyword
argument with an `ssl.SSLContext` object. For compatibility with older
versions of Python ``ssl_options`` may also be a dictionary of keyword
arguments for the `ssl.SSLContext.wrap_socket` method.::
ssl_ctx = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH)
ssl_ctx.load_cert_chain(os.path.join(data_dir, "mydomain.crt"),
os.path.join(data_dir, "mydomain.key"))
TCPServer(ssl_options=ssl_ctx)
`TCPServer` initialization follows one of three patterns:
1. `listen`: single-process::
async def main():
server = TCPServer()
server.listen(8888)
await asyncio.Event.wait()
asyncio.run(main())
While this example does not create multiple processes on its own, when
the ``reuse_port=True`` argument is passed to ``listen()`` you can run
the program multiple times to create a multi-process service.
2. `add_sockets`: multi-process::
sockets = bind_sockets(8888)
tornado.process.fork_processes(0)
async def post_fork_main():
server = TCPServer()
server.add_sockets(sockets)
await asyncio.Event().wait()
asyncio.run(post_fork_main())
The `add_sockets` interface is more complicated, but it can be used with
`tornado.process.fork_processes` to run a multi-process service with all
worker processes forked from a single parent. `add_sockets` can also be
used in single-process servers if you want to create your listening
sockets in some way other than `~tornado.netutil.bind_sockets`.
Note that when using this pattern, nothing that touches the event loop
can be run before ``fork_processes``.
3. `bind`/`start`: simple **deprecated** multi-process::
server = TCPServer()
server.bind(8888)
server.start(0) # Forks multiple sub-processes
IOLoop.current().start()
This pattern is deprecated because it requires interfaces in the
`asyncio` module that have been deprecated since Python 3.10. Support for
creating multiple processes in the ``start`` method will be removed in a
future version of Tornado.
.. versionadded:: 3.1
The ``max_buffer_size`` argument.
.. versionchanged:: 5.0
The ``io_loop`` argument has been removed.
N�ssl_options�max_buffer_size�read_chunk_size�returnc C s� || _ i | _i | _g | _d| _d| _|| _|| _| j d urUt| j t �rWd| j vr,t
d��tj�
| j d �s>td| j d ��d| j v rYtj�
| j d �s[td| j d ��d S d S d S d S )NF�certfilez%missing key "certfile" in ssl_optionszcertfile "%s" does not exist�keyfilezkeyfile "%s" does not exist)r �_sockets� _handlers�_pending_sockets�_started�_stoppedr r �
isinstance�dict�KeyError�os�path�exists�
ValueError)�selfr r r � r) �G/usr/local/CyberPanel/lib/python3.10/site-packages/tornado/tcpserver.py�__init__| s.
���� zTCPServer.__init__F�port�address�family�backlog�flags�
reuse_portc C s"