o
    m=8jty                     @   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rd 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   [/home/nk/hobo-godmode/plappi-mvp/.venv/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 st| jI dH  W d  I dH  n1 I dH sw   Y  W n tj	tj
fy   tjdkrt  }r| r Y nw | jdur| j  |   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      )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 )zClose 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| _ zz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rt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pt|}
zVz| |
||	}tjdkrt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rt
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 )zHandle 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|     