U
    )–€hj  ã                   @  s&  d dl m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mZmZmZmZmZmZmZmZmZmZ dd	lmZmZ dd
lmZ ddlm Z m!Z!m"Z"m#Z# erÔddl$m%Z% G dd„ de&ƒZ'G dd„ de&ƒZ(G dd„ de&ƒZ)G dd„ de&ƒZ*G dd„ de&ƒZ+G dd„ de&ƒZ,ddddœdd„Z-dd d!œd"d#„Z.d d d!œd$d%„Z/ddd&d'œd(d)„Z0d*dd+d&d,œd-d.„Z1d/d0œd1d2„Z2d/dd3œd4d5„Z3d6d7d8œd9d:„Z4d;d<d7d=œd>d?„Z5dd7d@œdAdB„Z6ddCdDdEœdFdG„Z7ddCddEœdHdI„Z8dJdKddLœdMdN„Z9dOddPœdQdR„Z:dS )Sé    )ÚannotationsN)ÚEnum)Úimport_module)ÚEvent)ÚPath)ÚAnyÚ	AwaitableÚCallableÚcastÚDictÚIterableÚListÚLiteralÚOptionalÚTupleÚTYPE_CHECKINGé   )ÚASGIWrapperÚWSGIWrapper)ÚConfig)Ú
AppWrapperÚASGIFrameworkÚ	FrameworkÚWSGIFramework)ÚRequestc                   @  s   e Zd ZdS )ÚShutdownErrorN©Ú__name__Ú
__module__Ú__qualname__© r    r    ú3/tmp/pip-unpacked-wheel-mge4popt/hypercorn/utils.pyr   !   s   r   c                   @  s   e Zd ZdS )Ú
NoAppErrorNr   r    r    r    r!   r"   %   s   r"   c                      s$   e Zd Zdddœ‡ fdd„Z‡  ZS )ÚLifespanTimeoutErrorÚstrÚNone)ÚstageÚreturnc                   s   t ƒ  d|› d|› d�¡ d S )NzTimeout whilst awaiting z[. Your application may not support the ASGI Lifespan protocol correctly, alternatively the z$_timeout configuration is incorrect.©ÚsuperÚ__init__)Úselfr&   ©Ú	__class__r    r!   r*   *   s    ÿzLifespanTimeoutError.__init__©r   r   r   r*   Ú__classcell__r    r    r,   r!   r#   )   s   r#   c                      s&   e Zd Zddddœ‡ fdd„Z‡  ZS )ÚLifespanFailureErrorr$   r%   )r&   Úmessager'   c                   s   t ƒ  d|› d|› d�¡ d S )NzLifespan failure in z. 'ú'r(   )r+   r&   r1   r,   r    r!   r*   2   s    zLifespanFailureError.__init__r.   r    r    r,   r!   r0   1   s   r0   c                      s&   e Zd Zddddœ‡ fdd„Z‡  ZS )ÚUnexpectedMessageErrorr   r$   r%   )ÚstateÚmessage_typer'   c                   s   t ƒ  d|› d|› �¡ d S )NzUnexpected message type, z given the state r(   )r+   r4   r5   r,   r    r!   r*   7   s    zUnexpectedMessageError.__init__r.   r    r    r,   r!   r3   6   s   r3   c                   @  s   e Zd ZdS )ÚFrameTooLargeErrorNr   r    r    r    r!   r6   ;   s   r6   r$   ÚintÚbool)ÚmethodÚstatus_coder'   c                 C  s(   | dkp&d|  kodk n  p&|dkS )NÚHEADéd   éÈ   >   é0  éÌ   r    )r9   r:   r    r    r!   Úsuppress_body?   s    r@   zIterable[Tuple[bytes, bytes]]zList[Tuple[bytes, bytes]])Úheadersr'   c                 C  sH   g }| D ]:\}}|d dkr$t dƒ‚| t|ƒ ¡ t|ƒ ¡ f¡ q|S )Nr   é:   zPseudo headers are not valid)Ú
ValueErrorÚappendÚbytesÚstrip)rA   Zvalidated_headersÚnameÚvaluer    r    r!   Úbuild_and_validate_headersC   s     rI   c                 C  sn   dg}d }d}| D ]>\}}|dkr(|}q|dkr6|}q|d dkr|  ||f¡ qd|d k	r`|n|f|d< |S )N)ó   hostó    rK   s
   :authorityrJ   r   rB   )rD   )rA   Zfiltered_headersÚ	authorityÚhostrG   rH   r    r    r!   Úfilter_pseudo_headersM   s    rN   r   )ÚpathÚwsgi_max_body_sizer'   c           
   
   C  s.  d }d| kr| d }}nB|   d¡dkrJ|  dd¡\}}}|dkrZtdƒ‚n|  dd¡\}}t|ƒ ¡ }tj dt|j	ƒ¡ | 
¡ r�| d¡j}n|j}zt|ƒ}W n@ tk
râ } z"|j|krÐtd	| › d
�ƒ‚n‚ W 5 d }~X Y nX zt|t|ƒƒ}	W n& tk
�r   td	| › d�ƒ‚Y nX t|	||ƒS d S )Nú:Úappé   >   ÚwsgiÚasgiz'Invalid mode, must be 'asgi', or 'wsgi'r   r   Ú zCannot load application from 'z', module not found.z', application not found.)ÚcountÚsplitrC   r   ÚresolveÚsysrO   Úinsertr$   ÚparentÚis_fileÚwith_suffixrG   r   ÚModuleNotFoundErrorr"   ÚevalÚvarsÚ	NameErrorÚwrap_app)
rO   rP   ÚmodeÚmodule_nameZapp_nameÚmodule_pathÚimport_nameÚmoduleÚerrorrR   r    r    r!   Úload_application\   s0    

rj   r   z#Optional[Literal[('asgi', 'wsgi')]])rR   rP   rd   r'   c                 C  sB   |d krt | ƒrdnd}|dkr.ttt| ƒƒS ttt| ƒ|ƒS d S )NrU   rT   )Úis_asgir   r
   r   r   r   )rR   rP   rd   r    r    r!   rc   |   s
    rc   zDict[Path, float])r'   c               
   C  sj   i } t tj ¡ ƒD ]R}t|dd ƒ}|d kr,qt|ƒ}z| ¡ j| t|ƒ< W q tt	fk
rb   Y qX q| S )NÚ__file__)
ÚlistrZ   ÚmodulesÚvaluesÚgetattrr   ÚstatÚst_mtimeÚFileNotFoundErrorÚNotADirectoryError)Zlast_updatesrh   ÚfilenamerO   r    r    r!   Úfiles_to_watch‡   s    rv   )Úfilesr'   c              	   C  sT   |   ¡ D ]F\}}z| ¡ j}W n tk
r6   Y  dS X ||krF dS || |< qdS )NTF)Úitemsrq   rr   rs   )rw   rO   Z
last_mtimeÚmtimer    r    r!   Úcheck_for_updates•   s    

rz   zCallable[..., Awaitable]r%   )Úshutdown_eventr'   c                 Ã  s   | ƒ I d H  t ƒ ‚d S )N)r   )r{   r    r    r!   Úraise_shutdown£   s    r|   Ú	EventTypez!Callable[[float], Awaitable[Any]])r{   Úsleepr'   c                 Ã  s    |   ¡ rd S |dƒI d H  q d S )Ngš™™™™™¹?)Úis_set)r{   r~   r    r    r!   Ú!check_multiprocess_shutdown_event¨   s    r€   )Úpid_pathr'   c              	   C  s*   t | dƒ�}| t ¡ › ¡ W 5 Q R X d S )NÚw)ÚopenÚwriteÚosÚgetpid)r�   Úfile_r    r    r!   Úwrite_pid_file±   s    rˆ   ÚtuplezOptional[Tuple[str, int]])ÚfamilyÚaddressr'   c                 C  s0   | t jkr|S | t jkr(|d |d fS d S d S )Nr   r   )ÚsocketÚAF_INETÚAF_INET6©rŠ   r‹   r    r    r!   Úparse_socket_addr¶   s
    

r�   c                 C  s`   | t jkr |d › d|d › �S | t jkrBd|d › d|d › �S | t jkrVd|› �S |› S d S )Nr   rQ   r   ú[z]:zunix:)rŒ   r�   rŽ   ÚAF_UNIXr�   r    r    r!   Úrepr_socket_addr¿   s    



r“   r   z	'Request')ÚconfigÚrequestr'   c                 C  sH   t | jƒdkrdS d}|jD ] \}}| ¡ dkr| ¡ } q>q|| jkS )Nr   TrV   rJ   )ÚlenZserver_namesrA   ÚlowerÚdecode)r”   r•   rM   rG   rH   r    r    r!   Úvalid_server_nameÊ   s    r™   r   )rR   r'   c                 C  s(   t  | ¡rdS t| dƒr$t  | j¡S dS )NTÚ__call__F)ÚinspectÚiscoroutinefunctionÚhasattrrš   )rR   r    r    r!   rk   Ö   s
    

rk   );Ú
__future__r   r›   r…   rŒ   rZ   Úenumr   Ú	importlibr   Zmultiprocessing.synchronizer   r}   Úpathlibr   Útypingr   r   r	   r
   r   r   r   r   r   r   r   Zapp_wrappersr   r   r”   r   r   r   r   r   Zprotocol.eventsr   Ú	Exceptionr   r"   r#   r0   r3   r6   r@   rI   rN   rj   rc   rv   rz   r|   r€   rˆ   r�   r“   r™   rk   r    r    r    r!   Ú<module>   sD   4
 		