U
    )–€hÙ  ã                   @  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Zd dlmZ d dl	m
Z
mZ d dlmZmZmZmZmZmZ ejdkr„d dlZnd dlZer¬ddlmZ dd	lmZmZ d
dœdddddddœdd„ZG dd„ dƒZG dd„ deƒZdS )é    )ÚannotationsN)Ú
HTTPStatus)Ú
dictConfigÚ
fileConfig)ÚAnyÚIOÚMappingÚOptionalÚTYPE_CHECKINGÚUnion)é   é   é   )ÚConfig)ÚResponseSummaryÚWWWScopeT©Ú	propagateÚstrz Union[logging.Logger, str, None]zOptional[str]r   ÚboolzOptional[logging.Logger])ÚnameÚtargetÚlevelÚsys_defaultr   Úreturnc                C  sˆ   t |tjƒr|S |r€t | ¡}|dkr0t |¡nt |¡g|_||_t dd¡}|jd  	|¡ |d k	r|| 
t | ¡ ¡¡ |S d S d S )Nú-z5%(asctime)s [%(process)d] [%(levelname)s] %(message)sz[%Y-%m-%d %H:%M:%S %z]r   )Ú
isinstanceÚloggingÚLoggerÚ	getLoggerÚStreamHandlerÚFileHandlerÚhandlersr   Ú	FormatterÚsetFormatterÚsetLevelÚgetLevelNameÚupper)r   r   r   r   r   ÚloggerÚ	formatter© r*   ú5/tmp/pip-unpacked-wheel-mge4popt/hypercorn/logging.pyÚ_create_logger   s     
ÿþr,   c                   @  sâ   e Zd Zdddœdd„Zddddd	œd
d„Zdddddœdd„Zdddddœdd„Zdddddœdd„Zdddddœdd„Zdddddœdd„Z	dddddœdd„Z
ddddddœdd„Zdddd d	œd!d"„Zddd#œd$d%„Zd&S )'r   z'Config'ÚNone)Úconfigr   c              	   C  sø   |j | _ td|j|jtjdd�| _td|j|jtjƒ| _	|j
d k	rà|j
 d¡r|t|j
dd … ƒ�}tt |¡ƒ W 5 Q R X qô|j
 d¡r¸t|j
dd … dƒ�}tt |¡ƒ W 5 Q R X qô|j
tj |j
¡d	œ}t|j
|dd
� n|jd k	rôt|jƒ d S )Nzhypercorn.accessFr   zhypercorn.errorzjson:é   ztoml:Úrb)Ú__file__Úhere)ÚdefaultsÚdisable_existing_loggers)Úaccess_log_formatr,   Z	accesslogZloglevelÚsysÚstdoutÚaccess_loggerZerrorlogÚstderrÚerror_loggerZ	logconfigÚ
startswithÚopenr   ÚjsonÚloadÚtomllibÚosÚpathÚdirnamer   Zlogconfig_dict)Úselfr.   Úfile_Z
log_configr*   r*   r+   Ú__init__5   s6    û   ÿ
þ
zLogger.__init__ú
'WWWScope'z'ResponseSummary'Úfloat©ÚrequestÚresponseÚrequest_timer   c                 Ã  s(   | j d k	r$| j  | j|  |||¡¡ d S ©N)r8   Úinfor5   Úatoms©rC   rI   rJ   rK   r*   r*   r+   ÚaccessT   s
    
 ÿzLogger.accessr   r   )ÚmessageÚargsÚkwargsr   c                 Ï  s"   | j d k	r| j j|f|ž|Ž d S rL   )r:   Úcritical©rC   rQ   rR   rS   r*   r*   r+   rT   \   s    
zLogger.criticalc                 Ï  s"   | j d k	r| j j|f|ž|Ž d S rL   )r:   ÚerrorrU   r*   r*   r+   rV   `   s    
zLogger.errorc                 Ï  s"   | j d k	r| j j|f|ž|Ž d S rL   )r:   ÚwarningrU   r*   r*   r+   rW   d   s    
zLogger.warningc                 Ï  s"   | j d k	r| j j|f|ž|Ž d S rL   )r:   rM   rU   r*   r*   r+   rM   h   s    
zLogger.infoc                 Ï  s"   | j d k	r| j j|f|ž|Ž d S rL   )r:   ÚdebugrU   r*   r*   r+   rX   l   s    
zLogger.debugc                 Ï  s"   | j d k	r| j j|f|ž|Ž d S rL   )r:   Ú	exceptionrU   r*   r*   r+   rY   p   s    
zLogger.exceptionÚint)r   rQ   rR   rS   r   c                 Ï  s$   | j d k	r | j j||f|ž|Ž d S rL   )r:   Úlog)rC   r   rQ   rR   rS   r*   r*   r+   r[   t   s    
z
Logger.logúOptional['ResponseSummary']zMapping[str, str]c                 C  s   t |||ƒS )zÅCreate and return an access log atoms dictionary.

        This can be overidden and customised if desired. It should
        return a mapping between an access log format key and a value.
        )ÚAccessLogAtomsrO   r*   r*   r+   rN   x   s    zLogger.atoms)r   r   c                 C  s   t | j|ƒS rL   )Úgetattrr:   )rC   r   r*   r*   r+   Ú__getattr__‚   s    zLogger.__getattr__N)Ú__name__Ú
__module__Ú__qualname__rE   rP   rT   rV   rW   rM   rX   rY   r[   rN   r_   r*   r*   r*   r+   r   4   s   
r   c                      s8   e Zd Zdddddœdd„Zddd	œ‡ fd
d„Z‡  ZS )r]   rF   r\   rG   r-   rH   c                 C  s&  |d D ](\}}|  d¡| d|  d¡ ¡ › d�< qtj ¡ D ]\}}|| d| ¡ › d�< q<| dd¡}| d¡}|d kr~d }nFt|ƒd	kr¢|d
 › d|d › �}n"t|ƒdkr¸|d
 }nd|› d�}|d dkrÚ|d }	nd}	|d   ¡ }
|d |
rüd|
 nd }d}d}|d k	�rŽ| dg ¡D ]*\}}|  d¡| d|  d¡ ¡ › d�< �q t|d ƒ}zt|d ƒj	}W n" t
k
�rŒ   d|› d�}Y nX |  |dt d¡|	› d|d › d|› �|	› d|› d|› �|||d |	|d ||
|| d | d | d | d t|ƒt|d  ƒ|d!›d"t ¡ › d#�d$œ¡ d S )%NÚheadersÚlatin1Ú{z}iz}eÚhttp_versionÚwsÚclienté   r   ú:r   z<???z???>ÚtypeÚhttpÚmethodÚGETÚquery_stringrA   ú?Ú r   z}oÚstatusz[%d/%b/%Y:%H:%M:%S %z]ú Úschemez{Content-Length}oz
{Referer}iz{User-Agent}ii@B z.6fú<ú>)ÚhÚlÚtÚrÚRÚsÚstÚSÚmÚUZUqÚqÚHÚbÚBÚfÚaÚTÚDÚLÚp)ÚdecodeÚlowerr@   ÚenvironÚitemsÚgetÚlenr   r   ÚphraseÚ
ValueErrorÚupdateÚtimeÚstrftimerZ   Úgetpid)rC   rI   rJ   rK   r   ÚvalueÚprotocolrh   Zremote_addrrm   ro   Zpath_with_qsÚstatus_codeZstatus_phraser*   r*   r+   rE   ‡   sh    "



$
ëÿzAccessLogAtoms.__init__r   )Úkeyr   c                   sJ   z.|  d¡rtƒ  | ¡ ¡W S tƒ  |¡W S W n tk
rD   Y dS X d S )Nre   r   )r;   ÚsuperÚ__getitem__rŒ   ÚKeyError)rC   rš   ©Ú	__class__r*   r+   rœ   Ã   s    
zAccessLogAtoms.__getitem__)r`   ra   rb   rE   rœ   Ú__classcell__r*   r*   rž   r+   r]   †   s   <r]   )Ú
__future__r   r=   r   r@   r6   r”   rl   r   Úlogging.configr   r   Útypingr   r   r   r	   r
   r   Úversion_infor?   Ztomlir.   r   r   r   r,   r   Údictr]   r*   r*   r*   r+   Ú<module>   s$    

	úR