o
    #`^hK]                     @   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 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$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/m0Z0 ddl1m2Z2 ddl3m4Z4 ddl5m6Z6 ddl7m8Z8 ddl9m:Z:m;Z; dZ<erddl=m>Z> ee)e0de dge8f Z?ee8gee; f Z@e)dde(i i ddddeAd
ZBG dd deCZDG dd deCZEejFdddd G d!d" d"ZGeee)eGf e0f ZHG d#d de"ZIdS )$    N)deque)suppress)escape)
HTTPStatus)Logger)TYPE_CHECKINGAny	AwaitableCallableDequeOptionalSequenceTupleTypeUnioncast   )AbstractAccessLoggerAbstractStreamWriter)BaseProtocol)ceil_timeoutset_exception)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__ r3   r3   R/home/air/shanriGPT/back/venv/lib/python3.10/site-packages/aiohttp/web_protocol.pyr(   O       r(   c                   @   r-   )r)   z-Payload was accessed after response was sent.Nr.   r3   r3   r3   r4   r)   S   r5   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/   r0   r1   int__annotations__BaseExceptionstrr3   r3   r3   r4   r9   W   s   
 r9   c                !       s>  e 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d/edd&fd0d1Zd]d2d3Zd4edd&fd5d6Z d7edd&fd8d9Z!d]d:d;Z"d]d<d=Z#d>e$d?e%d@edd&fdAdBZ&dCedDedd&fdEdFZ'dCedDedd&fdGdHZ(d]dIdJZ)d>e$dKedLe*e$ge+e% f de,e%ef fdMdNZ-d]dOdPZ.d>e$dQe%dKedefdRdSZ/	T	&	&d^d>e$dUed,ee dVee de%f
dWdXZ0dYe1de*e$ge+e% f fdZd[Z2  Z3S )_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

    )_request_count
_keepalive_manager_request_handler_request_factory_tcp_keepalive_next_keepalive_close_time_keepalive_handle_keepalive_timeout_lingering_time	_messages_message_tail_handler_waiter_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!   rT   access_log_classrV   access_log_formatrU   max_line_sizemax_headersmax_field_sizelingering_timeread_bufsizeauto_decompresstimeout_ceil_thresholdmanagerr*   loopr\   r!   rT   r]   rV   r^   rU   r_   r`   ra   rb   rc   rd   re   c             
      s  t  | d| _d| _d | _|| _|j| _|j| _	|| _
d| _d | _|| _t|| _t | _d| _d | _d | _d | _d| _d | _t| |||
||t|d| _d| _zt|| _W n ttfyc   Y nw || _|	| _|| _ |rv|||| _!nd | _!d| _"d| _#d S )Nr   Fg            )r_   ra   r`   payload_exceptionrd   r[   )$super__init__rA   rB   rY   rC   request_handlerrD   request_factoryrE   rF   rG   rH   rI   floatrJ   r   rK   rL   rN   rM   rO   rP   rQ   r   r(   rR   rZ   	TypeError
ValueErrorrT   rU   rV   r   rW   rX   )selfrf   rg   r\   r!   rT   r]   rV   r^   rU   r_   r`   ra   rb   rc   rd   re   	__class__r3   r4   rk      sZ   

zRequestHandler.__init__returnc                 C   s    d | jj| jd urdS dS )Nz<{} {}>	connecteddisconnected)formatrs   r/   	transportrq   r3   r3   r4   __repr__   s   zRequestHandler.__repr__c                 C   s   | j S N)rI   ry   r3   r3   r4   r\      s   z RequestHandler.keepalive_timeout      .@timeoutNc              
      s  d| _ | jdur| j  | jr| j  | jdurVttjtj, t	|4 I dH  | jI dH  W d  I dH  n1 I dH sBw   Y  W d   n1 sQw   Y  ttjtjC t	|4 I dH ( | j
durt| j
t  | jdur| j s| jI dH  W d  I dH  n1 I dH sw   Y  W d   n1 sw   Y  | jdur| 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)rX   rH   cancelrN   rM   r   asyncioCancelledErrorTimeoutErrorr   rY   _cancelrO   donerx   close)rq   r}   r3   r3   r4   shutdown   s:   



(
(
	



zRequestHandler.shutdownrx   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      Trg   eager_start)rj   connection_mader   r   	TransportrF   r!   rC   _loopsysversion_infoTaskstartcreate_taskrO   )rq   rx   real_transportrg   taskrr   r3   r4   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)rC   connection_lostrj   handler_cancellationrX   rE   rD   rR   rH   r~   rY   ConnectionResetErrorr   rN   rO   rQ   feed_eof)rq   r;   r   rr   r3   r4   r   1  s2   









zRequestHandler.connection_lostparserc                 C   s6   | j d u sJ || _ | jr| j | j d| _d S d S )Nrh   )rQ   rL   	feed_data)rq   r   r3   r3   r4   
set_parserU  s   
zRequestHandler.set_parserc                 C   s   d S r{   r3   ry   r3   r3   r4   eof_received_  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  )r:   r;   r<   Frh   r3   r   )rX   rW   rQ   rP   rR   r   r   r9   r<   r   rA   rK   appendrN   r   
set_resultrL   r   )
rq   r   messagesupgradedtailr;   msgpayloadwaitereofr3   r3   r4   data_receivedb  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)rB   rH   r~   )rq   r   r3   r3   r4   
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)rW   rN   r~   ry   r3   r3   r4   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)rX   rN   r~   rx   r   ry   r3   r3   r4   force_close  s   



zRequestHandler.force_closerequestresponsetimec                 C   s,   | j d ur| j ||| j |  d S d S r{   )r   logr   r   )rq   r   r   r   r3   r3   r4   
log_access  s   
zRequestHandler.log_accessargskwc                 O   s    | j r| jj |i | d S d S r{   )rU   rT   rq   r   r   r3   r3   r4   	log_debug  s   zRequestHandler.log_debugc                 O   s   | j j|i | d S r{   )rT   	exceptionr   r3   r3   r4   log_exception  s   zRequestHandler.log_exceptionc                 C   s\   d | _ | js	| jsd S | j}| }| j}||kr#||| j| _ d S | jr,| 	  d S d S r{   )
rH   rX   rB   r   r   rG   call_at_process_keepaliverN   r   )rq   rg   now
close_timer3   r3   r4   r     s   z!RequestHandler._process_keepalive
start_timerl   c              
      s  | j  | _zzz|| _||I d H }W d | _nd | _w W nq ty< } z|}| |||I d H }W Y d }~nyd }~w tjyD     tjym } z| j	d|d | 
|d}| |||I d H }W Y d }~nSd }~w ty } z| 
|d|}| |||I d H }W Y d }~n<d }~ww t|ddrtdt | |||I d H }W | jd  ||fS W | jd  ||fS W | jd  ||fS W | jd  ||fS | jd  w )NzRequest handler timed out.exc_infoi    __http_exception__Fzlreturning HTTPException object is deprecated (#2415) and will be removed, please raise the exception instead)r   create_futurerM   rY   r"   finish_responser   r   r   r   handle_error	ExceptiongetattrwarningswarnDeprecationWarningr   )rq   r   r   rl   respr;   resetr3   r3   r4   _handle_request  sR      zRequestHandler._handle_requestc              
      s  | j }t|}|dusJ | j}|dusJ | j}d}| jdus$J | jdus+J | js| jsYz"z|	 | _
| j
I dH  W n tjyO   Y W d| _
nw W d| _
nd| _
w | j \}}| }| jd7  _t| |}	t|tr}| |}
t}n| j}
| ||| |	|}z zS| |||
}tjdkrtj||dd}n||}z	|I dH \}}W nM 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du r| || j!| _nnnw ~|rK| d W W | jdu r|dur| d n| jsI| jrG| jsG|durE| }|| }|| _| jdu rE| || 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 sW d   n	1 sw   Y  |$ s| js| d
 | *  t+|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du r*| || j!| _nnn t-yN } z| j.r@| j/d|d | 0  W Y d}~n"d}~w t1yk } z| j/d|d | 0  W Y d}~nd}~ww W | jdu r~|dur~| d no| js| jr| js|dur| }|| }|| _| jdu r| || j!| _nDnFnB| jdu r|dur| d w | js| jr| js|dur| }|| }|| _| jdu r| || j!| _w    Y nw | jr/| jsd| _2| 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.zUncompleted request.z'Ignored premature client disconnection zUnhandled runtime exceptionr   zUnhandled exception)3r   r   current_taskrC   rI   rE   rD   rX   rK   r   rN   r   popleftr   requests_countr   
isinstancer9   _make_error_handlerERRORr   r   r   r   r   ConnectionErrorr   rx   rB   rW   rG   rH   r   r   boolr   is_eofrJ   r   r   r   readanyr   r   r)   RuntimeErrorrU   r   r   r   rO   )rq   rg   handlerrf   r\   r   r<   r   r   writerrl   r   coror   r   r   r   rb   end_tr;   r3   r3   r4   r     sD  	








/

)

*

	



dzRequestHandler.startr   c                    s   |   | jdur | jd d| _| jr | j| j d| _z|j}W n ty;   |du r4tdtd	|w z||I dH  |
 I dH  W n ty]   | ||| 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.
        NFrh   z+Missing return statement on request handlerz7Web-handler should return a response instance, got {!r}T)_finishrR   set_upgradedrP   rL   r   prepareAttributeErrorr   rw   	write_eofr   r   )rq   r   r   r   prepare_methr3   r3   r4   r   i  s6   


	zRequestHandler.finish_responser   r:   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

)r:   textcontent_type)r   r   output_sizer   r   INTERNAL_SERVER_ERRORrw   descriptionrU   r   r   	traceback
format_excheadersgethtml_escaper%   r   )
rq   r   r:   r;   r<   ctr   r   tbr   r3   r3   r4   r     s8   


zRequestHandler.handle_errorerr_infoc                    s   dt dtf fdd}|S )Nr   rt   c                    s    |  j j jS r{   )r   r:   r;   r<   )r   r   rq   r3   r4   r     s   z3RequestHandler._make_error_handler.<locals>.handler)r$   r&   )rq   r   r   r3   r   r4   r     s   z"RequestHandler._make_error_handler)r|   )rt   N)r   NN)4r/   r0   r1   r2   	__slots__r   r#   r   
LOG_FORMATr   AbstractEventLooprn   r   r   r   r   r@   r=   rk   rz   propertyr\   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   r9   r   __classcell__r3   r3   rr   r4   r'   a   s    '#	
K$$

'



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

)|
)
3)Jr   asyncio.streamsr   r   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   r   streamsr   r    tcp_helpersr!   web_exceptionsr"   web_logr#   web_requestr$   web_responser%   r&   __all__
web_serverr*   _RequestFactory_RequestHandlerURLr   r   r(   r)   sr9   _MsgTyper'   r3   r3   r3   r4   <module>   sp    4