U
    )–€hâ4  ã                   @  sL  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
Z
d dlmZ d dlmZmZmZmZmZmZ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 d dl m!Z! ej"dkrÜd dl#Z#nd dl$Z#d	d
lm%Z% d	Z&d	Z'dZ(eeej)f Z*ee+ej,f Z,eG dd„ dƒƒZ-G dd„ de.ƒZ/G dd„ dƒZ0dS )é    )ÚannotationsN)Ú	dataclass)Úcreate_default_contextÚOP_NO_COMPRESSIONÚPurposeÚ
SSLContextÚ
TLSVersionÚVerifyFlagsÚ
VerifyMode)Útime)	ÚAnyÚAnyStrÚDictÚListÚMappingÚOptionalÚTupleÚTypeÚUnion)Úformat_date_time)é   é   é   )ÚLoggerg      ð?c                   @  s&   e Zd ZU ded< ded< ded< dS )ÚSocketsúList[socket.socket]Úsecure_socketsÚinsecure_socketsÚquic_socketsN)Ú__name__Ú
__module__Ú__qualname__Ú__annotations__© r#   r#   ú4/tmp/pip-unpacked-wheel-mge4popt/hypercorn/config.pyr   )   s   
r   c                      s&   e Zd Zddddœ‡ fdd„Z‡  ZS )ÚSocketTypeErrorÚ
SocketKindÚNone)ÚexpectedÚactualÚreturnc                   s*   t ƒ  dt |¡› dt |¡› d�¡ d S )Nz Unexpected socket type, wanted "z" got "ú")ÚsuperÚ__init__Úsocketr&   )Úselfr(   r)   ©Ú	__class__r#   r$   r-   1   s    ÿzSocketTypeError.__init__)r   r    r!   r-   Ú__classcell__r#   r#   r0   r$   r%   0   s   r%   c                   @  sª  e Zd ZU dgZg Zded< g Zded< g Zded< dZded	< d
Z	ded< dZ
dZded< ddgZg Zded< ded< dZdZded< dZded< dZded< dZd
ZdZded< de Zded< dZd ed!< dZd ed"< d#e ZdZdZd$Zd#e Zd%Z d%Z!d&e Z"d'Z#dZ$ded(< dZ%ded)< dZ&ded*< dZ'd+ed,< e(Z)d-Z*ded.< d/Z+d0ed1< dZ,d ed2< d3Z-d0ed4< dZ.ded5< g Z/ded6< d7e Z0d7e Z1d7e Z2dZ3ded8< d
Z4dZ5d ed9< dZ6dZ7d ed:< dZ8d;ed<< dZ9d=ed>< d?e Z:dZ;d@edA< dBZ<dCZ=d?e Z>d0dDdEœdFdG„Z?e@de?ƒZAe@dHdIœdJdK„ƒZBe@ddIœdLdM„ƒZCeCjDdNdDdEœdOdM„ƒZCe@ddIœdPdQ„ƒZEeEjDdNdDdEœdRdQ„ƒZEe@ddIœdSdT„ƒZFeFjDdNdDdEœdUdT„ƒZFe@ddIœdVdW„ƒZGeGjDddDdEœdXdW„ƒZGdYdIœdZd[„ZHe@d\dIœd]d^„ƒZId_dIœd`da„ZJdbdDdcœddde„ZKeLjMfdd0dbdfœdgdh„ZNddidjœdkdl„ZOdmdDdnœdodp„ZPeQd‚dqdrdsdtduœdvdw„ƒZReQdqdxdtdyœdzd{„ƒZSeQdqdxdtdyœd|d}„ƒZTeQdqd~dtdœd€d�„ƒZUdS )ƒÚConfigz127.0.0.1:8000z	List[str]Ú_insecure_bindÚ
_quic_bindzList[Tuple]Ú_quic_addressesNzOptional[Logger]Ú_logÚ ÚstrÚ
_root_pathz;%(h)s %(l)s %(l)s %(t)s "%(r)s" %(s)s %(b)s "%(f)s" "%(a)s"z Union[logging.Logger, str, None]Ú	accesslogÚh2zhttp/1.1Úalt_svc_headersZapplication_pathéd   zOptional[str]Úca_certsÚcertfilezECDHE+AESGCMÚciphersFú-Úerrorlogr   ÚfloatÚgraceful_timeoutzOptional[int]Úread_timeoutÚgroupi @  i   Té   iè  ÚkeyfileÚkeyfile_passwordÚ	logconfigzOptional[dict]Úlogconfig_dictÚINFOÚloglevelé
   ÚintÚmax_app_queue_sizeÚmax_requestsr   Úmax_requests_jitterÚpid_pathÚserver_namesé<   Ústatsd_hostÚumaskÚuserzOptional[VerifyFlags]Úverify_flagszOptional[VerifyMode]Úverify_modei   zOptional[float]Úwebsocket_ping_intervalZasyncior   r'   )Úvaluer*   c                 C  s   t  dt¡ t|ƒ| _d S )NzPlease use verify_mode instead)ÚwarningsÚwarnÚWarningr
   r[   ©r/   r]   r#   r#   r$   Úset_cert_reqss   s    zConfig.set_cert_reqsr   )r*   c                 C  s   | j d kr|  | ¡| _ | j S ©N)r7   Úlogger_class©r/   r#   r#   r$   Úlogy   s    
z
Config.logc                 C  s   | j S rc   )Ú_bindre   r#   r#   r$   Úbind   s    zConfig.bindzUnion[List[str], str]c                 C  s   t |tƒr|g| _n|| _d S rc   )Ú
isinstancer9   rg   ra   r#   r#   r$   rh   ƒ   s    

c                 C  s   | j S rc   )r4   re   r#   r#   r$   Úinsecure_bindŠ   s    zConfig.insecure_bindc                 C  s   t |tƒr|g| _n|| _d S rc   )ri   r9   r4   ra   r#   r#   r$   rj   Ž   s    

c                 C  s   | j S rc   )r5   re   r#   r#   r$   Ú	quic_bind•   s    zConfig.quic_bindc                 C  s   t |tƒr|g| _n|| _d S rc   )ri   r9   r5   ra   r#   r#   r$   rk   ™   s    

c                 C  s   | j S rc   )r:   re   r#   r#   r$   Ú	root_path    s    zConfig.root_pathc                 C  s   |  d¡| _d S )Nú/)Úrstripr:   ra   r#   r#   r$   rl   ¤   s    zOptional[SSLContext]c                 C  s¢   | j s
d S ttjƒ}| | j¡ tj|_t	|_
| | j¡ | jd k	rd| jd k	rd|j| j| j| jd� | jd k	rz| | j¡ | jd k	rŒ| j|_| jd k	rž| j|_|S )N)r@   rI   Úpassword)Ússl_enabledr   r   ÚCLIENT_AUTHÚset_ciphersrA   r   ÚTLSv1_2Úminimum_versionr   ÚoptionsÚset_alpn_protocolsÚalpn_protocolsr@   rI   Úload_cert_chainrJ   r?   Úload_verify_locationsr[   rZ   )r/   Úcontextr#   r#   r$   Úcreate_ssl_context¨   s(    
ý


zConfig.create_ssl_contextÚboolc                 C  s   | j d k	o| jd k	S rc   )r@   rI   re   r#   r#   r$   rp   Â   s    zConfig.ssl_enabledr   c                 C  sZ   | j r:|  | j¡}|  | j¡}|  | jtj¡}|  |¡ ng }|  | j¡}g }t|||ƒS rc   )	rp   Ú_create_socketsrh   rj   rk   r.   Ú
SOCK_DGRAMÚ_set_quic_addressesr   )r/   r   r   r   r#   r#   r$   Úcreate_socketsÆ   s    zConfig.create_socketsr   )Úsocketsr*   c                 C  sV   g | _ |D ]F}| ¡ }t|ƒtk	r<t|ƒdkr<| j  |¡ q
t d|› d�t¡ q
d S )Né   zACannot create a alt-svc header for the QUIC socket with address "r+   )	r6   ÚgetsocknameÚtyper9   ÚlenÚappendr^   r_   r`   )r/   r�   ÚsockÚnamer#   r#   r$   r   Ò   s    
þzConfig._set_quic_addresses)ÚbindsÚtype_r*   c              
   C  sn  g }|D �]^}d }|  d¡rpt tj|¡}|dd … }z t t |¡j¡rTt |¡ W n tk
rj   Y nX �n$|  d¡r¶tjt	|dd … ƒd�}| 
tjtj¡}||kr´t||ƒ‚nÞ| dd¡ dd¡}z&| dd	¡}|d
 t	|d	 ƒ }	}
W n$ ttfk
�r   |d }	}
Y nX t d|	k�r*tjntj|¡}|tjk�rR| tjtjd	¡ | jd	k�rŒz| tjtjd	¡ W n tk
�rŠ   Y nX |	|
f}| tjtjd	¡ |  d¡�r| jd k	�rÊt | j¡}| |¡ | jd k	�rþ| jd k	�rþt  || j| j¡ | jd k	�r.t |¡ n|  d¡�r$n
| |¡ | !d¡ z| "d¡ W n tk
�r\   Y nX | #|¡ q|S )Nzunix:rH   zfd://)Úfilenoú[r8   ú]ú:r   r   i@  FT)$Ú
startswithr.   ÚAF_UNIXÚstatÚS_ISSOCKÚosÚst_modeÚremoveÚFileNotFoundErrorrP   Ú
getsockoptÚ
SOL_SOCKETÚSO_TYPEr%   ÚreplaceÚrsplitÚ
ValueErrorÚ
IndexErrorÚAF_INET6ÚAF_INETÚSOCK_STREAMÚ
setsockoptÚIPPROTO_TCPÚTCP_NODELAYÚworkersÚSO_REUSEPORTÚAttributeErrorÚSO_REUSEADDRrX   rh   rY   rG   ÚchownÚsetblockingÚset_inheritabler†   )r/   r‰   rŠ   r�   rh   Úbindingr‡   Zactual_typer]   ÚhostÚportÚcurrent_umaskr#   r#   r$   r}   Þ   sd    






zConfig._create_socketszList[Tuple[bytes, bytes]])Úprotocolr*   c                 C  s¾   g }| j r$| dttƒ ƒ d¡f¡ | jrD| dd|› � d¡f¡ | jD ]}| d| ¡ f¡ qJt| jƒdkrº| jrºddl	m
} |D ]2}| jD ]&}|d }| dd	| ¡ |f f¡ q�q†|S )
Ns   dateÚasciis   serverz
hypercorn-s   alt-svcr   )ÚH3_ALPNr   s   %s=":%d"; ma=3600)Úinclude_date_headerr†   r   r   ÚencodeÚinclude_server_headerr=   r…   r6   Zaioquic.h3.connectionr±   )r/   r¯   ÚheadersZalt_svc_headerr±   ÚversionÚaddrr­   r#   r#   r$   Úresponse_headers  s    

zConfig.response_headerszType[Logger])Ústatsd_loggerr*   c                 C  s   | j tkr| jd k	r|| _ d S rc   )rd   r   rW   )r/   r¹   r#   r#   r$   Úset_statsd_logger_class.  s    zConfig.set_statsd_logger_classzType['Config']zOptional[Mapping[str, Any]]r   z'Config')ÚclsÚmappingÚkwargsr*   c              	   K  sb   i }|dk	r|  |¡ |  |¡ | ƒ }| ¡ D ].\}}zt|||ƒ W q. tk
rZ   Y q.X q.|S )aó  Create a configuration from a mapping.

        This allows either a mapping to be directly passed or as
        keyword arguments, for example,

        .. code-block:: python

            config = {'keep_alive_timeout': 10}
            Config.from_mapping(config)
            Config.from_mapping(keep_alive_timeout=10)

        Arguments:
            mapping: Optionally a mapping object.
            kwargs: Optionally a collection of keyword arguments to
                form a mapping.
        N)ÚupdateÚitemsÚsetattrr¦   )r»   r¼   r½   ZmappingsÚconfigÚkeyr]   r#   r#   r$   Úfrom_mapping2  s    

zConfig.from_mappingÚFilePath)r»   Úfilenamer*   c                 C  s:   t  |¡}tj d|¡}tj |¡}|j |¡ |  |¡S )zãCreate a configuration from a Python file.

        .. code-block:: python

            Config.from_pyfile('hypercorn_config.py')

        Arguments:
            filename: The filename which gives the path to the file.
        zmodule.name)	r“   ÚfspathÚ	importlibÚutilÚspec_from_file_locationÚmodule_from_specÚloaderÚexec_moduleÚfrom_object)r»   rÅ   Ú	file_pathÚspecÚmoduler#   r#   r$   Úfrom_pyfileS  s
    
zConfig.from_pyfilec              	   C  s4   t  |¡}t|dƒ�}t |¡}W 5 Q R X |  |¡S )a  Load the configuration values from a TOML formatted file.

        This allows configuration to be loaded as so

        .. code-block:: python

            Config.from_toml('config.toml')

        Arguments:
            filename: The filename which gives the path to the file.
        Úrb)r“   rÆ   ÚopenÚtomllibÚloadrÃ   )r»   rÅ   rÎ   Úfile_Údatar#   r#   r$   Ú	from_tomld  s    
zConfig.from_tomlzUnion[object, str])r»   Úinstancer*   c                   sr   t ˆ tƒrRzt ˆ ¡‰ W n8 tk
rP   ˆ  dd¡\}}t |¡}t||ƒ‰ Y nX ‡ fdd„tˆ ƒD ƒ}|  |¡S )aî  Create a configuration from a Python object.

        This can be used to reference modules or objects within
        modules for example,

        .. code-block:: python

            Config.from_object('module')
            Config.from_object('module.instance')
            from module import instance
            Config.from_object(instance)

        are valid.

        Arguments:
            instance: Either a str referencing a python object or the
                object itself.

        Ú.r   c                   s4   i | ],}t tˆ |ƒtjƒs| d ¡s|tˆ |ƒ“qS )Ú__)ri   ÚgetattrÚtypesÚ
ModuleTyper�   )Ú.0rÂ   ©rÙ   r#   r$   Ú
<dictcomp>“  s
    
þ z&Config.from_object.<locals>.<dictcomp>)	ri   r9   rÇ   Úimport_moduleÚImportErrorr›   rÜ   ÚdirrÃ   )r»   rÙ   ÚpathrÁ   rÐ   r¼   r#   rà   r$   rÍ   v  s    


þzConfig.from_object)N)Vr   r    r!   rg   r4   r"   r5   r6   r7   r:   Zaccess_log_formatr;   rw   r=   Úbacklogr?   r@   rA   ÚdebugZdogstatsd_tagsrC   ÚSECONDSrE   rF   rG   ÚBYTESZh11_max_incomplete_sizeZh11_pass_raw_headersZh2_max_concurrent_streamsZh2_max_header_list_sizeÚOCTETSZh2_max_inbound_frame_sizer²   r´   Zkeep_alive_timeoutZkeep_alive_max_requestsrI   rJ   rK   rL   r   rd   rN   rQ   rR   rS   rT   rU   Zshutdown_timeoutZssl_handshake_timeoutZstartup_timeoutrW   Zstatsd_prefixrX   Zuse_reloaderrY   rZ   r[   Zwebsocket_max_message_sizer\   Zworker_classr¤   Zwsgi_max_body_sizerb   ÚpropertyÚ	cert_reqsrf   rh   Úsetterrj   rk   rl   r{   rp   r€   r   r.   r    r}   r¸   rº   ÚclassmethodrÃ   rÑ   rØ   rÍ   r#   r#   r#   r$   r3   8   s¼   

ÿ= ÿ r3   )1Ú
__future__r   rÇ   Zimportlib.utilÚloggingr“   r.   r‘   ÚsysrÝ   r^   Údataclassesr   Ússlr   r   r   r   r   r	   r
   r   Útypingr   r   r   r   r   r   r   r   r   Zwsgiref.handlersr   Úversion_inforÔ   Ztomlir   ré   rê   rè   ÚPathLikerÄ   rP   r&   r   Ú	Exceptionr%   r3   r#   r#   r#   r$   Ú<module>   s6   $	,

