U
    ){f4                     @  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rd 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#   O/var/www/html/Darija-Ai-API/env/lib/python3.8/site-packages/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ZPeQddqdrdsdtdudvdwZReQdqdxdtdydzd{ZSeQdqdxdtdyd|d}ZTeQdqd~dtddd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]	accesslogZh2zhttp/1.1alt_svc_headersZapplication_pathd   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_intervalasyncior   r'   )valuer*   c                 C  s   t dt t|| _d S )NzPlease use verify_mode instead)warningswarnWarningr
   rZ   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?   rH   password)ssl_enabledr   r   CLIENT_AUTHset_ciphersr@   r   TLSv1_2minimum_versionr   optionsset_alpn_protocolsalpn_protocolsr?   rH   load_cert_chainrI   r>   load_verify_locationsrZ   rY   )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?   rH   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rtjt	|dd  d}|
tjtj}||krt||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rz|tjtjd	 W n tk
r   Y nX |	|
f}|tjtjd	 | dr| jd k	rt| j}|| | jd k	r| jd k	rt || 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:rG   zfd://)fileno[r8   ]:r   r   i@  FT)$
startswithr.   AF_UNIXstatS_ISSOCKosst_moderemoveFileNotFoundErrorrO   
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_REUSEADDRrW   rh   rX   rF   chownsetblockingset_inheritabler   )r/   r   r   r   rh   Z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rddl	m
} |D ]2}| jD ]&}|d }|dd	| |f f qq|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   rV   )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 )zCreate 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?   r@   debugZdogstatsd_tagsrB   SECONDSrD   rE   rF   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_requestsrH   rI   rJ   rK   r   rd   rM   rP   rQ   rR   rS   rT   Zshutdown_timeoutssl_handshake_timeoutZstartup_timeoutrV   Zstatsd_prefixrW   Zuse_reloaderrX   rY   rZ   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   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   tomlir   r   r   r   PathLiker   rO   r&   r   	Exceptionr%   r3   r#   r#   r#   r$   <module>   s6   $	,

