
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!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]Z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.   r/   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   rB   Úaccess_log_classrD   Úaccess_log_formatrC   Úmax_line_sizeÚmax_headersÚmax_field_sizeÚlingering_timeÚread_bufsizer'   )ÚmanagerÚlooprH   r   rB   rI   rD   rJ   rC   rK   rL   rM   rN   rO   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        ó    )rK   rM   rL   Zpayload_exception)!ÚsuperÚ__init__r0   r1   rG   r2   Zrequest_handlerr3   Zrequest_factoryr4   r5   r6   r7   r8   Úfloatr9   r   r:   r;   r<   r=   r>   r?   r@   r   r%   rA   rB   rC   rD   r   rE   rF   )ÚselfrP   rQ   rH   r   rB   rI   rD   rJ   rC   rK   rL   rM   rN   rO   ©Ú	__class__r.   r/   rT   ˆ   sR    ÿÿ
ù
 ÿzRequestHandler.__init__)Úreturnc                 C   s   d  | jj| jd k	rdnd¡S )Nz<{} {}>Z	connectedZdisconnected)ÚformatrX   r*   Ú	transport©rV   r.   r.   r/   Ú__repr__Ï   s    þzRequestHandler.__repr__c                 C   s   | j S ©N)r8   r\   r.   r.   r/   rH   Õ   s    z RequestHandler.keepalive_timeoutç      .@N)ÚtimeoutrY   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©rQ   )rF   r7   Úcancelr<   r   ÚasyncioÚCancelledErrorÚTimeoutErrorr   Ú_loopr=   ÚdonerG   Ú_cancelr>   r[   Úclose)rV   r`   r.   r.   r/   ÚshutdownÙ   s$    



 



zRequestHandler.shutdown)r[   rY   c                    sX   t ƒ  |¡ ttj|ƒ}| jr&t|ƒ | j |  	¡ ¡| _
| jd k	sFt‚| j | |¡ d S r^   )rS   Úconnection_mader   rc   Z	Transportr5   r   rf   Úcreate_taskÚstartr>   r2   ÚAssertionError)rV   r[   Zreal_transportrW   r.   r/   rk   ù   s    zRequestHandler.connection_made)ÚexcrY   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)r2   Úconnection_lostrS   rF   r4   r3   rA   r7   rb   rG   ÚConnectionResetErrorrh   r=   r>   r<   r@   Zfeed_eof)rV   ro   rW   r.   r/   rp     s2    











zRequestHandler.connection_lost)ÚparserrY   c                 C   s2   | j d kst‚|| _ | jr.| j  | j¡ d| _d S )NrR   )r@   rn   r;   Ú	feed_data)rV   rr   r.   r.   r/   Ú
set_parser&  s
    zRequestHandler.set_parserc                 C   s   d S r^   r.   r\   r.   r.   r/   Úeof_received0  s    zRequestHandler.eof_received)ÚdatarY   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   )rF   rE   r@   r?   rA   rn   rs   r   rf   rl   Úhandle_parse_errorr   Úmessager=   ri   Ú	Exceptionr0   r:   Úappendr<   rg   Z
set_resultr;   )
rV   rv   ZmessagesZupgradedÚtailro   ÚmsgÚpayloadÚwaiterÚeofr.   r.   r/   Údata_received3  sL    
   ÿÿÿ


zRequestHandler.data_received)ÚvalrY   c                 C   s    || _ | jr| j ¡  d| _dS )zMSet keep-alive connection mode.

        :param bool val: new state.
        N)r1   r7   rb   )rV   r‚   r.   r.   r/   Ú
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)rE   r<   rb   r\   r.   r.   r/   ri   n  s    zRequestHandler.closec                 C   s4   d| _ | jr| j ¡  | jdk	r0| j ¡  d| _dS )zForce close connectionTN)rF   r<   rb   r[   ri   r\   r.   r.   r/   Úforce_closeu  s    


zRequestHandler.force_close)ÚrequestÚresponseÚtimerY   c                 C   s(   | j d k	r$| j  ||| j ¡ | ¡ d S r^   )r   Úlogrf   r‡   )rV   r…   r†   r‡   r.   r.   r/   Ú
log_access~  s    
zRequestHandler.log_access)ÚargsÚkwrY   c                 O   s   | j r| jj ||Ž d S r^   )rC   rB   ©rV   rŠ   r‹   r.   r.   r/   Ú	log_debug„  s    zRequestHandler.log_debugc                 O   s   | j j||Ž d S r^   )rB   Z	exceptionrŒ   r.   r.   r/   Ú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^   )rF   r1   r6   r8   r<   rf   r‡   r„   Z
call_laterÚKEEPALIVE_RESCHEDULE_DELAYÚ_process_keepaliver7   )rV   Únextr.   r.   r/   r�   ‹  s     ÿz!RequestHandler._process_keepalive)r…   Ú
start_timerY   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ø  rw   )r3   rn   rG   r   r"   r“   r”   r•   r–   Úfinish_responserc   rd   re   r�   Úhandle_errorrz   )rV   r…   r’   Úrespro   Úresetr.   r.   r/   Ú_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.ra   zUncompleted request.z'Ignored premature client disconnection zUnhandled runtime exceptionr—   zUnhandled exception)1rf   r>   rn   r2   r8   r4   r3   rF   r:   r<   Zcreate_futurerc   rd   Úpopleftr‡   Zrequests_countr   r[   r�   r1   rE   r6   r7   Zcall_atr�   rl   r�   ÚConnectionErrorÚgetattrÚwarningsÚwarnÚDeprecationWarningÚboolrƒ   Zis_eofr9   r   re   r   Zreadanyri   Zset_exceptionr&   ÚRuntimeErrorrC   rŽ   r„   rz   r=   )rV   rQ   ÚhandlerrP   rH   r›   ry   r~   rm   Úwriterr…   ZnowÚtaskrœ   rN   Zend_tro   r.   r.   r/   rm   ¼  s¨    	



ü

 ÿ



 ÿzRequestHandler.start)r…   r›   r’   rY   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.
        NFrR   z+Missing return statement on request handlerz7Web-handler should return a response instance, got {!r}T)rA   Zset_upgradedr?   r;   rs   ÚprepareÚAttributeErrorr¥   rZ   Ú	write_eofrŸ   r‰   )rV   r…   r›   r’   Zprepare_methr.   r.   r/   r™   4  s0    	


þÿ
zRequestHandler.finish_responserw   )r…   r“   ro   ry   rY   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•   Zcontent_typer   )rŽ   r   ZINTERNAL_SERVER_ERRORrZ   ZdescriptionrC   r   rz   Ú	tracebackÚ
format_excr–   ÚgetÚhtml_escaper"   r„   r§   Zoutput_sizer[   )
rV   r…   r“   ro   ry   Zctr­   r}   Útbr›   r.   r.   r/   rš   X  s6    

ÿ ûzRequestHandler.handle_error)r§   r“   ro   ry   rY   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   rn   r!   ÚERRORr   rf   rš   r©   r«   r[   ri   r=   )rV   r§   r“   ro   ry   r¨   r…   r›   r.   r.   r/   rx   ‡  s          ÿ

z!RequestHandler.handle_parse_error)r_   )rw   NN)NN)3r*   r+   r,   r-   r�   Ú	__slots__r   r    r   Z
LOG_FORMATrc   ZAbstractEventLooprU   r¤   r   r   r   ÚstrÚintrT   r]   ÚpropertyrH   r   rj   ZBaseTransportrk   ÚBaseExceptionrp   r   rt   ru   Úbytesr�   rƒ   ri   r„   r!   r#   r‰   r�   rŽ   r�   r   r�   rm   r™   rš   r   rx   Ú__classcell__r.   r.   rW   r/   r$   A   s    '"ððG "
1

  þ
üy  þ'   ûú3  ûú)Brc   Zasyncio.streamsr®   r¡   Úcollectionsr   Ú
contextlibr   Zhtmlr   r±   Zhttpr   Z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_RequestHandlerZURLr³   rz   r%   r&   r$   r.   r.   r.   r/   Ú<module>   sd   (ûùÿ         ÿ