§
    ‹Ÿj?  ã                   ó^  — d Z ddlZddlZddlmZ ddlmZmZ ddlm	Z	 ddlm
Z
 ddlmZ ddlmZ dd	lmZ ddlZdd
lmZmZmZmZmZmZmZmZmZ ej        rddlmZ  G d„ deee	j        ¦  «        Z G d„ de	j        ¦  «        Z G d„ d¦  «        Z  G d„ de	j        ¦  «        Z!e	j"        Z#dS )a¼  A non-blocking, single-threaded HTTP server.

Typical applications have little direct interaction with the `HTTPServer`
class except to start a server at the beginning of the process
(and even that is often done indirectly via `tornado.web.Application.listen`).

.. versionchanged:: 4.0

   The ``HTTPRequest`` class that used to live in this module has been moved
   to `tornado.httputil.HTTPServerRequest`.  The old name remains as an alias.
é    N)Ú
native_str)ÚHTTP1ServerConnectionÚHTTP1ConnectionParameters)Úhttputil)Úiostream)Únetutil)Ú	TCPServer)ÚConfigurable)	ÚUnionÚAnyÚDictÚCallableÚListÚTypeÚTupleÚOptionalÚ	Awaitable)ÚSetc                   ó  — e Zd ZdZdededdfd„Z	 	 	 	 	 	 	 	 	 	 	 	 d deej        e	ej
        gdf         f         d	ed
edeeeeef         ej        f                  dee         dedee         dee         dee         dee         dee         dee         deee                  ddfd„Zedee         fd„¦   «         Zedee         fd„¦   «         Zd!d„Zdej        deddfd„Zdedej         dej!        fd„Z"deddfd„Z#dS )"Ú
HTTPServeraã  A non-blocking, single-threaded HTTP server.

    A server is defined by a subclass of `.HTTPServerConnectionDelegate`,
    or, for backwards compatibility, a callback that takes an
    `.HTTPServerRequest` as an argument. The delegate is usually a
    `tornado.web.Application`.

    `HTTPServer` supports keep-alive connections by default
    (automatically for HTTP/1.1, or for HTTP/1.0 when the client
    requests ``Connection: keep-alive``).

    If ``xheaders`` is ``True``, we support the
    ``X-Real-Ip``/``X-Forwarded-For`` and
    ``X-Scheme``/``X-Forwarded-Proto`` headers, which override the
    remote IP and URI scheme/protocol for all requests.  These headers
    are useful when running Tornado behind a reverse proxy or load
    balancer.  The ``protocol`` argument can also be set to ``https``
    if Tornado is run behind an SSL-decoding proxy that does not set one of
    the supported ``xheaders``.

    By default, when parsing the ``X-Forwarded-For`` header, Tornado will
    select the last (i.e., the closest) address on the list of hosts as the
    remote host IP address.  To select the next server in the chain, a list of
    trusted downstream hosts may be passed as the ``trusted_downstream``
    argument.  These hosts will be skipped when parsing the ``X-Forwarded-For``
    header.

    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"))
       HTTPServer(application, ssl_options=ssl_ctx)

    `HTTPServer` initialization follows one of three patterns (the
    initialization methods are defined on `tornado.tcpserver.TCPServer`):

    1. `~tornado.tcpserver.TCPServer.listen`: single-process::

            async def main():
                server = HTTPServer()
                server.listen(8888)
                await asyncio.Event().wait()

            asyncio.run(main())

       In many cases, `tornado.web.Application.listen` can be used to avoid
       the need to explicitly create the `HTTPServer`.

       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. `~tornado.tcpserver.TCPServer.add_sockets`: multi-process::

            sockets = bind_sockets(8888)
            tornado.process.fork_processes(0)
            async def post_fork_main():
                server = HTTPServer()
                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. `~tornado.tcpserver.TCPServer.bind`/`~tornado.tcpserver.TCPServer.start`:
       simple **deprecated** multi-process::

            server = HTTPServer()
            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.

    .. versionchanged:: 4.0
       Added ``decompress_request``, ``chunk_size``, ``max_header_size``,
       ``idle_connection_timeout``, ``body_timeout``, ``max_body_size``
       arguments.  Added support for `.HTTPServerConnectionDelegate`
       instances as ``request_callback``.

    .. versionchanged:: 4.1
       `.HTTPServerConnectionDelegate.start_request` is now called with
       two arguments ``(server_conn, request_conn)`` (in accordance with the
       documentation) instead of one ``(request_conn)``.

    .. versionchanged:: 4.2
       `HTTPServer` is now a subclass of `tornado.util.Configurable`.

    .. versionchanged:: 4.5
       Added the ``trusted_downstream`` argument.

    .. versionchanged:: 5.0
       The ``io_loop`` argument has been removed.
    ÚargsÚkwargsÚreturnNc                 ó   — d S ©N© )Úselfr   r   s      ú_/var/www/finuniver-perm.ru/html/student/venv/lib/python3.11/site-packages/tornado/httpserver.pyÚ__init__zHTTPServer.__init__œ   s	   € ð 	ˆó    FÚrequest_callbackÚno_keep_aliveÚxheadersÚssl_optionsÚprotocolÚdecompress_requestÚ
chunk_sizeÚmax_header_sizeÚidle_connection_timeoutÚbody_timeoutÚmax_body_sizeÚmax_buffer_sizeÚtrusted_downstreamc           	      óÎ   — || _         || _        || _        t          ||||	pd||
|¬¦  «        | _        t          j        | |||¬¦  «         t          ¦   «         | _        || _	        d S )Ni  )Ú
decompressr'   r(   Úheader_timeoutr+   r*   r"   )r$   r,   Úread_chunk_size)
r!   r#   r%   r   Úconn_paramsr	   r   ÚsetÚ_connectionsr-   )r   r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   s                 r   Ú
initializezHTTPServer.initialize¤   s�   € ð. !1ˆÔØ ˆŒØ ˆŒÝ4Ø)Ø!Ø+Ø2Ð:°dØ'Ø%Ø'ð
ñ 
ô 
ˆÔõ 	ÔØØ#Ø+Ø&ð		
ñ 	
ô 	
ð 	
õ  ™EœEˆÔØ"4ˆÔÐÐr    c                 ó   — t           S r   ©r   ©Úclss    r   Úconfigurable_basezHTTPServer.configurable_baseÐ   ó   € åÐr    c                 ó   — t           S r   r7   r8   s    r   Úconfigurable_defaultzHTTPServer.configurable_defaultÔ   r;   r    c              ƒ   ó    K  — | j         rDt          t          | j         ¦  «        ¦  «        }|                     ¦   «         ƒ d{V —† | j         °BdS dS )a&  Close all open connections and asynchronously wait for them to finish.

        This method is used in combination with `~.TCPServer.stop` to
        support clean shutdowns (especially for unittests). Typical
        usage would call ``stop()`` first to stop accepting new
        connections, then ``await close_all_connections()`` to wait for
        existing connections to finish.

        This method does not currently close open websocket connections.

        Note that this method is a coroutine and must be called with ``await``.

        N)r4   ÚnextÚiterÚclose)r   Úconns     r   Úclose_all_connectionsz HTTPServer.close_all_connectionsØ   sl   è è € ð Ôð 	å�˜TÔ.Ñ/Ô/Ñ0Ô0ˆDØ—*’*‘,”,ÐÐÐÐÐÐÐð Ôð 	ð 	ð 	ð 	ð 	r    ÚstreamÚaddressc                 óÈ   — t          ||| j        | j        ¦  «        }t          || j        |¦  «        }| j                             |¦  «         |                     | ¦  «         d S r   )Ú_HTTPRequestContextr%   r-   r   r2   r4   ÚaddÚstart_serving)r   rD   rE   ÚcontextrB   s        r   Úhandle_streamzHTTPServer.handle_streamë   sf   € Ý%Ø�G˜Tœ]¨DÔ,Cñ
ô 
ˆõ % V¨TÔ-=¸wÑGÔGˆØÔ×Ò˜dÑ#Ô#Ð#Ø×Ò˜4Ñ Ô Ð Ð Ð r    Úserver_connÚrequest_connc                 óÔ   — t          | j        t          j        ¦  «        r| j                             ||¦  «        }nt          | j        |¦  «        }| j        rt          ||¦  «        }|S r   )Ú
isinstancer!   r   ÚHTTPServerConnectionDelegateÚstart_requestÚ_CallableAdapterr#   Ú_ProxyAdapter)r   rL   rM   Údelegates       r   rQ   zHTTPServer.start_requestó   sg   € õ �dÔ+­XÔ-RÑSÔSð 	MØÔ,×:Ò:¸;ÈÑUÔUˆHˆHå'¨Ô(=¸|ÑLÔLˆHàŒ=ð 	=Ý$ X¨|Ñ<Ô<ˆHàˆr    c                 ój   — | j                              t          j        t          |¦  «        ¦  «         d S r   )r4   ÚremoveÚtypingÚcastr   )r   rL   s     r   Úon_closezHTTPServer.on_close   s,   € ØÔ× Ò ¥¤Õ-BÀKÑ!PÔ!PÑQÔQÐQÐQÐQr    )FFNNFNNNNNNN©r   N)$Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   rP   r   ÚHTTPServerRequestÚboolr   r   ÚstrÚsslÚ
SSLContextÚintÚfloatr   r5   Úclassmethodr   r
   r:   r=   rC   r   ÚIOStreamr   rK   ÚobjectÚHTTPConnectionÚHTTPMessageDelegaterQ   rY   r   r    r   r   r   .   si  € € € € € ðkð kðZ˜cð ¨Sð °Tð ð ð ð ð $ØØGKØ"&Ø#(Ø$(Ø)-Ø37Ø(,Ø'+Ø)-Ø26ð#*5ð *5àØÔ1Ø�hÔ0Ð1°4Ð7Ô8ð:ô
ð*5ð ð*5ð ð*5ð ˜e D¨¨c¨¤N°C´NÐ$BÔCÔDð*5ð ˜3”-ð*5ð !ð*5ð ˜S”Mð*5ð " #œð*5ð "*¨%¤ð*5ð ˜u”oð*5ð   ”}ð*5ð  " #œð!*5ð" % T¨#¤YÔ/ð#*5ð$ 
ð%*5ð *5ð *5ð *5ðX ð $ |Ô"4ð ð ð ñ „[ðð ð T¨,Ô%7ð ð ð ñ „[ððð ð ð ð&! HÔ$5ð !Àð !È$ð !ð !ð !ð !ðØ!ðØ19Ô1Hðà	Ô	%ðð ð ð ðR Fð R¨tð Rð Rð Rð Rð Rð Rr    r   c                   óÚ   — e Zd Zdeej        gdf         dej        ddfd„Zdeej	        ej
        f         dej        deed                  fd„Zd	edeed                  fd
„Zdd„Zdd„ZdS )rR   r!   NrM   r   c                 óL   — || _         || _        d | _        d | _        g | _        d S r   )Ú
connectionr!   ÚrequestrT   Ú_chunks)r   r!   rM   s      r   r   z_CallableAdapter.__init__  s,   € ð
 'ˆŒØ 0ˆÔØˆŒØˆŒØˆŒˆˆr    Ú
start_lineÚheadersc                 ó‚   — t          j        | j        t          j        t           j        |¦  «        |¬¦  «        | _        d S )N)rm   rp   rq   )r   r_   rm   rW   rX   ÚRequestStartLinern   ©r   rp   rq   s      r   Úheaders_receivedz!_CallableAdapter.headers_received  s>   € õ
  Ô1Ø”Ý”{¥8Ô#<¸jÑIÔIØð
ñ 
ô 
ˆŒð
 ˆtr    Úchunkc                 ó:   — | j                              |¦  «         d S r   )ro   Úappend©r   rv   s     r   Údata_receivedz_CallableAdapter.data_received  s   € ØŒ×Ò˜EÑ"Ô"Ð"Øˆtr    c                 óÆ   — | j         €J ‚d                     | j        ¦  «        | j         _        | j                              ¦   «          |                      | j         ¦  «         d S )Nr    )rn   Újoinro   ÚbodyÚ_parse_bodyr!   ©r   s    r   Úfinishz_CallableAdapter.finish   sX   € ØŒ|Ð'Ð'Ð'ØŸHšH T¤\Ñ2Ô2ˆŒÔØŒ× Ò Ñ"Ô"Ð"Ø×Ò˜dœlÑ+Ô+Ð+Ð+Ð+r    c                 ó
   — | ` d S r   )ro   r   s    r   Úon_connection_closez$_CallableAdapter.on_connection_close&  s   € ØˆLˆLˆLr    rZ   )r[   r\   r]   r   r   r_   ri   r   r   rs   ÚResponseStartLineÚHTTPHeadersr   r   ru   Úbytesrz   r€   r‚   r   r    r   rR   rR     sö   € € € € € ð	à" HÔ$>Ð#?ÀÐ#EÔFð	ð Ô-ð	ð 
ð		ð 	ð 	ð 	ð
à˜(Ô3°XÔ5OÐOÔPð
ð Ô%ð
ð 
�)˜D”/Ô	"ð	
ð 
ð 
ð 
ð 5ð ¨X°iÀ´oÔ-Fð ð ð ð ð,ð ,ð ,ð ,ðð ð ð ð ð r    rR   c                   óŠ   — e Zd Z	 ddej        dedee         deee                  ddf
d„Z	defd„Z
d	ej        ddfd
„Zdd„ZdS )rG   NrD   rE   r%   r-   r   c                 ó‚  — || _         |j        �|j        j        | _        nd | _        | j        t          j        t          j        fv r|�|d         | _        nd| _        |r|| _        n)t          |t          j
        ¦  «        rd| _        nd| _        | j        | _        | j        | _        t          |pg ¦  «        | _        d S )Nr   z0.0.0.0ÚhttpsÚhttp)rE   ÚsocketÚfamilyÚaddress_familyÚAF_INETÚAF_INET6Ú	remote_ipr%   rO   r   ÚSSLIOStreamÚ_orig_remote_ipÚ_orig_protocolr3   r-   )r   rD   rE   r%   r-   s        r   r   z_HTTPRequestContext.__init__+  sÈ   € ð ˆŒð Œ=Ð$Ø"(¤-Ô"6ˆDÔÐà"&ˆDÔð Ô¥F¤NµF´OÐ#DÐDÐDØÐ#à$ QœZˆDŒNˆNð 'ˆDŒNØð 	#Ø$ˆDŒMˆMÝ˜¥Ô 4Ñ5Ô5ð 	#Ø#ˆDŒMˆMà"ˆDŒMØ#œ~ˆÔØ"œmˆÔÝ"%Ð&8Ð&>¸BÑ"?Ô"?ˆÔÐÐr    c                 óÒ   — | j         t          j        t          j        fv r| j        S t          | j        t          ¦  «        rt          | j        ¦  «        S t          | j        ¦  «        S r   )
rŒ   rŠ   r�   rŽ   r�   rO   rE   r…   r   ra   r   s    r   Ú__str__z_HTTPRequestContext.__str__M  sW   € ØÔ¥6¤>µ6´?Ð"CÐCÐCØ”>Ð!Ý˜œ¥eÑ,Ô,ð 	%õ ˜dœlÑ+Ô+Ð+å�t”|Ñ$Ô$Ð$r    rq   c                 óè  — |                      d| j        ¦  «        }d„ t          |                     d¦  «        ¦  «        D ¦   «         D ]}|| j        vr nŒ|                      d|¦  «        }t          j        |¦  «        r|| _        |                      d|                      d| j        ¦  «        ¦  «        }|r-|                     d¦  «        d                              ¦   «         }|dv r	|| _        d	S d	S )
z2Rewrite the ``remote_ip`` and ``protocol`` fields.zX-Forwarded-Forc              3   ó>   K  — | ]}|                      ¦   «         V — Œd S r   )Ústrip)Ú.0Úcands     r   ú	<genexpr>z6_HTTPRequestContext._apply_xheaders.<locals>.<genexpr>]  s*   è è € ÐDÐD D�4—:’:‘<”<ÐDÐDÐDÐDÐDÐDr    ú,z	X-Real-IpzX-SchemezX-Forwarded-Protoéÿÿÿÿ)r‰   rˆ   N)	Úgetr�   ÚreversedÚsplitr-   r   Úis_valid_ipr%   r—   )r   rq   ÚipÚproto_headers       r   Ú_apply_xheadersz#_HTTPRequestContext._apply_xheadersX  s  € ð �[Š[Ð*¨D¬NÑ;Ô;ˆàDÐD­H°R·X²X¸c±]´]Ñ,CÔ,CÐDÑDÔDð 	ð 	ˆBØ˜Ô0Ð0Ð0Ø�ð 1à�[Š[˜ bÑ)Ô)ˆÝÔ˜rÑ"Ô"ð 	 ØˆDŒNà—{’{Ø˜ŸšÐ$7¸¼ÑGÔGñ
ô 
ˆð ð 	?ð (×-Ò-¨cÑ2Ô2°2Ô6×<Ò<Ñ>Ô>ˆLØÐ,Ð,Ð,Ø(ˆDŒMˆMˆMð -Ð,r    c                 ó6   — | j         | _        | j        | _        dS )z›Undo changes from `_apply_xheaders`.

        Xheaders are per-request so they should not leak to the next
        request on the same connection.
        N)r‘   r�   r’   r%   r   s    r   Ú_unapply_xheadersz%_HTTPRequestContext._unapply_xheadersn  s   € ð Ô-ˆŒØÔ+ˆŒˆˆr    r   rZ   )r[   r\   r]   r   rg   r   r   ra   r   r   r”   r   r„   r£   r¥   r   r    r   rG   rG   *  sÑ   € € € € € ð 37ð @ð  @àÔ!ð @ð ð @ð ˜3”-ð	 @ð
 % T¨#¤YÔ/ð @ð 
ð @ð  @ð  @ð  @ðD	%˜ð 	%ð 	%ð 	%ð 	%ð) xÔ';ð )Àð )ð )ð )ð )ð,,ð ,ð ,ð ,ð ,ð ,r    rG   c                   óÐ   — e Zd Zdej        dej        ddfd„Zdeej        ej	        f         dej
        deed                  fd„Zd	edeed                  fd
„Zdd„Zdd„Zdd„ZdS )rS   rT   rM   r   Nc                 ó"   — || _         || _        d S r   )rm   rT   )r   rT   rM   s      r   r   z_ProxyAdapter.__init__y  s   € ð
 'ˆŒØ ˆŒˆˆr    rp   rq   c                 óv   — | j         j                             |¦  «         | j                             ||¦  «        S r   )rm   rJ   r£   rT   ru   rt   s      r   ru   z_ProxyAdapter.headers_received�  s5   € ð 	ŒÔ×/Ò/°Ñ8Ô8Ð8ØŒ}×-Ò-¨j¸'ÑBÔBÐBr    rv   c                 ó6   — | j                              |¦  «        S r   )rT   rz   ry   s     r   rz   z_ProxyAdapter.data_received‹  s   € ØŒ}×*Ò*¨5Ñ1Ô1Ð1r    c                 ó`   — | j                              ¦   «          |                      ¦   «          d S r   )rT   r€   Ú_cleanupr   s    r   r€   z_ProxyAdapter.finishŽ  s'   € ØŒ×ÒÑÔÐØ�Š‰Œˆˆˆr    c                 ó`   — | j                              ¦   «          |                      ¦   «          d S r   )rT   r‚   r«   r   s    r   r‚   z!_ProxyAdapter.on_connection_close’  s'   € ØŒ×)Ò)Ñ+Ô+Ð+Ø�Š‰Œˆˆˆr    c                 óB   — | j         j                             ¦   «          d S r   )rm   rJ   r¥   r   s    r   r«   z_ProxyAdapter._cleanup–  s   € ØŒÔ×1Ò1Ñ3Ô3Ð3Ð3Ð3r    rZ   )r[   r\   r]   r   rj   ri   r   r   rs   rƒ   r„   r   r   ru   r…   rz   r€   r‚   r«   r   r    r   rS   rS   x  s  € € € € € ð!àÔ.ð!ð Ô-ð!ð 
ð	!ð !ð !ð !ðCà˜(Ô3°XÔ5OÐOÔPðCð Ô%ðCð 
�)˜D”/Ô	"ð	Cð Cð Cð Cð2 5ð 2¨X°iÀ´oÔ-Fð 2ð 2ð 2ð 2ðð ð ð ðð ð ð ð4ð 4ð 4ð 4ð 4ð 4r    rS   )$r^   rŠ   rb   Útornado.escaper   Útornado.http1connectionr   r   Útornador   r   r   Útornado.tcpserverr	   Útornado.utilr
   rW   r   r   r   r   r   r   r   r   r   ÚTYPE_CHECKINGr   rP   r   rj   rR   rG   rS   r_   ÚHTTPRequestr   r    r   ú<module>rµ      sì  ðð 
ð 
ð €€€Ø 
€
€
€
à %Ð %Ð %Ð %Ð %Ð %Ø TÐ TÐ TÐ TÐ TÐ TÐ TÐ TØ Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø 'Ð 'Ð 'Ð 'Ð 'Ð 'Ø %Ð %Ð %Ð %Ð %Ð %à €€€Ø UÐ UÐ UÐ UÐ UÐ UÐ UÐ UÐ UÐ UÐ UÐ UÐ UÐ UÐ UÐ UÐ UÐ UÐ UÐ UÐ UÐ Uà	Ôð ØÐÐÐÐÐðSRð SRð SRð SRð SR�˜L¨(Ô*Oñ SRô SRð SRðl#ð #ð #ð #ð #�xÔ3ñ #ô #ð #ðLK,ð K,ð K,ð K,ð K,ñ K,ô K,ð K,ð\4ð 4ð 4ð 4ð 4�HÔ0ñ 4ô 4ð 4ðD Ô(€€€r    