o
    `qe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mZmZmZ d dlZd dlZdd	lmZ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( ddl)m*Z*m+Z+ ddl,m-Z-m.Z. ddl/m0Z0 ddl1m2Z2 ddl3m4Z4 ddl5m6Z6 ddl7m8Z8m9Z9 dZ:erddl;m<Z< ee'e.dedge6f Z=ee6gee9 f Z>e'dde&i i dddde?d
Z@G dd deAZBG dd deAZCejDdddd G d!d" d"ZEeee'eEf e.f ZFG d#d de!ZGdS )$    N)deque)suppress)escape)
HTTPStatus)Logger)TYPE_CHECKINGAny	AwaitableCallableDequeOptionalSequenceTupleTypeUnioncast   )AbstractAccessLoggerAbstractStreamWriter)BaseProtocol)ceil_timeout)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                   @      e Zd ZdZdS )r'   zPayload parsing error.N__name__
__module____qualname____doc__ r2   r2   U/var/www/html/humari/django-venv/lib/python3.10/site-packages/aiohttp/web_protocol.pyr'   N       r'   c                   @   r,   )r(   z-Payload was accessed after response was sent.Nr-   r2   r2   r2   r3   r(   R   r4   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)r.   r/   r0   int__annotations__BaseExceptionstrr2   r2   r2   r3   r8   V   s   
 r8   c                !       sB  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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fd#d$Zd]d&ee d d'fd(d)Zd*e
jd d'f fd+d,Zd-ee d d'f fd.d/Zd0ed d'fd1d2Zd^d3d4Zd5e d d'fd6d7Z!d8ed d'fd9d:Z"d^d;d<Z#d^d=d>Z$d?e%d@e&dAed d'fdBdCZ'dDedEed d'fdFdGZ(dDedEed d'fdHdIZ)d^dJdKZ*d?e%dLedMe+e%ge,e& f d e-e&ef fdNdOZ.d^dPdQZ/d?e%dRe&dLed efdSdTZ0	U	'	'd_d?e%dVed-ee dWee d e&f
dXdYZ1dZe2d e+e%ge,e& f fd[d\Z3  Z4S )`r&   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

    r   )_request_count
_keepalive_manager_request_handler_request_factory_tcp_keepalive_keepalive_time_keepalive_handle_keepalive_timeout_lingering_time	_messages_message_tail_waiter_task_handler_upgrade_payload_parser_request_parser_reading_pausedloggerdebug
access_logr   _close_force_close_current_request_timeout_ceil_thresholdg     R@TFi  i   g      $@i      )keepalive_timeoutr    rR   access_log_classrT   access_log_formatrS   max_line_sizemax_headersmax_field_sizelingering_timeread_bufsizeauto_decompresstimeout_ceil_thresholdmanagerr)   looprZ   r    rR   r[   rT   r\   rS   r]   r^   r_   r`   ra   rb   rc   c             
      s   t  | d| _d| _d | _|| _|j| _|j| _	|| _
d| _d | _|| _t|| _t | _d| _d | _d | _d| _d | _t| |||
||t|d| _d| _zt|| _W n ttfy`   Y nw || _|	| _|| _|rs|||| _ nd | _ d| _!d| _"d S )Nr   Fg            )r]   r_   r^   payload_exceptionrb   rY   )#super__init__r@   rA   rW   rB   request_handlerrC   request_factoryrD   rE   rF   rG   rH   floatrI   r   rJ   rK   rL   rM   rN   rO   r   r'   rP   rX   	TypeError
ValueErrorrR   rS   rT   r   rU   rV   )selfrd   re   rZ   r    rR   r[   rT   r\   rS   r]   r^   r_   r`   ra   rb   rc   	__class__r2   r3   ri      sX   

zRequestHandler.__init__returnc                 C   s    d | jj| jd urdS dS )Nz<{} {}>	connecteddisconnected)formatrq   r.   	transportro   r2   r2   r3   __repr__   s   zRequestHandler.__repr__c                 C   s   | j S N)rH   rw   r2   r2   r3   rZ      s   z RequestHandler.keepalive_timeout      .@timeoutNc              
      s  d| _ | jdur| j  | jr| j  ttjtjC t|4 I dH ( | j	dur4| j	
t  | jdurD| j sD| jI dH  W d  I dH  n1 I dH sTw   Y  W d   n1 scw   Y  | jdurr| j  | jdur| j  d| _dS dS )zDo worker process exit preparations.

        We need to clean up everything and stop accepting requests.
        It is especially important for keep-alive connections.
        TN)rV   rG   cancelrL   r   asyncioCancelledErrorTimeoutErrorr   rW   _cancelrM   donerv   close)ro   r{   r2   r2   r3   shutdown   s,   



(
	



zRequestHandler.shutdownrv   c                    sX   t  | ttj|}| jrt| | j| 	 | _
| jd us#J | j| | d S ry   )rh   connection_mader   r}   	TransportrE   r    _loopcreate_taskstartrM   rB   )ro   rv   real_transportrp   r2   r3   r     s   zRequestHandler.connection_mader:   c                    s   | j d u rd S | j | | t | | j j}d | _ d| _d | _d | _d | _| jd ur1| j	  | j
d urD|d u r>td}| j
| | jd urN| j	  |rZ| jd urZ| j	  d | _| jd url| j  d | _d S d S )NTzConnection lost)rB   connection_lostrh   handler_cancellationrV   rD   rC   rP   rG   r|   rW   ConnectionResetErrorr   rL   rM   rO   feed_eof)ro   r:   r   rp   r2   r3   r   %  s2   









zRequestHandler.connection_lostparserc                 C   s6   | j d u sJ || _ | jr| j | j d| _d S d S )Nrf   )rO   rK   	feed_data)ro   r   r2   r2   r3   
set_parserI  s   
zRequestHandler.set_parserc                 C   s   d S ry   r2   rw   r2   r2   r3   eof_receivedS  s   zRequestHandler.eof_receiveddatac           
   
   C   sN  | 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 |pGdD ]\}}|  j
d7  _
| j||f qH| j}|rn|d urn| sn|d  || _|rz|r||| _d S d S d S | jd u r| jr|r|  j|7  _d S |r| j|\}	}|	r|   d S d S d S )Ni  )r9   r:   r;   Frf   r2   r   )rV   rU   rO   rN   rP   r   r   r8   r;   r   r@   rJ   appendrL   r   
set_resultrK   r   )
ro   r   messagesupgradedtailr:   msgpayloadwaitereofr2   r2   r3   data_receivedV  s>   

zRequestHandler.data_receivedvalc                 C   s$   || _ | jr| j  d| _dS dS )zMSet keep-alive connection mode.

        :param bool val: new state.
        N)rA   rG   r|   )ro   r   r2   r2   r3   
keep_alive}  s
   

zRequestHandler.keep_alivec                 C   s   d| _ | jr| j  dS dS )zClose connection.

        Stop accepting new pipelining messages and close
        connection when handlers done processing messages.
        TN)rU   rL   r|   rw   r2   r2   r3   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)rV   rL   r|   rv   r   rw   r2   r2   r3   force_close  s   



zRequestHandler.force_closerequestresponsetimec                 C   s,   | j d ur| j ||| j |  d S d S ry   )r   logr   r   )ro   r   r   r   r2   r2   r3   
log_access  s   
zRequestHandler.log_accessargskwc                 O   s    | j r| jj |i | d S d S ry   )rS   rR   ro   r   r   r2   r2   r3   	log_debug  s   zRequestHandler.log_debugc                 O   s   | j j|i | d S ry   )rR   	exceptionr   r2   r2   r3   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 ry   )rV   rA   rF   rH   rL   r   r   r   
call_laterKEEPALIVE_RESCHEDULE_DELAY_process_keepaliverG   )ro   nextr2   r2   r3   r     s   
z!RequestHandler._process_keepalive
start_timerj   c              
      sf  | j d usJ zz|| _||I d H }W d | _nd | _w W nz ty? } z|}| |||I d H }W Y d }~||fS d }~w tjyG     tjys } z | jd|d | |d}| |||I d H }W Y d }~||fS d }~w t	y } z| |d|}| |||I d H }W Y d }~||fS d }~ww t
|ddrtdt | |||I d H }||fS )NzRequest handler timed out.exc_infoi    __http_exception__Fzlreturning HTTPException object is deprecated (#2415) and will be removed, please raise the exception instead)rC   rW   r!   finish_responser}   r~   r   r   handle_error	ExceptiongetattrwarningswarnDeprecationWarning)ro   r   r   rj   respr:   resetr2   r2   r3   _handle_request  sB   zRequestHandler._handle_requestc              
      s  | j }| j}|dusJ | j}|dusJ | j}d}| jdus"J | jdus)J | js| jsWz"z| | _	| j	I dH  W n t
jyM   Y W d| _	nw W d| _	nd| _	w | j \}}| }| jd7  _t| |}	t|tr{| |}
t}n| j}
| ||| |	|}zzB| j | |||
}z	|I dH \}}W nL t
jtfy   | d Y W W | jdu r|dur| d n| js| jr| js|dur| j  }|| _| jdu r||| | j| _nnnw ~|r8| d W W | jdu r	|dur	| d n| js6| jr4| js4|dur2| j  }|| _| jdu r2||| | j| _nnnt|j | _|! s| j"}| js|r| d| | }|| }t#t
j$t
jH |! s||k rt%|| 4 I dH  |& I dH  W d  I dH  n1 I dH sw   Y  | }|! s||k smW d   n	1 sw   Y  |! s| js| d | '  |(t)  W n t
jy   | d Y W | jdu r|dur| d n| js| jr| js|dur| j  }|| _| jdu r||| | j| _nnn t*y: } z| j+r,| j,d	|d
 | -  W Y d}~n"d}~w t.yW } z| j,d|d
 | -  W Y d}~nd}~ww W | jdu rj|durj| d nm| js| jr| js|dur| j  }|| _| jdu r||| | j| _nCnEnA| jdu r|dur| d w | js| jr| js|dur| j  }|| _| jdu r||| | j| _w    Y nw | jr-| jsd| _| 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   z&Ignored premature client disconnectionz'Ignored premature client disconnection.z(Ignored premature client disconnection 2z'Start lingering close timer for %s sec.zUncompleted request.z'Ignored premature client disconnection zUnhandled runtime exceptionr   zUnhandled exception)/r   rM   rB   rH   rD   rC   rV   rJ   create_futurerL   r}   r~   popleftr   requests_countr   
isinstancer8   _make_error_handlerERRORr   r   ConnectionErrorr   rv   rA   rU   rF   rG   call_atr   boolr   is_eofrI   r   r   r   readanyr   set_exceptionr(   RuntimeErrorrS   r   r   r   )ro   re   handlerrd   rZ   r   r;   r   r   writerrj   r   taskr   nowr`   end_tr:   r2   r2   r3   r     s8  	





/



)



*

	









azRequestHandler.startr   c                    s   | j dur| j d d| _| jr| j | j d| _z|j}W n ty7   |du r0tdtd|w z||I dH  |	 I dH  W n t
yY   | ||| Y dS w | ||| 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.
        NFrf   z+Missing return statement on request handlerz7Web-handler should return a response instance, got {!r}T)rP   set_upgradedrN   rK   r   prepareAttributeErrorr   ru   	write_eofr   r   )ro   r   r   r   prepare_methr2   r2   r3   r   Z  s4   


	zRequestHandler.finish_responser   r9   r;   c           
      C   s   | j d|d |jjdkrtdd}|tjkrhdtj}tjj}d}| jr?t	t
 t }W d   n1 s:w   Y  d|jd	d
v r^|rTt|}d| d}dj||d}d}n
|rb|}|d | }t|||d}	|	  |	S )zHandle errors.

        Returns HTTP response with specific status code. Logs additional
        information. It always closes current connection.
        zError handling requestr   r   zMResponse is sent already, cannot send another response with the error messagez
text/plainz{0.value} {0.phrase}Nz	text/htmlAccept z<h2>Traceback:</h2>
<pre>z</pre>zV<html><head><title>{title}</title></head><body>
<h1>{title}</h1>
{msg}
</body></html>
)titler   z

)r9   textcontent_type)r   r   output_sizer   r   INTERNAL_SERVER_ERRORru   descriptionrS   r   r   	traceback
format_excheadersgethtml_escaper$   r   )
ro   r   r9   r:   r;   ctr   r   tbr   r2   r2   r3   r     s8   


zRequestHandler.handle_errorerr_infoc                    s   dt dtf fdd}|S )Nr   rr   c                    s    |  j j jS ry   )r   r9   r:   r;   )r   r   ro   r2   r3   r     s   z3RequestHandler._make_error_handler.<locals>.handler)r#   r%   )ro   r   r   r2   r   r3   r     s   z"RequestHandler._make_error_handler)rz   )rr   N)r   NN)5r.   r/   r0   r1   r   	__slots__r   r"   r   
LOG_FORMATr}   AbstractEventLooprl   r   r   r   r   r?   r<   ri   rx   propertyrZ   r   r   BaseTransportr   r>   r   r   r   r   bytesr   r   r   r   r#   r%   r   r   r   r   r
   r	   r   r   r   r   r   r8   r   __classcell__r2   r2   rp   r3   r&   `   s    '"	
J$

'



	




'y
(
3)Hr}   asyncio.streamsr   r   collectionsr   
contextlibr   htmlr   r   httpr   loggingr   typingr   r   r	   r
   r   r   r   r   r   r   r   attryarlabcr   r   base_protocolr   helpersr   r   r   r   r   r   r   r   r   streamsr   r   tcp_helpersr    web_exceptionsr!   web_logr"   web_requestr#   web_responser$   r%   __all__
web_serverr)   _RequestFactory_RequestHandlerURLr   r   r'   r(   sr8   _MsgTyper&   r2   r2   r2   r3   <module>   sn    4