
    8Cf.P                        d dl mZ d dlmZmZ erd dlmZ d dlmZ d dl	m
Z
mZ d dl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 d d
lmZ d dlmZ d dlmZmZm Z  d dl!m"Z" dZ# G d dee"      Z$y)    )annotations)TYPE_CHECKINGOptional)Request)BaseHTTPResponse)CancelledErrorsleep)Header)
BadRequestExpectationFailedPayloadTooLargeRequestCancelledServerErrorServiceUnavailable)format_http1_response)has_message_body)Stage)Stream)access_loggererror_loggerlogger)TouchUpMetas   HTTP/1.1 100 Continue

c                      e Zd ZdZdZdZdZg dZd Zd Z	d Z
d	 Zd
 Z	 	 	 	 	 	 ddZddZ	 	 	 	 	 	 ddZ	 	 	 	 	 	 ddZddZddZddZd ZddZddZed        Zedd       Zy)Httpa   "Internal helper for managing the HTTP/1.1 request/response cycle.

    Raises:
        BadRequest: If the request body is malformed.
        Exception: If the request is malformed.
        ExpectationFailed: If the request is malformed.
        PayloadTooLarge: If the request body exceeds the size limit.
        RuntimeError: If the response status is invalid.
        ServerError: If the handler does not produce a response.
        ServerError: If the response is bigger than the content-length.
    i @  r   )http1_request_headerhttp1_response_headerread)_send_receive_moredispatchrecv_bufferprotocolexpecting_continuestage
keep_alive	head_onlyrequest	exceptionurlrequest_bodyrequest_bytesrequest_bytes_leftresponseresponse_funcresponse_sizeresponse_bytes_leftupgrade_websocketc                    |j                   | _        |j                  | _        |j                  | _        || _        d| _        t        j                  | _	        | j
                  j                  j                  | _        y )NT)sendr   receive_morer   r!   r"   r%   r   IDLEr$   appr    )selfr"   s     P/var/www/highfloat_scraper/venv/lib/python3.12/site-packages/sanic/http/http1.py__init__zHttp.__init__K   sY    ]]
%22#// !JJ
))22    c                    d| _         d| _        d| _        d| _        d| _        d| _        | j                  j                  | _        d| _        d| _	        d| _
        d| _        y)z%Init/reset all per-request variables.NF)r(   r#   r&   r*   r+   r,   r"   request_max_sizer'   r-   r1   r)   r7   s    r8   init_for_requestzHttp.init_for_requestT   s_    (- !"& $ > > $*.!&r:   c                Z    | j                   t        j                  t        j                  fv S )z'Test if request handling is in progress)r$   r   HANDLERRESPONSEr=   s    r8   __bool__zHttp.__bool__b   s    zzemmU^^<<<r:   c                z  K   | j                   ri| j                  t        j                  u rK| j	                          | j
                  s| j                          d{    t        j                  | _        	 | j                  | _	        | j                          d{    t        j                  | _        | j                  j                  | j                  _        | j                  j                  | j                         d{    | j                  t        j                  u r| j                   st#        d      | j                  t        j$                  u r$| j&                  j)                  d       d{    | j@                  r| j&                  rDd	| j&                  jB                  cxk  rd
k  r%n n"tE        jF                  | j                   d       tI        | jJ                  | j                  jJ                        | _%        	 | 2 3 d{   }
| j                  r.d| j                  _(        | j&                  rd| j&                  _(        | j                   r| j                  t        j                  u rIyyyy7 7 7 ~7 # t*        $ r}| j                  j,                  sIt/        j0                  d| j                  j2                   d| j                  j4                   d       Y d}~y| j                  j                  j6                  r
t9               n| j:                  xs |}d| _        d| _         | j=                  |       d{  7   Y d}~d}~wt>        $ r%}| j=                  |       d{  7   Y d}~d}~ww xY w7 ~6 ~# tL        $ r tO        d       d{  7   d| _         Y w xY ww)zHTTP 1.1 connection handlerNzHandler produced no responseT)
end_streamz	Request:  z stopped. Transport is closed.F   i,  z body not consumed.gMbP?))r%   r$   r   r5   r>   r!   r   REQUESTr   r.   r   r@   r"   	conn_infor'   request_handlerr1   r   rA   r-   r3   r   	transportr   infomethodr)   lostr   r(   error_response	Exceptionr*   statusr   errorminr<   r   r	   stream)r7   exce_s       r8   http1z
Http.http1f   s     oo$**

":!!###((***DJ"-%)%?%?"//111"]]
)-)@)@&mm33DLLAAA ::.t7M7M%&DEE::/--,,,===,   ==SDMM,@,@%F3%F &&$,,7J'KL(+))4==+I+I)%	,#'  a ||&*#==+/DMM(C oo$**

":o":o + 2 B >! -}}..KK#DLL$7$7#8$,,:J:J9K L8 8  }}..33 %&../C 
 "&"'))!,,, -))!,,,-4& ,
  ,&&&+DO,s  AN;I:N;7$J I=A&J J A2J 5J6J :BN;N NN
NN A"N;6N;=J  J J 	NAM)N;.AM
MMN;N"N6M97N<N;NN;
NN N;N8'N*(N84N;7N88N;c           	     6  K   | j                   }d}	 |j                  d|      }|dk7  rnAt        dt        |      dz
        }|| j                  k\  rn| j                          d{    Y|| j                  k\  rt        d      	 |d| }|j                  d	      }|j                  d
      ^}}|j                  d      \  }| _	        }| j                  dddt        |      i       d{    |dk(  rd| _        n|dk(  rd| _        nt        |j                         dk(  | _        d}	g }
d |D        D ]_  \  }}|j!                         |j#                         fx\  }}}|dv rd}	n|dk(  r|j!                         dk(  | _        |
j%                  |       a 	 t)        |
      }|j+                  dd      j!                         dk(  | _        	 | j                  j/                  d      }| j2                  j5                  ||t        |      |dd || j2                  j6                  | j2                  j8                        }| j2                  j4                  j:                  j=                  |       | j                  ddd |i       d{    dx| _        | _         |	r|jB                  }
|
j+                  d!d      }|)|j!                         d"k(  rd| _"        ntG        d#|       |
j+                  d$d      d%k(  rd%| _$        |d&z  }n!d| _$        tK        |
d'         x| _        | _         |d|d(z   = || c| _&        |_'        | j2                  jP                  d)xx   d*z  cc<   y7 7 w# t        $ r t'        d      w xY w# t0        $ r t'        d      w xY w7 w)+z3Receive and parse request header into self.request.r   Ts   

   Nz%Request header exceeds the size limitsurrogateescapeerrorsz
rE   zhttp.lifecycle.read_headheadinlinecontextzHTTP/1.1zHTTP/1.0FHEADc              3  @   K   | ]  }|j                  d d        yw):   N)split).0hs     r8   	<genexpr>z,Http.http1_request_header.<locals>.<genexpr>   s     GAQGs   )content-lengthtransfer-encoding
connection
keep-alivezBad Requestupgrade 	websocketASCIIz)URL may only contain US-ASCII characters.   )	url_bytesheadersr^   versionrL   rJ   r6   zhttp.lifecycle.requestr'   expectz100-continuezUnknown Expect: rk   chunked   rj      requests_countre   ))r!   findmaxlenHEADER_MAX_SIZEr   r   decoderf   r)   r    bytesr%   rO   upperr&   lowerlstripappendr   r
   getoner1   encodeUnicodeEncodeErrorr"   request_classrJ   r6   _currentsetr,   r+   rt   r#   r   r*   intr'   rS   state)r7   bufposr^   raw_headersreqlinesplit_headersrL   r"   r*   rt   namevaluerh   headers_instancers   r'   rv   s                     r8   r   zHttp.http1_request_header   s     ((;,CbyaSA&Cd***$$&&&  $&&&!"IJJ!	,t9D++->+?K&1&7&7&?#Gm)0s);&FDHh--*t-      :%"&Z'"'#\\^v5DN LGGG "e"&**,">>eaBB#'L\)&+kkm|&CDOq!" "'?##Ir288:kI 		J0I
 ----$tQRLmm--!! . 
 	##,,009mm$(  
 	
 	
 898$"4ooG^^Hd3F!<<>^3.2D++.>vh,GHH~~148IE$-!q$(!?B,-@ '$*<
 	#'	N'.$gn,-2-y '4  	,]++	, " 	JHII	J	
sd   A#N%M &NA&M& ,M#-B+M& 4NM> (BNNCN#M& &M;;N>NNc                  K   | j                   }|st        |dd      r|j                  d}}t        |      }|j                  }|j
                  }|| _        t        |t              r|dk  rt        d|      t        |      snd| _        |s
|rd|v sd|v rd\  }}}|j                  dd       |j                  dd       t        j                  d	| j                  j                    d
| d       nt| j"                  rd|v rd| _        n\|r||d<   d| _        nMd|v r(t        |d         |z
  | _        | j&                  | _        n!d|d<   |rd||fz  nd}| j(                  | _        | j"                  rd}| j*                  | _        | j,                  rdnd|d<   d|d<   t/        ||j0                        }|r||z  }| j2                  rd| _        |dk7  r	t4        |z   }| j6                  j8                  r| j;                          | j=                  |       d{    |rt>        j@                  | _"        yt>        jB                  | _"        y7 2w)z#Format response header and send it.bodyNTrF   zInvalid response status rj   rk   )r:   r   Tz Message body set in response on z. A z) response may only have headers, no body.rw      %x
%b
r:   rm   closerl   ro   zalt-svcFi  )#r-   getattrr   r}   rt   rP   r/   
isinstancer   RuntimeErrorr   r.   popr   warningr'   pathr&   r0   http1_response_normalhttp1_response_chunkedhead_response_ignoredr%   r   processed_headersr#   HTTP_CONTINUEr"   
access_loglog_responser   r   r5   rA   r$   )r7   datarD   ressizert   rP   rets           r8   r   zHttp.http1_response_header  sB     mm VT2"xx*D4y++!&#&&3,!9&DEE'!%D!#w.&'1)5&dJ,d3/66t||7H7H6I J IK ^^ 0G ;!%D(,G$%!%D('*73C+D'E'LD$!%!;!;D ,5G'(59?dD\1sD!%!<!<D>>D!%!;!;D04W
  	#FC,A,AB4KC ""&+D#}#c) ==##jjo#-UZZ
5>>
 	s   HI
I3I
c                B    |rd| _         t        j                  | _        yy)z*HEAD response: body data silently ignored.N)r.   r   r5   r$   )r7   r   rD   s      r8   r   zHttp.head_response_ignoredh  s    !%DDJ r:   c                   K   t        |      }|r?| j                  |rd||fz  nd       d{    d| _        t        j                  | _        y|r| j                  d||fz         d{    yy7 C7 w)z3Format a part of response body in chunked encoding.s   %x
%b
0

s   0

Nr   )r}   r   r.   r   r5   r$   )r7   r   rD   r   s       r8   r   zHttp.http1_response_chunkedn  s     
 4y** )D$<7!  
 "&DDJ**_d|;<<<  =s!   +A5A1<A5*A3+A53A5c                B  K   | j                   t        |      z
  }|dk  rM|dk  rt        d      | j                  |       d{    d| _        t
        j                  | _        || _         y|rt        d      | j                  |       d{    || _         y7 V7 w)z,Format / keep track of non-chunked response.r   z'Response was bigger than content-lengthNz(Response was smaller than content-length)r0   r}   r   r   r.   r   r5   r$   )r7   r   rD   
bytes_lefts       r8   r   zHttp.http1_response_normal  s      --D	9
?A~!"KLL**T"""!%DDJ $. 	 !"LMM**T"""#-  # #s%   ABBA	BBBBc                H  K   | j                   t        j                  urd| _        | j                   t        j                  u rt        j                  | _         | j                   t        j                  u rp| j
                  j                  }| j                  | j                          t        |t        t        f       }	 |j                  | j                  ||       d{    yy7 # t        $ r0}|j                  | j                  |d       d{  7   Y d}~yd}~ww xY ww)z*Handle response when exception encounteredFN)r$   r   r@   r%   rG   r"   r6   r'   create_empty_requestr   r   r   handle_exceptionrO   )r7   r(   r6   request_middlewarerU   s        r8   rN   zHttp.error_response  s      ::U]]*#DO ::&DJ ::&--##C||#))+%/.0@A& "C**LL)-?   '  C**4<<EBBBCsN   B:D"= C& C$C& "D"$C& &	D/ DDDD"DD"c                h   | j                   r<| j                   j                  d      j                  dd      j                  d      nd}| j                  j	                  |t        i       dd| j                  j                  | j                  j                        | _        | | j                  _	        y	)
a  Create an empty request object for error handling use.

        Current error handling code needs a request object that won't exist
        if an error occurred during before a request was received. Create a
        bogus response for error handling use.
        r[   r\   rq   backslashreplace   *z1.1NONE)rs   rt   ru   rL   rJ   r6   N)
r)   r   r   r"   r   r
   rJ   r6   r'   rS   )r7   rs   s     r8   r   zHttp.create_empty_request  s     xx HHOO#4O5VG$6V7VG_ 	 }}222Jmm--!! 3 
 #r:   c           
     z   | j                   | j                  }}t        |dd      t        | dt        | dd            ddd}|b|j                  s|j                  r,|j                  xs |j                   d
|j
                   |d<   |j                   d|j                   |d<   t        j                  d|       y	)znHelper method provided to enable the logging of responses in case if the `HttpProtocol.access_log` is enabled.rP   r   r0   r/   rY   UNKNOWNnil)rP   bytehostr'   Nrd   r   rE   r'   ro   )extra)
r'   r-   r   remote_addripportrL   r)   r   rK   )r7   reqr   r   s       r8   r   zHttp.log_response  s    <<Sc8Q/+WT?B-O 
 ?#&&#&??#<cff"=Qsxxj If"%**Qswwi8E)2U+r:   c                  K   | j                   r-| j                          d{   }|r| | j                   r,yy7 w)z Async iterate over request body.N)r*   r   )r7   r   s     r8   	__aiter__zHttp.__aiter__  s3     $D
	 $s    ?=??c                  K   | j                   r$d| _         | j                  t               d{    | j                  }| j                  dk(  r| j
                  dk(  r
	 |j                  dd      }|dk7  rn9t        |      d	kD  rd| _        t        d
      | j                          d{    Q	 t        |d| j                  dd      d   j                         d      }|dk  r^d| _        |dk  rd| _        t        d
      |dz  }t        |      |k  r'| j                          d{    t        |      |k  r'|d|= y|d|dz   = || _        | xj                  |z  c_        | j                  | j                   kD  rd| _        t#        d      | j                  sd| _        y|s| j                          d{    t%        |d| j                         }t        |      }|d|= | xj                  |z  c_        | j'                  ddd|i       d{    |S 7 7 w# t        $ r d| _        t        d
      w xY w7 7 7 0w)z Read some bytes of request body.FNr   rw   Ts   
rZ   rY   @   zBad chunked encodingrx      ;re      ry   z#Request body exceeds the size limitzhttp.lifecycle.read_bodyr   r_   )r#   r   r   r!   r,   r*   r{   r}   r%   r   r   r   rf   r   rO   r+   r<   r   r   r    )r7   r   r   r   r   s        r8   r   z	Http.read  sr     ""&+D#**]+++ ""a'D,=,=,Jhhw*"9s8b=&+DO$%;<<((*** 93q:++D!4Q7>>@"E
 qy$(!!8&+DO$%;<< q#hn,,... #hnI IcAgI&*D#$&  5 55#DO!"GHH && $D $$&&&S2422344yJ4'mm&TN  
 	
 	
 Q ,  +  9"' !7889 /, '	
ss   ,IHA<I+H",I20H% "A	I+I,I?A>I=I>AII	I"I%III	Ic                    | j                   t        j                  ur t        j                  | _         t	        d      | j
                  d| j
                  _        || c| _        |_        |S )zInitiate new streaming response.

        Nothing is sent until the first send() call on the returned object, and
        calling this function multiple times will just alter the response to be
        given.
        zResponse already startedN)r$   r   r@   FAILEDr   r-   rS   )r7   r-   s     r8   respondzHttp.respond6  sZ     ::U]]*DJ9:: ==$#'DMM  *24&xr:   c                    | j                   S N)r.   r=   s    r8   r3   z	Http.sendI  s    !!!r:   c                <    t        g || j                   | _        y r   )rR   HEADER_CEILINGr~   )clssizess     r8   set_header_max_sizezHttp.set_header_max_sizeM  s%    ! 


r:   N)r   r   rD   boolreturnNone)r(   rO   r   r   )r   r   )r   zOptional[bytes])r-   r   r   r   )r   r   )__name__
__module____qualname____doc__r   r~   __touchup__	__slots__r9   r>   rB   rW   r   r   r   r   r   rN   r   r   r   r   r   propertyr3   classmethodr    r:   r8   r   r       s    
 NOK
I.3=D0Lk3ZMBMB'+MB	MB^$=='+=	="..'+.	.&C6#8,&Nd& " " 
 
r:   r   )	metaclassN)%
__future__r   typingr   r   sanic.requestr   sanic.responser   asyncior   r	   sanic.compatr
   sanic.exceptionsr   r   r   r   r   r   sanic.headersr   sanic.helpersr   sanic.http.constantsr   sanic.http.streamr   	sanic.logr   r   r   sanic.touchupr   r   r   r   r:   r8   <module>r      sT    " * %/ )   0 * & $ 9 9 % 1r
6[ r
r:   