
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
U
    'â7`ÓZ  ã                   @   sÆ  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mZmZmZmZmZmZmZ d dlZdd	lmZm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% ddl&m'Z'm(Z( ddl)m*Z*m+Z+ ddl,m-Z- ddl.m/Z/ ddl0m1Z1 ddl2m3Z3 ddl4m5Z5m6Z6 dZ7e�rJddl8m9Z9 ee$e+dedge3f Z:ee3gee6 f Z;e$dde#i i dddde <d¡ƒ
Z=G dd„ de>ƒZ?G dd„ de>ƒZ@G d d„ deƒZAdS )!é    N)Údeque)Úsuppress)Úescape)Ú
HTTPStatus)ÚLogger)ÚTYPE_CHECKINGÚAnyÚ	AwaitableÚCallableÚOptionalÚTupleÚTypeÚcasté   )ÚAbstractAccessLoggerÚAbstractStreamWriter)ÚBaseProtocol)ÚCeilTimeoutÚcurrent_task)ÚHttpProcessingErrorÚHttpRequestParserÚHttpVersion10ÚRawRequestMessageÚStreamWriter)Úaccess_loggerÚserver_logger)ÚEMPTY_PAYLOADÚStreamReader)Útcp_keepalive)ÚHTTPException)ÚAccessLogger)ÚBaseRequest)ÚResponseÚStreamResponse)ÚRequestHandlerÚRequestPayloadErrorÚPayloadAccessError)ÚServerr$   zasyncio.Task[None]ÚUNKNOWNú/TFc                   @   s   e Zd ZdZdS )r%   zPayload parsing error.N©Ú__name__Ú
__module__Ú__qualname__Ú__doc__© r/   r/   úG/opt/alt/python38/lib64/python3.8/site-packages/aiohttp/web_protocol.pyr%   9   s   r%   c                   @   s   e Zd ZdZdS )r&   z-Payload was accessed after response was sent.Nr*   r/   r/   r/   r0   r&   =   s   r&   c                       sì  e Zd ZdZdZdZddeeeej	ddddd	d
dœde
jeeeee eeeeeeeedœ‡ fdd„Zedœdd„Zeedœdd„ƒZdHee ddœdd„Ze
jddœ‡ fdd„Zee ddœ‡ fdd„Zedd œd!d"„Zddœd#d$„Ze dd%œd&d'„Z!edd(œd)d*„Z"ddœd+d,„Z#ddœd-d.„Z$e%e&edd/œd0d1„Z'eedd2œd3d4„Z(eedd2œd5d6„Z)ddœd7d8„Z*e%ee+e&ef d9œd:d;„Z,ddœd<d=„Z-e%e&eed>œd?d@„Z.dIe%eee ee e&dBœdCdD„Z/dJe0eee ee ddEœdFdG„Z1‡  Z2S )Kr$   aê  HTTP protocol implementation.

    RequestHandler handles incoming HTTP request. It reads request line,
    request headers and request payload and calls handle_request() method.
    By default it always returns with 404 response.

    RequestHandler handles errors in incoming request, like bad
    status line, bad headers or incomplete payload. If any error occurs,
    connection gets closed.

    :param keepalive_timeout: number of seconds before closing
                              keep-alive connection
    :type keepalive_timeout: int or None

    :param bool tcp_keepalive: TCP keep-alive is on, default is on

    :param bool debug: enable debug mode

    :param logger: custom logger object
    :type logger: aiohttp.log.server_logger

    :param access_log_class: custom class for access_logger
    :type access_log_class: aiohttp.abc.AbstractAccessLogger

    :param access_log: custom logging object
    :type access_log: aiohttp.log.server_logger

    :param str access_log_format: access log format string

    :param loop: Optional event loop

    :param int max_line_size: Optional maximum header line size

    :param int max_field_size: Optional maximum header field size

    :param int max_headers: Optional maximum header size

    r   )Ú_request_countÚ
_keepaliveÚ_managerÚ_request_handlerÚ_request_factoryÚ_tcp_keepaliveÚ_keepalive_timeÚ_keepalive_handleÚ_keepalive_timeoutÚ_lingering_timeÚ	_messagesÚ_message_tailÚ_waiterÚ_error_handlerÚ_task_handlerÚ_upgradeÚ_payload_parserÚ_request_parserZ_reading_pausedÚloggerÚdebugÚ
access_logr   Ú_closeÚ_force_closeÚ_current_requestg     ÀR@TFiþ  i €  g      $@i   )Úkeepalive_timeoutr   rC   Úaccess_log_classrE   Úaccess_log_formatrD   Úmax_line_sizeÚmax_headersÚmax_field_sizeÚlingering_timeÚread_bufsizer'   )ÚmanagerÚlooprI   r   rC   rJ   rE   rK   rD   rL   rM   rN   rO   rP   c             	      sÔ   t ƒ  |¡ d| _d| _d | _|| _|j| _|j| _	|| _
d| _d | _|| _t|ƒ| _tƒ | _d| _d | _d | _d | _d| _d | _t| |||
||td�| _|| _|	| _|| _|r¾|||ƒ| _nd | _d| _d| _ d S )Nr   Fg        ó    )rL   rN   rM   Zpayload_exception)!ÚsuperÚ__init__r1   r2   rH   r3   Zrequest_handlerr4   Zrequest_factoryr5   r6   r7   r8   r9   Úfloatr:   r   r;   r<   r=   r>   r?   r@   rA   r   r%   rB   rC   rD   rE   r   rF   rG   )ÚselfrQ   rR   rI   r   rC   rJ   rE   rK   rD   rL   rM   rN   rO   rP   ©Ú	__class__r/   r0   rU   ˆ   sR    ÿÿ
ù
 ÿzRequestHandler.__init__)Úreturnc                 C   s   d  | jj| jd k	rdnd¡S )Nz<{} {}>Z	connectedZdisconnected)ÚformatrY   r+   Ú	transport©rW   r/   r/   r0   Ú__repr__Ï   s    þzRequestHandler.__repr__c                 C   s   | j S ©N)r9   r]   r/   r/   r0   rI   Õ   s    z RequestHandler.keepalive_timeoutç      .@N)ÚtimeoutrZ   c              
   Ã   sê   d| _ | jdk	r| j ¡  | jr*| j ¡  ttjtjƒ�z t|| j	d��` | j
dk	rj| j
 ¡ sj| j
I dH  | jdk	r„| j t ¡ ¡ | jdk	r¤| j ¡ s¤| jI dH  W 5 Q R X W 5 Q R X | jdk	rÌ| j ¡  | jdk	ræ| j ¡  d| _dS )zŸWorker process is about to exit, we need cleanup everything and
        stop accepting requests. It is especially important for keep-alive
        connections.TN©rR   )rG   r8   Úcancelr=   r   ÚasyncioÚCancelledErrorÚTimeoutErrorr   Ú_loopr>   ÚdonerH   Ú_cancelr?   r\   Úclose)rW   ra   r/   r/   r0   ÚshutdownÙ   s$    



 



zRequestHandler.shutdown)r\   rZ   c                    sX   t ƒ  |¡ ttj|ƒ}| jr&t|ƒ | j |  	¡ ¡| _
| jd k	sFt‚| j | |¡ d S r_   )rT   Úconnection_mader   rd   Z	Transportr6   r   rg   Úcreate_taskÚstartr?   r3   ÚAssertionError)rW   r\   Zreal_transportrX   r/   r0   rl   ù   s    zRequestHandler.connection_made)ÚexcrZ   c                    sà   | j d krd S | j  | |¡ tƒ  |¡ d | _ d| _d | _d | _d | _| jd k	rZ| j ¡  | j	d k	r€|d krtt
dƒ}| j	 |¡ | jd k	r”| j ¡  | jd k	r¨| j ¡  | jd k	r¼| j ¡  d | _| jd k	rÜ| j ¡  d | _d S )NTzConnection lost)r3   Úconnection_lostrT   rG   r5   r4   rB   r8   rc   rH   ÚConnectionResetErrorri   r>   r?   r=   rA   Zfeed_eof)rW   rp   rX   r/   r0   rq     s2    











zRequestHandler.connection_lost)ÚparserrZ   c                 C   s2   | j d kst‚|| _ | jr.| j  | j¡ d| _d S )NrS   )rA   ro   r<   Ú	feed_data)rW   rs   r/   r/   r0   Ú
set_parser&  s
    zRequestHandler.set_parserc                 C   s   d S r_   r/   r]   r/   r/   r0   Úeof_received0  s    zRequestHandler.eof_received)ÚdatarZ   c           
      C   s¢  | j s| jrd S | jd k�rP| j�sP| jd k	s2t‚z| j |¡\}}}W n– tk
r– } z0| j 	|  
t| | jƒd||j¡¡| _|  ¡  W 5 d }~X Y n¸ tk
rÞ } z,| j 	|  
t| | jƒd|¡¡| _|  ¡  W 5 d }~X Y npX |�r6|D ]&\}}|  jd7  _| j ||f¡ qê| j}|d k	�r6| ¡ �s6| d ¡ || _|�rž|�rž|| _nN| jd k�rz| j�rz|�rz|  j|7  _n$|�rž| j |¡\}	}|	�rž|  ¡  d S )Ni�  éô  r   )rG   rF   rA   r@   rB   ro   rt   r   rg   rm   Úhandle_parse_errorr   Úmessager>   rj   Ú	Exceptionr1   r;   Úappendr=   rh   Ú
set_resultr<   )
rW   rw   ÚmessagesZupgradedÚtailrp   ÚmsgÚpayloadÚwaiterÚeofr/   r/   r0   Údata_received3  sL    
   ÿÿÿ


zRequestHandler.data_received)ÚvalrZ   c                 C   s    || _ | jr| j ¡  d| _dS )zMSet keep-alive connection mode.

        :param bool val: new state.
        N)r2   r8   rc   )rW   r…   r/   r/   r0   Ú
keep_alived  s    
zRequestHandler.keep_alivec                 C   s   d| _ | jr| j ¡  dS )ziStop accepting new pipelinig messages and close
        connection when handlers done processing messagesTN)rF   r=   rc   r]   r/   r/   r0   rj   n  s    zRequestHandler.closec                 C   s4   d| _ | jr| j ¡  | jdk	r0| j ¡  d| _dS )zForce close connectionTN)rG   r=   rc   r\   rj   r]   r/   r/   r0   Úforce_closeu  s    


zRequestHandler.force_close)ÚrequestÚresponseÚtimerZ   c                 C   s(   | j d k	r$| j  ||| j ¡ | ¡ d S r_   )r   Úlogrg   rŠ   )rW   rˆ   r‰   rŠ   r/   r/   r0   Ú
log_access~  s    
zRequestHandler.log_access)ÚargsÚkwrZ   c                 O   s   | j r| jj ||Ž d S r_   )rD   rC   ©rW   r�   rŽ   r/   r/   r0   Ú	log_debug„  s    zRequestHandler.log_debugc                 O   s   | j j||Ž d S r_   )rC   Ú	exceptionr�   r/   r/   r0   Úlog_exceptionˆ  s    zRequestHandler.log_exceptionc                 C   sT   | j s| jsd S | j| j }| jr<| j ¡ |kr<|  ¡  d S | j | j	| j
¡| _d S r_   )rG   r2   r7   r9   r=   rg   rŠ   r‡   Z
call_laterÚKEEPALIVE_RESCHEDULE_DELAYÚ_process_keepaliver8   )rW   Únextr/   r/   r0   r”   ‹  s     ÿz!RequestHandler._process_keepalive)rˆ   Ú
start_timerZ   c              
   Ã   sL  | j d k	st‚z(z|| _|   |¡I d H }W 5 d | _X W nø tk
r„ } z0t|j|j|j|jd�}|  	|||¡I d H }W 5 d }~X Y nÀ t
jk
rš   ‚ Y nª t
jk
rê } z2| jd|d� |  |d¡}|  	|||¡I d H }W 5 d }~X Y nZ tk
�r. } z&|  |d|¡}|  	|||¡I d H }W 5 d }~X Y nX |  	|||¡I d H }||fS )N)ÚstatusÚreasonÚtextÚheaderszRequest handler timed out.©Úexc_infoiø  rx   )r4   ro   rH   r   r"   r—   r˜   r™   rš   Úfinish_responserd   re   rf   r�   Úhandle_errorr{   )rW   rˆ   r–   Úresprp   Úresetr/   r/   r0   Ú_handle_request�  s2       ÿ$$&zRequestHandler._handle_requestc                 Ã   sÊ  | j }| j}|dk	st‚| j}|dk	s*t‚| j}d}| jdk	sBt‚| jdk	sPt‚| j�s–| js¨z@z| 
¡ | _	| j	I dH  W n  tjk
rš   Y W ¢�q–Y nX W 5 d| _	X | j ¡ \}}| ¡ }| jd7  _t| |ƒ}	|  ||| |	|¡}
d�z$�zv| j  |  |
|¡¡}z|I dH \}}W n6 tjtfk
�rN   |  d¡ Y W W �¢Î �q–Y nX t|ddƒ�rjt dt¡ ~|�rŠ|  d¡ W W �¢Ž �q–t |j!ƒ| _| "¡ �sX| j#}| j�s4|�r4|  d	|¡ | ¡ }|| }t$tj%tjƒ�P | "¡ �s*||k �r*t&|| |d
�� | '¡ I dH  W 5 Q R X | ¡ }�qàW 5 Q R X | "¡ �sX| j�sX|  d¡ |  (¡  | )t*ƒ ¡ W n¦ tjk
�r”   |  d¡ Y W ¢ˆ �q–Y nz t+k
�rÔ } z"| j,�r¼| j-d|d� |  .¡  W 5 d}~X Y n: t/k
�r } z| j-d|d� |  .¡  W 5 d}~X Y nX W 5 | jdk�r4|dk	�r4|  d¡ n\| j�s�| j�rˆ| j�sˆ|dk	�r�| j  ¡ }|| _| jdk�r�| || | j¡| _n£  �q–X  qP| j�sÆd| _| jdk	�rÆ| j0dk�rÆ| j (¡  dS )a_  Process incoming request.

        It reads request line, request headers and request payload, then
        calls handle_request() method. Subclass has to override
        handle_request(). start() handles various exceptions in request
        or response handling. Connection is being closed always unless
        keep_alive(True) specified.
        Nr   z'Ignored premature client disconnection.z&Ignored premature client disconnectionZ__http_exception__Fzlreturning HTTPException object is deprecated (#2415) and will be removed, please raise the exception insteadz(Ignored premature client disconnection 2z'Start lingering close timer for %s sec.rb   zUncompleted request.z'Ignored premature client disconnection zUnhandled runtime exceptionr›   zUnhandled exception)1rg   r?   ro   r3   r9   r5   r4   rG   r;   r=   Zcreate_futurerd   re   ÚpopleftrŠ   Zrequests_countr   r\   r�   r2   rF   r7   r8   Zcall_atr”   rm   r¡   ÚConnectionErrorÚgetattrÚwarningsÚwarnÚDeprecationWarningÚboolr†   Zis_eofr:   r   rf   r   Zreadanyrj   Úset_exceptionr&   ÚRuntimeErrorrD   r’   r‡   r{   r>   )rW   rR   ÚhandlerrQ   rI   rŸ   rz   r�   rn   Úwriterrˆ   ÚnowÚtaskr    rO   Zend_trp   r/   r/   r0   rn   ¼  s¨    	



ü

 ÿ



 ÿzRequestHandler.start)rˆ   rŸ   r–   rZ   c                 Ã   sÒ   | j dk	r6| j  d¡ d| _| jr6| j  | j¡ d| _z
|j}W n4 tk
rt   |dkrbtdƒ‚ntd |¡ƒ‚Y nX z ||ƒI dH  | 	¡ I dH  W n$ t
k
rº   |  |||¡ Y dS X |  |||¡ dS dS )a   
        Prepare the response and write_eof, then log access. This has to
        be called within the context of any exception so the access logger
        can get exception information. Returns True if the client disconnects
        prematurely.
        NFrS   z+Missing return statement on request handlerz7Web-handler should return a response instance, got {!r}T)rB   Zset_upgradedr@   r<   rt   ÚprepareÚAttributeErrorrª   r[   Ú	write_eofr£   rŒ   )rW   rˆ   rŸ   r–   Zprepare_methr/   r/   r0   r�   4  s0    	


þÿ
zRequestHandler.finish_responserx   )rˆ   r—   rp   rz   rZ   c           
   	   C   sà   | j d|d� d}|tjkr¨d tj¡}tjj}d}| jrVttƒ� t 	¡ }W 5 Q R X d|j
 dd¡kr”|r€t|ƒ}d	|› d
�}dj||d�}d}n|rœ|}|d | }t|||d�}	|	 ¡  |jjdksÔ| jdkrÜ|  ¡  |	S )z’Handle errors.

        Returns HTTP response with specific status code. Logs additional
        information. It always closes current connection.zError handling requestr›   z
text/plainz{0.value} {0.phrase}Nz	text/htmlZAcceptÚ z<h2>Traceback:</h2>
<pre>z</pre>zV<html><head><title>{title}</title></head><body>
<h1>{title}</h1>
{msg}
</body></html>
)Útitler€   z

)r—   r™   Úcontent_typer   )r’   r   ZINTERNAL_SERVER_ERRORr[   ÚdescriptionrD   r   r{   Ú	tracebackÚ
format_excrš   ÚgetÚhtml_escaper"   r‡   r¬   Zoutput_sizer\   )
rW   rˆ   r—   rp   rz   Úctr³   r€   ÚtbrŸ   r/   r/   r0   rž   X  s6    

ÿ ûzRequestHandler.handle_error)r¬   r—   rp   rz   rZ   c                 Ã   sr   t ƒ }|d k	st‚ttt| ||| jƒ}|  ||||¡}| |¡I d H  | ¡ I d H  | j	d k	rh| j	 
¡  d | _d S r_   )r   ro   r!   ÚERRORr   rg   rž   r¯   r±   r\   rj   r>   )rW   r¬   r—   rp   rz   r®   rˆ   rŸ   r/   r/   r0   ry   ‡  s          ÿ

z!RequestHandler.handle_parse_error)r`   )rx   NN)NN)3r+   r,   r-   r.   r“   Ú	__slots__r   r    r   Z
LOG_FORMATrd   ZAbstractEventLooprV   r¨   r   r   r   ÚstrÚintrU   r^   ÚpropertyrI   r   rk   ZBaseTransportrl   ÚBaseExceptionrq   r   ru   rv   Úbytesr„   r†   rj   r‡   r!   r#   rŒ   r�   r’   r”   r   r¡   rn   r�   rž   r   ry   Ú__classcell__r/   r/   rX   r0   r$   A   s    '"ððG "
1

  þ
üy  þ'   ûú3  ûú)Brd   Zasyncio.streamsr¶   r¥   Úcollectionsr   Ú
contextlibr   Úhtmlr   r¹   Úhttpr   Úloggingr   Útypingr   r   r	   r
   r   r   r   r   ZyarlÚabcr   r   Zbase_protocolr   Zhelpersr   r   r   r   r   r   r   r‹   r   r   Zstreamsr   r   Ztcp_helpersr   Zweb_exceptionsr   Zweb_logr    Zweb_requestr!   Zweb_responser"   r#   Ú__all__Z
web_serverr'   Z_RequestFactoryZ_RequestHandlerÚURLr¼   r{   r%   r&   r$   r/   r/   r/   r0   Ú<module>   sd   (ûùÿ         ÿ