U
    /v¶h³›  ã                   @  s|  U d Z ddlmZ ddlZddlZddlZddlZddlZddlZddl	Z	ddl
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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 z"ddlZeejej fZ!de"d< W n4 e#k
�r,   G dd„ dƒZ$e$ƒ ZeejfZ!Y nX dZ%ej&dk�rfze'dƒ W n e#k
�rd   dZ%Y nX e(edƒZ)e)�r~ej*Z*nG dd„ dƒZ*z
ej+Z,W n e-k
�r°   dZ,Y nX dZ.ej/ej0dej1e2ej/e2 f ej3d f  Z4ej5�rddl6m7Z7 ddl6m8Z8 dd l9m:Z: dd!l;m<Z< G d"d#„ d#ej=ƒZ>G d$d%„ d%eƒZ?d&d&d&d'œd(d)„Z@d`d*d+d,œd-d.„ZAdad&d*d*d/d0œd1d2„ZBdd3œd4d5„ZCdbd&d*d6dd7œd8d9„ZDdcd:d;d<œd=d>„ZEd&d?d@dAœdBdC„ZFd&d?d@dDdEœdFdG„ZGd@d&dHœdIdJ„ZHG dKdL„ dLeƒZIG dMdN„ dNejJeIƒZKG dOdP„ dPe*eIƒZLddd&d?dQd;d?dRd;dSd6dLdTœ
dUdV„ZMd;d3œdWdX„ZNded&d?dQd;d;d;dZdZd?d&d;d?dRd[d;dSd\d]œd^d_„ZOdS )faØ  A WSGI and HTTP server for use **during development only**. This
server is convenient to use, but is not designed to be particularly
stable, secure, or efficient. Use a dedicate WSGI server and HTTP
server when deploying to production.

It provides features like interactive debugging and code reloading. Use
``run_simple`` to start the server. Put this in a ``run.py`` script:

.. code-block:: python

    from myapp import create_app
    from werkzeug import run_simple
é    )ÚannotationsN)Údatetime)Ú	timedelta)Útimezone)ÚBaseHTTPRequestHandler)Ú
HTTPServer)Úunquote)Úurlsplité   ©Ú_log)Ú_wsgi_encoding_dance)ÚInternalServerError)Ú
uri_to_iriztuple[type[Exception], ...]Úconnection_dropped_errorsc                   @  s   e Zd Zdddœdd„ZdS )Ú	_SslDummyÚstrút.Any©ÚnameÚreturnc                 C  s   t dƒ‚d S )NzUSSL is unavailable because this Python runtime was not compiled with SSL/TLS support.)ÚRuntimeError©Úselfr   © r   ú4/tmp/pip-unpacked-wheel-c3xdgso7/werkzeug/serving.pyÚ__getattr__1   s    ÿz_SslDummy.__getattr__N)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r   0   s   r   TÚntÚcoloramaFÚforkc                   @  s   e Zd ZdS )ÚForkingMixInN)r   r   r   r   r   r   r   r#   H   s   r#   é€   zssl.SSLContextÚadhoc)ÚWSGIApplication)ÚWSGIEnvironment)ÚRSAPrivateKeyWithSerialization)ÚCertificatec                   @  sL   e Zd ZdZdddœdd„Zddœd	d
„Zddœdd„Zdddœdd„ZdS )ÚDechunkedInputz8An input stream that handles Transfer-Encoding 'chunked'zt.IO[bytes]ÚNone)Úrfiler   c                 C  s   || _ d| _d| _d S )NFr   )Ú_rfileÚ_doneÚ_len)r   r,   r   r   r   Ú__init__c   s    zDechunkedInput.__init__Úbool©r   c                 C  s   dS )NTr   ©r   r   r   r   Úreadableh   s    zDechunkedInput.readableÚintc              
   C  sd   z"| j  ¡  d¡}t| ¡ dƒ}W n, tk
rN } ztdƒ|‚W 5 d }~X Y nX |dk r`tdƒ‚|S )NÚlatin1é   zInvalid chunk headerr   z!Negative chunk length not allowed)r-   ÚreadlineÚdecoder5   ÚstripÚ
ValueErrorÚOSError)r   Úliner/   Úer   r   r   Úread_chunk_lenk   s    zDechunkedInput.read_chunk_lenÚ	bytearray)Úbufr   c                 C  sø   d}| j sô|t|ƒk rô| jdkr*|  ¡ | _| jdkr:d| _ | jdkrÎtt|ƒ| jƒ}|| t|ƒkr | j t|ƒ| ¡||d …< |  jt|ƒ| 8  _t|ƒ}n.| j |¡|||| …< |  j|8  _||7 }| jdkr| j ¡ }|dkrtdƒ‚q|S )Nr   T)ó   
ó   
ó   z!Missing chunk terminating newline)	r.   Úlenr/   r?   Úminr-   Úreadr8   r<   )r   rA   rG   ÚnÚ
terminatorr   r   r   Úreadintou   s(    







zDechunkedInput.readintoN)r   r   r   Ú__doc__r0   r4   r?   rJ   r   r   r   r   r*   `   s
   
r*   c                      s  e Zd ZU dZded< eddœdd„ƒZddœd	d
„Zddœdd„Zddœ‡ fdd„Z	d3ddddœdd„Z
dddœ‡ fdd„Zddœdd„Zddœdd„Ze dd „ ed!ƒed"d#ƒ•D ƒ¡Zd$eed%ƒ< d4d'd'dd(œd)d*„Zdddd+œd,d-„Zdddd+œd.d/„Zddddd0œd1d2„Z‡  ZS )5ÚWSGIRequestHandlerz3A request handler that implements WSGI dispatching.ÚBaseWSGIServerÚserverr   r2   c                 C  s   | j jS ©N)rN   Ú_server_versionr3   r   r   r   Úserver_version£   s    z!WSGIRequestHandler.server_versionr'   c                 C  s  t | jƒ}| jjd krdnd}| js,d| _nt| jtƒrD| jdf| _|jsd|jrdd|j› |j› �}n|j}t	|ƒ}d|| j
tj| jj| jjd| j| j| jdt|ƒt|jƒt| jƒt| jƒ|  ¡ |  ¡ | jjd t| jjd	 ƒ| jd
œ}| j ¡ D ]h\}}d|k�rqð| ¡  dd¡}| dd¡}|dk�rPd|› �}||k�rP|| › d|› �}|||< qð| dd¡ ¡  ¡ dk�rŒd|d< t|d ƒ|d< |j�r¦|j�r¦|j|d< z*| jj dd�}|d k	�rÎt! "|¡|d< W n8 t#k
�rô   | j $dd¡ Y n t%k
�r   Y nX |S )NÚhttpÚhttps)ú<local>r   r   ú/)r
   r   FÚ r
   )zwsgi.versionzwsgi.url_schemeú
wsgi.inputzwsgi.errorszwsgi.multithreadzwsgi.multiprocesszwsgi.run_oncezwerkzeug.socketÚSERVER_SOFTWAREÚREQUEST_METHODZSCRIPT_NAMEZ	PATH_INFOÚQUERY_STRINGZREQUEST_URIZRAW_URIÚREMOTE_ADDRZREMOTE_PORTZSERVER_NAMEZSERVER_PORTZSERVER_PROTOCOLÚ_ú-z
)ÚCONTENT_TYPEÚCONTENT_LENGTHZHTTP_ú,ZHTTP_TRANSFER_ENCODINGÚchunkedTzwsgi.input_terminatedrW   Z	HTTP_HOST)Úbinary_formZSSL_CLIENT_CERTÚerrorz&Cannot fetch SSL peer certificate info)&r	   ÚpathrN   Ússl_contextÚclient_addressÚ
isinstancer   ÚschemeÚnetlocr   r,   ÚsysÚstderrÚmultithreadÚmultiprocessÚ
connectionrQ   Úcommandr   ÚqueryÚaddress_stringÚport_integerÚserver_addressÚrequest_versionÚheadersÚitemsÚupperÚreplaceÚgetr:   Úlowerr*   ÚgetpeercertÚsslÚDER_cert_to_PEM_certr;   ÚlogÚAttributeError)r   Úrequest_urlZ
url_schemeZ	path_infoÚenvironÚkeyÚvalueZ	peer_certr   r   r   Úmake_environ§   sn    

ê






zWSGIRequestHandler.make_environr+   c                   s„  ˆj  dd¡ ¡  ¡ dkr&ˆj d¡ ˆ ¡  ˆ_‰d ‰d ‰d ‰d ‰d‰ dddœ‡ ‡‡‡‡‡‡fd	d
„‰d‡‡‡‡fdd„	‰dddœ‡ ‡‡‡‡‡fdd„}z|ˆjj	ƒ W nÔ t
k
rØ } zˆ |ˆ¡ W 5 d }~X Y n¨ tk
�r~ } zˆˆjjrô‚ ˆd k	�r
ˆ �r
dˆ_z ˆd k�rd ‰d ‰|tƒ ƒ W n tk
�r@   Y nX ddlm} ||ƒ ¡ }ˆj dd|› �¡ W 5 d }~X Y nX d S )NZExpectrV   z100-continues   HTTP/1.1 100 Continue

FÚbytesr+   )Údatar   c                   s€  ˆd k	st dƒ‚ˆd k	s t dƒ‚ˆd k�rˆ‰ˆ‰zˆ d d¡\}}W n tk
rd   ˆd }}Y nX t|ƒ}ˆ ||¡ tƒ }ˆD ]"\}}ˆ ||¡ | | ¡ ¡ q„d|ksôˆd dksôd|  krÐdk sôn |d	ksôˆj	d
krôd‰ ˆ dd¡ ˆ dd¡ ˆ 
¡  t| tƒ�st dƒ‚| �rrˆ �rTˆj tt| ƒƒdd …  ¡ ¡ ˆj d¡ ˆj | ¡ ˆ �rrˆj d¡ ˆj ¡  d S )Nzwrite() before start_responser
   rV   zcontent-lengthrY   ÚHEADéd   éÈ   >   é0  éÌ   úHTTP/1.1TzTransfer-Encodingra   Ú
ConnectionÚclosezapplications must write bytesé   rC   )ÚAssertionErrorÚsplitr;   r5   Zsend_responseÚsetZsend_headerÚaddrz   Úprotocol_versionZend_headersrg   r…   ÚwfileÚwriteÚhexrE   ÚencodeÚflush)r†   Zcode_strÚmsgÚcodeZheader_keysr‚   rƒ   )Úchunk_responser�   Úheaders_sentÚheaders_setr   Ústatus_sentÚ
status_setr   r   r–     sR    

þ
ý üüûù	 z*WSGIRequestHandler.run_wsgi.<locals>.writec                   s@   |r(zˆ r|d   |d ¡‚W 5 d }X nˆr4tdƒ‚| ‰|‰ˆS )Nr
   r�   zHeaders already set)Úwith_tracebackr�   )Ústatusru   Úexc_info)r�   rž   r    r–   r   r   Ústart_response<  s    z3WSGIRequestHandler.run_wsgi.<locals>.start_responser&   )Úappr   c              
     sÂ   | ˆˆƒ}z2|D ]}ˆ|ƒ qˆs*ˆd	ƒ ˆ r:ˆj d
¡ W 5 t  ¡ }| ˆjt j¡ d}d}|jdd�r¢ˆj d¡}|t|ƒ7 }|d7 }|r¢|dks¢|dkr^q¢q^| 	¡  t
|dƒr¼| 	¡  X d S )Nr   g{®Gáz„?)Útimeouti€–˜ r
   l    d(	 iè  rŽ   ó    s   0

)Ú	selectorsÚDefaultSelectorÚregisterrn   Ú
EVENT_READÚselectr,   rG   rE   rŽ   Úhasattrr•   r–   )r¥   Zapplication_iterÚselectorZ
total_sizeZtotal_readsr†   )rœ   r�   r�   r   r¤   r–   r   r   ÚexecuteJ  s*    


z,WSGIRequestHandler.run_wsgi.<locals>.executeTr
   )ÚDebugTracebackrc   zError on request:
)N)ru   ry   rz   r:   r•   r–   r„   r�   rN   r¥   r   Úconnection_droppedÚ	ExceptionÚpassthrough_errorsZclose_connectionr   Zdebug.tbtoolsr°   Zrender_traceback_textr~   )r   r¯   r>   r°   rš   r   )	rœ   r�   r�   rž   r   r¤   rŸ   r    r–   r   Úrun_wsgiø   s<     9'
zWSGIRequestHandler.run_wsgic              
     sŠ   zt ƒ  ¡  W nv ttjfk
r@ } z|  |¡ W 5 d}~X Y nF tk
r„ } z(| jjdk	rrt	|ƒrr|  
d|¡ n‚ W 5 d}~X Y nX dS )z/Handles a request ignoring dropped connections.NzSSL error occurred: %s)ÚsuperÚhandleÚConnectionErrorÚsocketr¦   r±   r²   rN   re   Úis_ssl_errorÚ	log_error)r   r>   ©Ú	__class__r   r   r¶   ‹  s    zWSGIRequestHandler.handleNÚBaseExceptionzWSGIEnvironment | None)rc   r�   r   c                 C  s   dS )z`Called if the connection was closed by the client.  By default
        nothing happens.
        Nr   )r   rc   r�   r   r   r   r±   —  s    z%WSGIRequestHandler.connection_droppedr   r   c                   s   |  d¡r| jS ttƒ |ƒS )NZdo_)Ú
startswithr´   Úgetattrrµ   r   r»   r   r   r   ž  s    
zWSGIRequestHandler.__getattr__c                 C  s*   t | dd ƒr| jd S | js dS | jd S )Nr�   r[   rT   r   )r¿   r�   rf   r3   r   r   r   rq   ¦  s
    
z!WSGIRequestHandler.address_stringr5   c                 C  s
   | j d S )Nr
   )rf   r3   r   r   r   rr   ¯  s    zWSGIRequestHandler.port_integerc                 C  s   i | ]}|d |d›�“qS )z\xZ02xr   )Ú.0Úcr   r   r   Ú
<dictcomp>´  s      zWSGIRequestHandler.<dictcomp>é    é   é    z\\ú\r]   z	int | str)r›   Úsizer   c                 C  sô   z&t | jƒ}| j› d|› d| j› �}W n tk
r@   | j}Y nX | | j¡}t|ƒ}|d dkrnt	|dƒ}np|dkrxnf|dkrŒt	|dƒ}nR|d dkr¤t	|d	ƒ}n:|d
kr¸t	|dƒ}n&|d dkrÒt	|ddƒ}nt	|ddƒ}|  
dd|||¡ d S )Nú r   Ú1ÚboldZ200Z304ÚcyanÚ3ÚgreenZ404ÚyellowÚ4ÚredÚmagentaÚinfoz
"%s" %s %s)r   rd   ro   rt   r   ZrequestlineÚ	translateÚ_control_char_tabler   Ú_ansi_styler~   )r   r›   rÇ   rd   rš   r   r   r   Úlog_request¸  s*    
zWSGIRequestHandler.log_request)ÚformatÚargsr   c                 G  s   | j d|f|žŽ  d S )Nrc   ©r~   ©r   r×   rØ   r   r   r   rº   Õ  s    zWSGIRequestHandler.log_errorc                 G  s   | j d|f|žŽ  d S )NrÒ   rÙ   rÚ   r   r   r   Úlog_messageØ  s    zWSGIRequestHandler.log_message©ÚtypeÚmessagerØ   r   c                 G  s:   |   ¡  dd¡}t||› d|  ¡ › d|› d�f|žŽ  d S )Nú%z%%z - - [z] Ú
)rq   rx   r   Zlog_date_time_string)r   rÝ   rÞ   rØ   rq   r   r   r   r~   Û  s    þýzWSGIRequestHandler.log)N)r]   r]   )r   r   r   rK   Ú__annotations__ÚpropertyrQ   r„   r´   r¶   r±   r   rq   rr   r   Ú	maketransÚrangerÔ   ÚordrÖ   rº   rÛ   r~   Ú__classcell__r   r   r»   r   rL   ž   s*   
Q  ÿ	ÿrL   r   )rƒ   Ústylesr   c                 G  sB   t s| S dddddddœ}|D ]}d|| › d	| › �} q| › d
�S )Nr
   é   rÃ   é!   é#   é$   )rÊ   rÐ   rÍ   rÎ   rÑ   rË   z[Úmz[0m)Ú_log_add_style)rƒ   rç   ÚcodesÚstyler   r   r   rÕ   å  s    ú	rÕ   z
str | Nonez2tuple[Certificate, RSAPrivateKeyWithSerialization])Úcnr   c           
      C  sH  z@ddl m} ddlm} ddlm} ddlm} ddlm	} W n t
k
r^   tdƒd ‚Y nX |ƒ }|jdd	|d
�}| d kr‚d} | | |jd¡| |j| ¡g¡}|ƒ }| ¡  |¡ |¡ | ¡ ¡ | ¡ ¡ t tj¡¡ t tj¡tdd� ¡j| |j g¡dd�j| !| "| ¡| "d| › �¡g¡dd� #|| $¡ |¡}	|	|fS )Nr   )Úx509)Údefault_backend)Úhashes)Úrsa)ÚNameOIDz<Using ad-hoc certificates requires the cryptography library.i  i   )Úpublic_exponentÚkey_sizeÚbackendÚ*zDummy Certificateim  )ÚdaysF)Úcriticalz*.)%Úcryptographyrñ   Zcryptography.hazmat.backendsrò   Úcryptography.hazmat.primitivesró   Ú)cryptography.hazmat.primitives.asymmetricrô   Úcryptography.x509.oidrõ   ÚImportErrorÚ	TypeErrorÚgenerate_private_keyÚNameÚNameAttributeÚORGANIZATION_NAMEÚCOMMON_NAMEÚCertificateBuilderÚsubject_nameÚissuer_nameÚ
public_keyÚserial_numberÚrandom_serial_numberÚnot_valid_beforeÚdtÚnowr   ÚutcÚnot_valid_afterr   Úadd_extensionÚExtendedKeyUsageÚOID_SERVER_AUTHÚSubjectAlternativeNameÚDNSNameÚsignÚSHA256)
rð   rñ   rò   ró   rô   rõ   rø   ÚpkeyÚsubjectÚcertr   r   r   Úgenerate_adhoc_ssl_pairø  sf    ÿþ  ÿþÿÿþýü
ûú ù	ö  ôÿr  ztuple[str, str])Ú	base_pathÚhostrð   r   c           	   	   C  s¤   |dk	r|}t |d�\}}ddlm} | › d�}| › d�}t|dƒ�}| | |jj¡¡ W 5 Q R X t|dƒ�(}| |j|jj|j	j
| ¡ d�¡ W 5 Q R X ||fS )	aÂ  Creates an SSL key for development.  This should be used instead of
    the ``'adhoc'`` key which generates a new cert on each server start.
    It accepts a path for where it should store the key and cert and
    either a host or CN.  If a host is given it will use the CN
    ``*.host/CN=host``.

    For more information see :func:`run_simple`.

    .. versionadded:: 0.9

    :param base_path: the path to the certificate and key.  The extension
                      ``.crt`` is added for the certificate, ``.key`` is
                      added for the key.
    :param host: the name of the host.  This can be used as an alternative
                 for the `cn`.
    :param cn: the `CN` to use.
    N)rð   r   ©Úserializationz.crtz.keyÚwb©Úencodingr×   Úencryption_algorithm)r  rý   r   Úopenr–   Úpublic_bytesÚEncodingÚPEMÚprivate_bytesÚPrivateFormatÚTraditionalOpenSSLÚNoEncryption)	r  r  rð   r  r  r   Ú	cert_fileÚ	pkey_fileÚfr   r   r   Úmake_ssl_devcert)  s"    

ýÿr0  r2   c            
      C  s¶   ddl } ddl}tƒ \}}ddlm} | ¡ \}}| ¡ \}}|  tj|¡ |  tj|¡ t 	|| 
|jj¡¡ t 	||j|jj|jj| ¡ d�¡ t |¡ t |¡ t||ƒ}	|	S )z:Generates an adhoc SSL context for the development server.r   Nr  r"  )ÚatexitÚtempfiler  rý   r   Úmkstemprª   ÚosÚremover–   r&  r'  r(  r)  r*  r+  r,  rŽ   Úload_ssl_context)
r1  r2  r  r  r   Zcert_handler-  Zpkey_handler.  Úctxr   r   r   Úgenerate_adhoc_ssl_contextU  s*    
ýþ	


r8  ú
int | None)r-  r.  Úprotocolr   c                 C  s(   |dkrt j}t  |¡}| | |¡ |S )aã  Loads SSL context from cert/private key files and optional protocol.
    Many parameters are directly taken from the API of
    :py:class:`ssl.SSLContext`.

    :param cert_file: Path of the certificate to use.
    :param pkey_file: Path of the private key to use. If not given, the key
                      will be obtained from the certificate file.
    :param protocol: A ``PROTOCOL`` constant from the :mod:`ssl` module.
        Defaults to :data:`ssl.PROTOCOL_TLS_SERVER`.
    N)r|   ÚPROTOCOL_TLS_SERVERÚ
SSLContextÚload_cert_chain)r-  r.  r:  r7  r   r   r   r6  s  s
    
r6  zException | Noner1   )rc   r   c                 C  s(   | dkrt  tt ¡ d ¡} t| tjƒS )z?Checks if the given error (or the current one) is an SSL error.Nr
   )ÚtÚcastr²   rj   r£   rg   r|   ÚSSLError)rc   r   r   r   r¹   ˆ  s    r¹   r5   zsocket.AddressFamily)r  Úportr   c                 C  s.   |   d¡rtjS d| kr(ttdƒr(tjS tjS )zUReturn ``AF_INET4``, ``AF_INET6``, or ``AF_UNIX`` depending on
    the host and port.zunix://ú:ÚAF_INET6)r¾   r¸   ÚAF_UNIXr­   rC  ÚAF_INET)r  rA  r   r   r   Úselect_address_family�  s
    
rF  útuple[str, int] | str)r  rA  Úfamilyr   c                 C  sd   |t krtj |  d¡d ¡S zt | ||tjtj¡}W n tj	k
rV   | |f Y S X |d d S )zVReturn a fully qualified socket address that can be passed to
    :func:`socket.bind`.ú://r�   r   é   )
Úaf_unixr4  rd   ÚabspathÚ	partitionr¸   ÚgetaddrinfoÚSOCK_STREAMÚIPPROTO_TCPÚgaierror)r  rA  rH  Úresr   r   r   Úget_sockaddr™  s        ÿrS  )rH  r   c              
   C  sŠ   | t jkrdnd}t   | t j¡�`}z| |df¡ W n2 tk
rf   | t jkrRdnd Y W  5 Q R £ S X | ¡ d W  5 Q R £ S Q R X dS )zˆGet the IP address of an external interface. Used when binding to
    0.0.0.0 or ::1 to show a more useful URL.

    :meta private:
    zfd31:f903:5ab5:1::1z10.253.155.219i2ã  z::1ú	127.0.0.1r   N)r¸   rC  Ú
SOCK_DGRAMÚconnectr<   Úgetsockname)rH  r  Úsr   r   r   Úget_interface_ipª  s    $rY  c                
      s”   e Zd ZdZdZdZeZdZd ddddd	d
dddœ‡ fdd„Z	dddddœdd„Z
d!dddœ‡ fdd„Zddddœ‡ fdd„Zddœdd„Z‡  ZS )"rM   zuA WSGI server that that handles one request at a time.

    Use :func:`make_server` to create a server instance.
    FTNr   r5   r&   útype[WSGIRequestHandler] | Noner1   ú_TSSLContextArg | Noner9  r+   )r  rA  r¥   Úhandlerr³   re   Úfdr   c              
     s   |d krt }dt|ƒkr*| js$| jr*d|_|| _|| _|| _|| _t	||ƒ | _
}t|t|ƒ|ƒ}	|tkr”|d kr”t t|	¡}	tj |	¡r”t |	¡ tƒ j|	|dd� |d k�rtz|  ¡  |  ¡  W n¬ tk
�rR }
 zn|  ¡  t|
jtjd� |
jtj k�r8td|› d�tjd� tj!dk�r8|d	k�r8td
tjd� t "d¡ W 5 d }
~
X Y n  t#k
�rp   |  ¡  ‚ Y nX n&|  ¡  t$ %||t$j&¡| _$| j$ '¡ | _(|tk�r°| j(d | _|d k	�rút)|t*ƒ�rÐt+|Ž }n|dk�ràt,ƒ }|j-| j$dd�| _$|| _.nd | _.dd l/}d|j0 1d¡› �| _2d S )Nr”   rŒ   F)Úbind_and_activate)ÚfilezPort zp is in use by another program. Either identify and stop that program, or start the server with a different port.Údarwiniˆ  zoOn macOS, try disabling the 'AirPlay Receiver' service from System Preferences -> General -> AirDrop & Handoff.r
   r%   T)Úserver_sider   z	Werkzeug/Zwerkzeug)3rL   Úvarsrl   rm   r”   r  rA  r¥   r³   rF  Úaddress_familyrS  r5   rK  r>  r?  r   r4  rd   ÚexistsÚunlinkrµ   r0   Úserver_bindÚserver_activater<   Úserver_closeÚprintÚstrerrorrj   rk   ÚerrnoZ
EADDRINUSEÚplatformÚexitr½   r¸   ÚfromfdrO  rW  rs   rg   Útupler6  r8  Úwrap_socketre   Úimportlib.metadataÚmetadataÚversionrP   )r   r  rA  r¥   r\  r³   re   r]  rc  rs   r>   Ú	importlibr»   r   r   r0   Ç  sv    
ÿÿ
ý

üý




zBaseWSGIServer.__init__r   rÜ   c                 G  s   t ||f|žŽ  d S rO   r   )r   rÝ   rÞ   rØ   r   r   r   r~   .  s    zBaseWSGIServer.logç      à?Úfloat)Úpoll_intervalr   c                   s<   z,ztƒ j|d� W n tk
r(   Y nX W 5 |   ¡  X d S )N)rw  )rh  rµ   Úserve_foreverÚKeyboardInterrupt)r   rw  r»   r   r   rx  1  s
    
zBaseWSGIServer.serve_foreverrG  )Úrequestrf   r   c                   s   | j r‚ tƒ  ||¡S rO   )r³   rµ   Úhandle_error)r   rz  rf   r»   r   r   r{  9  s    zBaseWSGIServer.handle_errorr2   c                 C  sö   d}t |ddƒ}|g}| jtkr4| d| j› �¡ n®| jdkrBdnd}| j}| jdkr°| d	| j› d
�¡ | jdkr„d}ttjƒ}nd}ttj	ƒ}| d|› d|› d| j
› �¡ d|krÄd|› d�}| d|› d|› d| j
› �¡ tdd |¡ƒ dS )z<Show information about the address when starting the server.zvWARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.rÊ   rÐ   z * Running on NrR   rS   >   ú::ú0.0.0.0z * Running on all addresses (ú)r}  rT  z[::1]rI  rB  ú[ú]rÒ   rà   )rÕ   rc  rK  Úappendr  re   rY  r¸   rE  rC  rA  r   Újoin)r   Zdev_warningÚmessagesrh   Zdisplay_hostnameÚ	localhostr   r   r   Úlog_startupA  s(    ÿ



zBaseWSGIServer.log_startup)NFNN)ru  )r   r   r   rK   rl   rm   ÚLISTEN_QUEUEÚrequest_queue_sizeÚallow_reuse_addressr0   r~   rx  r{  r…  ræ   r   r   r»   r   rM   ¼  s       ø"grM   c                   @  s   e Zd ZdZdZdZdS )ÚThreadedWSGIServerz†A WSGI server that handles concurrent requests in separate
    threads.

    Use :func:`make_server` to create a server instance.
    TN)r   r   r   rK   rl   Údaemon_threadsr   r   r   r   r‰  d  s   r‰  c                      s<   e Zd ZdZdZdddddd	d
ddddœ	‡ fdd„Z‡  ZS )ÚForkingWSGIServerz�A WSGI server that handles concurrent requests in separate forked
    processes.

    Use :func:`make_server` to create a server instance.
    Té(   NFr   r5   r&   rZ  r1   r[  r9  r+   )	r  rA  r¥   Ú	processesr\  r³   re   r]  r   c	           	   	     s.   t stdƒ‚tƒ  |||||||¡ || _d S )Nz'Your platform does not support forking.)Úcan_forkr;   rµ   r0   Úmax_children)	r   r  rA  r¥   r�  r\  r³   re   r]  r»   r   r   r0   x  s    zForkingWSGIServer.__init__)rŒ  NFNN)r   r   r   rK   rm   r0   ræ   r   r   r»   r   r‹  o  s        ÷r‹  r&   rZ  r[  )
r  rA  r¥   Úthreadedr�  Úrequest_handlerr³   re   r]  r   c	           	   
   C  sd   |r|dkrt dƒ‚|r.t| ||||||d�S |dkrNt| |||||||d�S t| ||||||d�S )a6  Create an appropriate WSGI server instance based on the value of
    ``threaded`` and ``processes``.

    This is called from :func:`run_simple`, but can be used separately
    to have access to the server object, such as to run it in a separate
    thread.

    See :func:`run_simple` for parameter docs.
    r
   z4Cannot have a multi-thread and multi-process server.©r]  )r;   r‰  r‹  rM   )	r  rA  r¥   r�  r�  r‘  r³   re   r]  r   r   r   Úmake_serverŠ  s@          ÿø      ÿr“  c                   C  s   t j d¡dkS )zqCheck if the server is running as a subprocess within the
    Werkzeug reloader.

    .. versionadded:: 0.10
    ZWERKZEUG_RUN_MAINÚtrue)r4  r�   ry   r   r   r   r   Úis_running_from_reloader·  s    r•  Úautozt.Iterable[str] | Nonez'dict[str, str | tuple[str, str]] | Noner+   )ÚhostnamerA  ÚapplicationÚuse_reloaderÚuse_debuggerÚ
use_evalexÚextra_filesÚexclude_patternsÚreloader_intervalÚreloader_typer�  r�  r‘  Ústatic_filesr³   re   r   c                 C  s  t |tƒstdƒ‚|r,ddlm} |||ƒ}|rTddlm} |||d�}|j | ¡ t	ƒ s`d}ntt
jd ƒ}t| |||
|||||d�	}|j d	¡ t| ¡ ƒt
jd< t	ƒ sÄ| ¡  td
tddƒƒ |rúddlm} z||j||||	d� W 5 | ¡  X n| ¡  dS )a  Start a development server for a WSGI application. Various
    optional features can be enabled.

    .. warning::

        Do not use the development server when deploying to production.
        It is intended for use only during local development. It is not
        designed to be particularly efficient, stable, or secure.

    :param hostname: The host to bind to, for example ``'localhost'``.
        Can be a domain, IPv4 or IPv6 address, or file path starting
        with ``unix://`` for a Unix socket.
    :param port: The port to bind to, for example ``8080``. Using ``0``
        tells the OS to pick a random free port.
    :param application: The WSGI application to run.
    :param use_reloader: Use a reloader process to restart the server
        process when files are changed.
    :param use_debugger: Use Werkzeug's debugger, which will show
        formatted tracebacks on unhandled exceptions.
    :param use_evalex: Make the debugger interactive. A Python terminal
        can be opened for any frame in the traceback. Some protection is
        provided by requiring a PIN, but this should never be enabled
        on a publicly visible server.
    :param extra_files: The reloader will watch these files for changes
        in addition to Python modules. For example, watch a
        configuration file.
    :param exclude_patterns: The reloader will ignore changes to any
        files matching these :mod:`fnmatch` patterns. For example,
        ignore cache files.
    :param reloader_interval: How often the reloader tries to check for
        changes.
    :param reloader_type: The reloader to use. The ``'stat'`` reloader
        is built in, but may require significant CPU to watch files. The
        ``'watchdog'`` reloader is much more efficient but requires
        installing the ``watchdog`` package first.
    :param threaded: Handle concurrent requests using threads. Cannot be
        used with ``processes``.
    :param processes: Handle concurrent requests using up to this number
        of processes. Cannot be used with ``threaded``.
    :param request_handler: Use a different
        :class:`~BaseHTTPServer.BaseHTTPRequestHandler` subclass to
        handle requests.
    :param static_files: A dict mapping URL prefixes to directories to
        serve static files from using
        :class:`~werkzeug.middleware.SharedDataMiddleware`.
    :param passthrough_errors: Don't catch unhandled exceptions at the
        server level, let the server crash instead. If ``use_debugger``
        is enabled, the debugger will still catch such errors.
    :param ssl_context: Configure TLS to serve over HTTPS. Can be an
        :class:`ssl.SSLContext` object, a ``(cert_file, key_file)``
        tuple to create a typical context, or the string ``'adhoc'`` to
        generate a temporary self-signed certificate.

    .. versionchanged:: 2.1
        Instructions are shown for dealing with an "address already in
        use" error.

    .. versionchanged:: 2.1
        Running on ``0.0.0.0`` or ``::`` shows the loopback IP in
        addition to a real IP.

    .. versionchanged:: 2.1
        The command-line interface was removed.

    .. versionchanged:: 2.0
        Running on ``0.0.0.0`` or ``::`` shows a real IP address that
        was bound as well as a warning not to run the development server
        in production.

    .. versionchanged:: 2.0
        The ``exclude_patterns`` parameter was added.

    .. versionchanged:: 0.15
        Bind to a Unix socket by passing a ``hostname`` that starts with
        ``unix://``.

    .. versionchanged:: 0.10
        Improved the reloader and added support for changing the backend
        through the ``reloader_type`` parameter.

    .. versionchanged:: 0.9
        A command-line interface was added.

    .. versionchanged:: 0.8
        ``ssl_context`` can be a tuple of paths to the certificate and
        private key files.

    .. versionchanged:: 0.6
        The ``ssl_context`` parameter was added.

    .. versionchanged:: 0.5
       The ``static_files`` and ``passthrough_errors`` parameters were
       added.
    zport must be an integerr
   )ÚSharedDataMiddleware)ÚDebuggedApplication)ZevalexNZWERKZEUG_SERVER_FDr’  TrÒ   zPress CTRL+C to quitrÎ   )Úrun_with_reloader)rœ  r�  ÚintervalrŸ  )rg   r5   r  Zmiddleware.shared_datar¡  Údebugr¢  Útrusted_hostsr�  r•  r4  r�   r“  r¸   Úset_inheritabler   Úfilenor…  r   rÕ   Z	_reloaderr£  rh  rx  )r—  rA  r˜  r™  rš  r›  rœ  r�  rž  rŸ  r�  r�  r‘  r   r³   re   r¡  r¢  r]  Zsrvr£  r   r   r   Ú
run_simpleÀ  sP    p

÷û
r©  )N)NN)NN)N)Fr
   NFNN)FFTNNr
   r–  Fr
   NNFN)PrK   Ú
__future__r   rk  Úior4  r¨   r¸   Úsocketserverrj   Útypingr>  r   r  r   r   Zhttp.serverr   r   Úurllib.parser   r	   Ú	_internalr   r   Ú
exceptionsr   Úurlsr   r|   r·   r¦   ÚSSLEOFErrorr   rá   r   r   rí   r   Ú
__import__r­   rŽ  r#   rD  rK  r   r†  ÚOptionalÚUnionÚTupler   ÚLiteralZ_TSSLContextArgÚTYPE_CHECKINGZ_typeshed.wsgir&   r'   Z-cryptography.hazmat.primitives.asymmetric.rsar(   Úcryptography.x509r)   Ú	RawIOBaser*   rL   rÕ   r  r0  r8  r6  r¹   rF  rS  rY  rM   ÚThreadingMixInr‰  r‹  r“  r•  r©  r   r   r   r   Ú<module>   sÂ   ý



$ÿ>  I ÿ2   ÿ,   ÿ
 )      ÷"-             ð