o
    4˜Žjty  ã                   @   s<  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
 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 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" d
dl#m$Z$m%Z% d
dlm&Z&m'Z'm(Z(m)Z)m*Z*m+Z+ d
dl,m-Z- d
dl.m/Z/m0Z0 d
dl1m2Z2m3Z3 d
dl4m5Z5 d
dl6m7Z7m8Z8 d
dl9m:Z: d
dl;m<Z< d
dl=m>Z>m?Z? dZ@dZAerÆd dlBZBd
dlCmDZD e	e)e3dedge<f ZEe	e<gee? f ZFe)dde(i i dddde Gd¡ƒ
ZHG d d!„ d!eIƒZJG d"d#„ d#eIƒZKeKƒ ZLejMdddd$�G d%d&„ d&ƒƒZNeOe)eNB e3f ZPG d'd„ de"ƒZQdS )(é    N)Údeque)Ú	AwaitableÚCallableÚSequence)Úsuppress)Úescape)Ú
HTTPStatus)ÚLogger)ÚTYPE_CHECKINGÚAnyÚOptionalÚcast)Úunder_cached_propertyé   )ÚAbstractAccessLoggerÚAbstractStreamWriter)ÚPAUSE_RESUME_READING_ERRORSÚBaseProtocol)ÚDEFAULT_CHUNK_SIZEÚceil_timeout)ÚHttpProcessingErrorÚHttpRequestParserÚHttpVersion10ÚRawRequestMessageÚStreamWriterÚWebSocketReader)ÚBadHttpMethod)Úaccess_loggerÚserver_logger)ÚEMPTY_PAYLOADÚStreamReader)Útcp_keepalive)ÚHTTPExceptionÚHTTPInternalServerError)ÚAccessLogger)ÚBaseRequest)ÚResponseÚStreamResponse)ÚRequestHandlerÚRequestPayloadErrorÚPayloadAccessErroré    )ÚServerr(   zasyncio.Task[None]ÚUNKNOWNú/TFc                   @   ó   e Zd ZdZdS )r)   zPayload parsing error.N©Ú__name__Ú
__module__Ú__qualname__Ú__doc__© r5   r5   úQ/var/www/kodo/Anonymous/send/lib/python3.10/site-packages/aiohttp/web_protocol.pyr)   N   ó    r)   c                   @   r/   )r*   z-Payload was accessed after response was sent.Nr0   r5   r5   r5   r6   r*   R   r7   r*   )Úauto_attribsÚfrozenÚslotsc                   @   s&   e Zd ZU eed< eed< eed< dS )Ú_ErrInfoÚstatusÚexcÚmessageN)r1   r2   r3   ÚintÚ__annotations__ÚBaseExceptionÚstrr5   r5   r5   r6   r;   Y   s   
 r;   c                !       s  e Zd ZdZdZddeeeejddddde	dd	d
œddde
jdedededee dedededededededededef ‡ fdd„Zdefdd „Zeded! fd"d#„ƒZedeeeeeef B eeef B d$B fd%d&„ƒZedeeeeeef B eeef B d$B fd'd(„ƒZedefd)d*„ƒZdid,ed$B dd$fd-d.„Zd/e
jdd$f‡ fd0d1„Zd2e d$B dd$f‡ fd3d4„Z!	$djd5e"d6e#g d$f d$B dd$fd7d8„Z$dkd9d:„Z%d;e&dd$fd<d=„Z'defd>d?„Z(dkd@dA„Z)dkdBdC„Z*dDedd$fdEdF„Z+dkdGdH„Z,dkdIdJ„Z-dKe.dLe/dMed$B dd$fdNdO„Z0dPe1dQe1dd$fdRdS„Z2dPe1dQe1dd$fdTdU„Z3dkdVdW„Z4dKe.dXed$B dYe#e.ge5e/ f dee/ef fdZd[„Z6dkd\d]„Z7dKe.d^e/dXed$B dee/ef fd_d`„Z8	a	$	$dldKe.dbed2e d$B dced$B de/f
ddde„Z9dfe:de#e.ge5e/ f fdgdh„Z;‡  Z<S )mr(   aj  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.

    keepalive_timeout -- number of seconds before closing
                         keep-alive connection

    tcp_keepalive -- TCP keep-alive is on, default is on

    debug -- enable debug mode

    logger -- custom logger object

    access_log_class -- custom class for access_logger

    access_log -- custom logging object

    access_log_format -- access log format string

    loop -- Optional event loop

    max_line_size -- Optional maximum header line size

    max_field_size -- Optional maximum header field size

    max_headers -- Optional maximum header size

    timeout_ceil_threshold -- Optional value to specify
                              threshold to ceil() timeout
                              values

    )"Úmax_field_sizeÚmax_headersÚmax_line_sizeÚ_request_countÚ
_keepaliveÚ_managerÚ_request_handlerÚ_request_factoryÚ_tcp_keepaliveÚ_next_keepalive_close_timeÚ_keepalive_handleÚ_keepalive_timeoutÚ_lingering_timeÚ	_messagesÚ_max_msg_queue_sizeÚ_msg_queue_resume_sizeÚ_msg_queue_pausedÚ_message_tailÚ_handler_waiterÚ_waiterÚ_task_handlerÚ_payload_parserÚ_data_received_cbÚloggerÚdebugÚ
access_logr   Ú_closeÚ_force_closeÚ_current_requestÚ_timeout_ceil_thresholdÚ_request_in_progressÚ_logging_enabledÚ_cachei.  TFiþ  é€   g      $@é   )Úkeepalive_timeoutr!   rZ   Úaccess_log_classr\   Úaccess_log_formatr[   rE   rD   rC   Úlingering_timeÚread_bufsizeÚauto_decompressÚtimeout_ceil_thresholdÚmanagerr,   Úlooprf   r!   rZ   rg   r\   rh   r[   rE   rD   rC   ri   rj   rk   rl   c                   sH  t | _t d | _d| _t| |||
||t|t d�	}tƒ  ||¡ d| _d| _	d | _
|| _|j| _|j| _|
| _|| _|| _|| _d| _d | _|| _t|ƒ| _tƒ | _d| _d | _d | _d | _d | _d | _ d| _!zt|ƒ| _!W n t"t#fyx   Y nw || _$|	| _%|| _&|r�|||ƒ| _'| j'j(| _)nd | _'d| _)d| _*d| _+d| _,i | _-d S )Né   F)rE   rC   rD   Úpayload_exceptionrk   Úmax_msg_queue_sizer   g        ó    re   ).ÚMAX_MSG_QUEUE_SIZErQ   rR   rS   r   r)   ÚsuperÚ__init__rF   rG   r_   rH   Úrequest_handlerrI   Úrequest_factoryrJ   rE   rD   rC   rK   rL   rM   rN   ÚfloatrO   r   rP   rT   rY   rV   rU   rW   rX   r`   Ú	TypeErrorÚ
ValueErrorrZ   r[   r\   r   Úenabledrb   r]   r^   ra   rc   )Úselfrm   rn   rf   r!   rZ   rg   r\   rh   r[   rE   rD   rC   ri   rj   rk   rl   Úparser©Ú	__class__r5   r6   ru   °   sp   
÷
ÿÿ
zRequestHandler.__init__Úreturnc                 C   s    d  | jj| jd urd¡S d¡S )Nz<{} {}>Ú	connectedÚdisconnected)Úformatr   r1   Ú	transport©r|   r5   r5   r6   Ú__repr__  s   þþzRequestHandler.__repr__zssl.SSLContextc                 C   ó   | j du rdS | j  d¡S )zReturn SSLContext if available.NÚ
sslcontext©r„   Úget_extra_infor…   r5   r5   r6   Ússl_context  s
   
ÿÿ
ýzRequestHandler.ssl_contextNc                 C   r‡   )zReturn peername if available.NÚpeernamer‰   r…   r5   r5   r6   rŒ     ó
   
ÿÿ
ýzRequestHandler.peernamec                 C   r‡   )zReturn sockname if available.NÚsocknamer‰   r…   r5   r5   r6   rŽ   &  r�   zRequestHandler.socknamec                 C   ó   | j S ©N)rN   r…   r5   r5   r6   rf   1  s   z RequestHandler.keepalive_timeoutç      .@Útimeoutc              	   Ã   s˜  �d| _ | jdur| j ¡  | jr^| j ¡ | _z&t|ƒ4 I dH š | jI dH  W d  ƒI dH  n1 I dH s7w   Y  W n  tj	tj
fy]   d| _tjdkr[t ¡  }r[| ¡ r[‚ Y nw z@t|ƒ4 I dH š+ | jduru| j t 	¡ ¡ | jdurˆ| j ¡ sˆt | j¡I dH  W d  ƒI dH  n1 I dH s˜w   Y  W n tj	tj
fy»   tjdkr¹t ¡  }r¹| ¡ r¹‚ Y nw | jdurÆ| j ¡  |  ¡  dS )z±Do worker process exit preparations.

        We need to clean up everything and stop accepting requests.
        It is especially important for keep-alive connections.
        TN©é   é   )r^   rM   Úcancelra   Ú_loopÚcreate_futurerU   r   ÚasyncioÚCancelledErrorÚTimeoutErrorÚsysÚversion_infoÚcurrent_taskÚ
cancellingr_   Ú_cancelrW   ÚdoneÚshieldÚforce_close)r|   r’   Útaskr5   r5   r6   Úshutdown5  sT   €

(ÿ€

ÿþ€ù	
€(û€

ÿþ€ú
	
zRequestHandler.shutdownr„   c                    s€   t ƒ  |¡ ttj|ƒ}| jrt|ƒ | jd usJ ‚| j | |¡ | j}t	j
dkr4tj|  ¡ |dd�}n| |  ¡ ¡}|| _d S )N©r”   é   T©rn   Úeager_start)rt   Úconnection_mader   r™   Ú	TransportrK   r!   rH   r—   rœ   r�   ÚTaskÚstartÚcreate_taskrW   )r|   r„   Úreal_transportrn   r¤   r~   r5   r6   rª   g  s   

zRequestHandler.connection_mader=   c                    sÊ   | j d u rd S | j  | |¡ | j j}|  ¡  tƒ  |¡ d | _ d | _d | _d | _| jd ur2| j 	¡  | j
d urE|d u r?tdƒ}| j
 |¡ |rQ| jd urQ| j 	¡  d | _| jd urc| j ¡  d | _d S d S )NzConnection lost)rH   Úconnection_lostÚhandler_cancellationr£   rt   rJ   rI   Ú_parserrM   r–   r_   ÚConnectionResetErrorr    rW   rX   Úfeed_eof)r|   r=   r±   r~   r5   r6   r°   x  s.   







þzRequestHandler.connection_lostr}   Údata_received_cbc                 C   s<   | j d u sJ ‚|| _ || _| jr| j  | j¡ d| _d S d S )Nrr   )rX   rY   rT   Ú	feed_data)r|   r}   rµ   r5   r5   r6   Ú
set_parser˜  s   
þzRequestHandler.set_parserc                 C   s   d S r�   r5   r…   r5   r5   r6   Úeof_received¦  s   zRequestHandler.eof_receivedÚdatac           
   
   C   sz  | j s| jrd S | jd u r‹| js‹| jd usJ ‚z| j |¡\}}}W n! tyC } ztd||jd�t	fg}d}d}W Y d }~nd }~ww |D ]\}}|  j
d7  _
| j ||f¡ qF| j}|rl|d url| ¡ sl| d ¡ | js{t| jƒ| jkr{|  ¡  || _|r‡|r‰|| _d S d S d S | jd u rž| jrž|rž|  j|7  _d S |r¹| jd ur©|  ¡  | j |¡\}	}|	r»|  ¡  d S d S d S )Ni�  )r<   r=   r>   Frr   r   )r^   r]   rX   Ú	_upgradedr²   r¶   r   r;   r>   r   rF   rP   ÚappendrV   r¡   Ú
set_resultrS   ÚlenrQ   Ú_pause_msg_queue_readingrT   rY   Úclose)
r|   r¹   ÚmessagesÚupgradedÚtailr=   ÚmsgÚpayloadÚwaiterÚeofr5   r5   r6   Údata_received©  sJ   ÿ€û
ÿ
ÿ
ûzRequestHandler.data_receivedc                 C   r�   r�   )rS   r…   r5   r5   r6   Ú_reading_paused_for_msg_queueÚ  s   z,RequestHandler._reading_paused_for_msg_queuec                 C   s:   d| _ | jd urz| j ¡  W d S  ty   Y d S w d S )NT)rS   r„   Úpause_readingr   r…   r5   r5   r6   r¾   Ý  s   
ýýz'RequestHandler._pause_msg_queue_readingc                 C   sh   | j s|  d¡ t| jƒ| jkrd S d| _| js0| jd ur2z| j ¡  W d S  t	y/   Y d S w d S d S )Nrr   F)
rº   rÇ   r½   rP   rQ   rS   Ú_reading_pausedr„   Úresume_readingr   r…   r5   r5   r6   Ú_resume_msg_queue_readingç  s   
ýýz(RequestHandler._resume_msg_queue_readingÚvalc                 C   s$   || _ | jr| j ¡  d| _dS dS )zMSet keep-alive connection mode.

        :param bool val: new state.
        N)rG   rM   r–   )r|   rÍ   r5   r5   r6   Ú
keep_aliveø  s
   

þzRequestHandler.keep_alivec                 C   s   d| _ | jr| j ¡  dS dS )z�Close connection.

        Stop accepting new pipelining messages and close
        connection when handlers done processing messages.
        TN)r]   rV   r–   r…   r5   r5   r6   r¿     s   ÿzRequestHandler.closec                 C   s8   d| _ | jr| j ¡  | jdur| j ¡  d| _dS dS )zForcefully close connection.TN)r^   rV   r–   r„   r¿   r…   r5   r5   r6   r£     s   



þzRequestHandler.force_closeÚrequestÚresponseÚtimec                 C   sF   | j r| jd ur!tr|d usJ ‚| j ||| j ¡ | ¡ d S d S d S r�   )rb   r   r
   Úlogr—   rÑ   )r|   rÏ   rÐ   rÑ   r5   r5   r6   Ú
log_access  s
   ýzRequestHandler.log_accessÚargsÚkwc                 O   s    | j r| jj |i |¤Ž d S d S r�   )r[   rZ   ©r|   rÔ   rÕ   r5   r5   r6   Ú	log_debug  s   ÿzRequestHandler.log_debugc                 O   s   | j j|i |¤Ž d S r�   )rZ   Ú	exceptionrÖ   r5   r5   r6   Úlog_exception!  s   zRequestHandler.log_exceptionc                 C   sj   d | _ | js	| jsd S | j}| ¡ }| j}||k r#| || j¡| _ d S | jr1| j 	¡ s3|  
¡  d S d S d S r�   )rM   r^   rG   r—   rÑ   rL   Úcall_atÚ_process_keepaliverV   r¡   r£   )r|   rn   ÚnowÚ
close_timer5   r5   r6   rÛ   $  s   ÿz!RequestHandler._process_keepaliveÚ
start_timerv   c              
   Ã   sœ  �d| _ z¹zz|| _||ƒI d H }W d | _nd | _w W nw ty; } z|}|  |||¡I d H \}}W Y d }~ntd }~w tjyC   ‚  tjyn } z| jd|d� |  |d¡}|  |||¡I d H \}}W Y d }~nAd }~w t	y’ } z|  |d|¡}|  |||¡I d H \}}W Y d }~nd }~ww t
|ddƒrŸt dt¡ |  |||¡I d H \}}W d| _ | jd urº| j d ¡ ||fS d| _ | jd urÍ| j d ¡ w w )	NTzRequest handler timed out.©Úexc_infoiø  éô  Ú__http_exception__Fzlreturning HTTPException object is deprecated (#2415) and will be removed, please raise the exception instead)ra   r_   r"   Úfinish_responser™   rš   r›   r×   Úhandle_errorÚ	ExceptionÚgetattrÚwarningsÚwarnÚDeprecationWarningrU   r¼   )r|   rÏ   rÞ   rv   Úrespr=   Úresetr5   r5   r6   Ú_handle_request5  sL   €$€$€$€þü€
ü
ÿzRequestHandler._handle_requestc              
   Ã   s|  �| j }| j}|dusJ ‚| j}d}| jdusJ ‚| jdus J ‚| j�s&| js<z| ¡ | _| jI dH  W d| _nd| _w | j 	¡ \}}| j
durM| j
 ¡  | jr\t| jƒ| jkr\|  ¡  | jrc| ¡ nd}| jd7  _t| |ƒ}t|tƒr~|  |¡}	t}n| j}	|  ||| || jpŽt |¡¡}
�zV�z|  |
||	¡}tjdkr©tj||dd�}n| |¡}z	|I dH \}}W n" t yÙ   |  !d¡ Y W W d|
_"| j#du r×|dur×|  !d¡ �nMw ~|r÷|  !d¡ W W d|
_"| j#du rõ|durõ|  !d¡ �n/t$|j%ƒ| _&| '¡ �s�| j(}| j�s~|�r~|  !d	|¡ | ¡ }|| }zB| '¡ �s[||k �r[t)|| ƒ4 I dH š | *¡ I dH  W d  ƒI dH  n1 I dH �sHw   Y  | ¡ }| '¡ �s[||k �s%W n! tj+tj,f�y}   tjd
k�r{t ¡  }�r{| -¡ �r{‚ Y nw | '¡ �s�| j�s�|  !d¡ |  .¡  | /t0¡ W n< tj+�y©   |  !d¡ |  1¡  ‚  t2�yÆ } z| j3d|d� |  1¡  W Y d}~nd}~w t4�yÒ   |  1¡  ‚ w W d|
_"| j#du �rç|du�rç|  !d¡ nd|
_"| j#du �rü|du�rý|  !d¡ w w w | j&�r"| j5�s"| j�s"| ¡ | }|| _6| j7du �r!| 8|| j9¡| _7nn| jr$| j�s:d| _| j#du�r<| j# .¡  dS dS 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   r¦   Tr¨   z&Ignored premature client disconnectionz'Ignored premature client disconnection.z(Ignored premature client disconnection 2z'Start lingering close timer for %s sec.r“   zUncompleted request.zUnhandled exceptionrß   ):r—   rH   rN   rJ   rI   r^   rP   r˜   rV   Úpopleftr²   Úmessage_consumedrS   r½   rR   rÌ   rb   rÑ   Úrequests_countr   Ú
isinstancer;   Ú_make_error_handlerÚERRORrW   r™   rž   rì   rœ   r�   r¬   r®   ÚConnectionErrorr×   Ú_taskr„   ÚboolrÎ   rG   Úis_eofrO   r   Úreadanyrš   r›   rŸ   r¿   Úset_exceptionÚ_PAYLOAD_ACCESS_ERRORr£   rå   rÙ   rA   r]   rL   rM   rÚ   rÛ   )r|   rn   rm   rf   rê   r>   rÄ   r­   Úwriterrv   rÏ   Úcoror¤   rë   ri   rÜ   Úend_tÚtr=   rÝ   r5   r5   r6   r­   `  sú   €	


ÿ


û


6
€Æ
0
€Ñ
ÿ*þü€
ÿþ€ú	

€þ€
€þÿÿ€„ýzRequestHandler.startrê   c              	   Ã   sF  �|  ¡  | jdur@| j d¡ d| _| jr@| j | j¡\}}}|| _|D ]\}}|  jd7  _| j ||f¡ q%| j	du s@J ‚z|j
}	W n- tyr   |du rV|  d¡ n|  d|›�¡ tƒ }
t|
j|
j|
j|
jd�}|j
}	Y nw z|	|ƒI dH  | ¡ I dH  W n ty—   |  |||¡ |df Y S w |  |||¡ |df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.
        NFr   z+Missing return statement on request handlerz3Web-handler should return a response instance, got )r<   ÚreasonÚtextÚheadersT)Ú_finishr²   Úset_upgradedrº   rT   r¶   rF   rP   r»   rV   ÚprepareÚAttributeErrorrÙ   r#   r&   r<   rþ   rÿ   r   Ú	write_eofró   rÓ   )r|   rÏ   rê   rÞ   rÀ   rº   rÂ   rÃ   rÄ   Úprepare_methr=   r5   r5   r6   rã   õ  sF   €


ÿÿ
õþzRequestHandler.finish_responserá   r<   r>   c           
      C   s,  | j dkrt|tƒr| jjd|j|d� n	| jd|j|d� |jjdkr(t	dƒ‚d}|t
jkr‰t
jj› dt
jj› �}t
jj}d}| jr[ttƒ� t ¡ }W d  ƒ n1 sVw   Y  d	|j d
d¡v r|rpt|ƒ}d|› d�}d|› d|› d|› d�}d	}n
|rƒ|}|d | }t|||d�}	|	 ¡  |	S )z›Handle errors.

        Returns HTTP response with specific status code. Logs additional
        information. It always closes current connection.
        r   zError handling request from %srß   r   zMResponse is sent already, cannot send another response with the error messagez
text/plainú Nz	text/htmlÚAcceptÚ z<h2>Traceback:</h2>
<pre>z</pre>z<html><head><title>z</title></head><body>
<h1>z</h1>
z
</body></html>
z

)r<   rÿ   Úcontent_type)rF   rð   r   rZ   r[   ÚremoterÙ   rú   Úoutput_sizeró   r   ÚINTERNAL_SERVER_ERRORÚvalueÚphraseÚdescriptionr   rå   Ú	tracebackÚ
format_excr   ÚgetÚhtml_escaper&   r£   )
r|   rÏ   r<   r=   r>   ÚctÚtitlerÃ   Útbrê   r5   r5   r6   rä   $  sN   ÿÿÿ


ÿÿþýÿzRequestHandler.handle_errorÚerr_infoc                    s   dt dtf‡ ‡fdd„}|S )NrÏ   r€   c                 “   s   �ˆ  | ˆ jˆ jˆ j¡S r�   )rä   r<   r=   r>   )rÏ   ©r  r|   r5   r6   Úhandlere  s   €ÿz3RequestHandler._make_error_handler.<locals>.handler)r%   r'   )r|   r  r  r5   r  r6   rñ   b  s   z"RequestHandler._make_error_handler)r‘   r�   )r€   N)rá   NN)=r1   r2   r3   r4   Ú	__slots__r   r$   r   Ú
LOG_FORMATr   r™   ÚAbstractEventLooprx   rõ   r	   Útyper   rB   r?   ru   r†   r   r   r‹   ÚtuplerŒ   rŽ   Úpropertyrf   r¥   ÚBaseTransportrª   rA   r°   r   r   r·   r¸   ÚbytesrÇ   rÈ   r¾   rÌ   rÎ   r¿   r£   r%   r'   rÓ   r   r×   rÙ   rÛ   r   rì   r­   rã   rä   r;   rñ   Ú__classcell__r5   r5   r~   r6   r(   c   s
   '+íþüúùø	÷
öõôóòñðïîí\"þ
"þ
2#ýþý
ü
1






	ÿÿÿ
þ
þýü

û
+ ÿÿÿ

þ2ûþýüû
ú>ÿþ)Rr™   Úasyncio.streamsrœ   r  rç   Úcollectionsr   Úcollections.abcr   r   r   Ú
contextlibr   Úhtmlr   r  Úhttpr   Úloggingr	   Útypingr
   r   r   r   ÚattrÚyarlÚ	propcacher   Úabcr   r   Úbase_protocolr   r   Úhelpersr   r   r   r   r   r   r   r   Úhttp_exceptionsr   rÒ   r   r   Ústreamsr   r    Útcp_helpersr!   Úweb_exceptionsr"   r#   Úweb_logr$   Úweb_requestr%   Úweb_responser&   r'   Ú__all__rs   ÚsslÚ
web_serverr,   Ú_RequestFactoryÚ_RequestHandlerÚURLrò   rå   r)   r*   rù   Úsr;   r  Ú_MsgTyper(   r5   r5   r5   r6   Ú<module>   s|     ûùÿö