
    @OOfO                     d   d dl Z d dlmZ d dlm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 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 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 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& 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. eee	ef   Z/ G d# d$ee j`                  %      Z1 G d& d'e1      Z2 G d( d)e1      Z3d*ejh                  d+ejj                  d,e6fd-Z7d.e8dz  d,e/fd/Z9	 d3d0e8d1e:d,e;fd2Z<d)d'gZ=y)4    N)Callable)Union)ChunkedReader)ContentLengthReader)Http10Reader)ReceiveBuffer   )Context   )format_error)HttpConnection)	HttpEvent)RequestData)RequestEndOfMessage)RequestHeaders)RequestProtocolError)ResponseData)ResponseEndOfMessage)ResponseHeaders)ResponseProtocolError)http)version)
Connection)ConnectionState)http1)status_codes)commands)events)layer)ReceiveHttp)StreamId)expect)humanc                       e Zd ZU dZedz  ed<   dZej                  dz  ed<   dZ	ej                  dz  ed<   dZeed<   dZeed<   eej                   gej$                  d   f   ez  ed<   eed	<   eed
<   eeez     ed<   eeez     ed<   eeez     ed<   dedef fdZej@                  de!dej$                  d   fd       Z"ej@                  dejF                  dej$                  d   fd       Z$dej                   dej$                  d   fdZ% e&ejN                        dej$                  d   fd       Z(e(Z)dej                   dej$                  d   fdZ*dej                   dej$                  d   fdZ+dejF                  dej$                  d   fdZ,dej$                  d   fdZ-dej                   dej$                  d   fdZ.ddddededej$                  d   fdZ/ xZ0S )Http1ConnectionN	stream_idrequestresponseFrequest_doneresponse_donestatebody_readerbufReceiveProtocolErrorReceiveDataReceiveEndOfMessagecontextconnc                 D    t         |   ||       t               | _        y N)super__init__r   r-   )selfr1   r2   	__class__s      c/var/www/premiumrankchecker/venv/lib/python3.12/site-packages/mitmproxy/proxy/layers/http/_http1.pyr6   zHttp1Connection.__init__7   s    $' ?    eventreturnc              #   $   K   dE d {    y 7 wN r?   r7   r;   s     r9   sendzHttp1Connection.send;   s        c              #   $   K   dE d {    y 7 wr>   r?   r@   s     r9   read_headerszHttp1Connection.read_headers?   s      rB   c              #   >  K   t        |t              r| j                  |      E d {    y t        |t        j                        r8| j
                  | j                  k7  r| xj                  |j                  z  c_        | j                  |      E d {    y 7 q7 wr4   )	
isinstancer   rA   r   DataReceivedr+   passthroughr-   datar@   s     r9   _handle_eventzHttp1Connection._handle_eventE   su     eY'yy''' 5&"5"56JJ$"2"22EJJ&zz%((( ( )s"   %BBA+BBBBc              #   F   K   | j                   | _        dE d {    y 7 wr>   )rD   r+   )r7   _s     r9   startzHttp1Connection.startP   s     &&
s   !!c              #   8  K   | j                   J 	 	 t        |t        j                        r| j	                  | j
                        }nCt        |t        j                        r| j                  j                         }nt        d|       |y t        |t        j                         r?t#        |j$                        }|rt        | j'                  | j                   |             nt        |t        j(                        r| j*                  sJ |j,                  rt/        d      | j*                  j$                  j0                  j3                         dk7  r&t        | j5                  | j                                t        | t6              }| j9                  ||       E d {    y # t        j                  $ rU}t        j                  | j                         t        | j                  | j                   d|              Y d }~y d }~ww xY w7 rw)NUnexpected event: zHTTP/1 protocol error: z&HTTP trailers are not implemented yet.s   CONNECTr'   r(   )r&   rF   r   rG   r,   r-   ConnectionClosedread_eofAssertionErrorh11ProtocolErrorr   CloseConnectionr2   r    r.   DatabytesrI   r/   EndOfMessager'   headersNotImplementedErrormethodupperr0   Http1Server	mark_done)r7   r;   	h11_eventerI   
is_requests         r9   	read_bodyzHttp1Connection.read_bodyW   s    ~~)))eV%8%89 $ 0 0 :Iv'>'>? $ 0 0 9 9 ;I(+=eW)EFF  Isxx0#INN3%d&6&6t~~t&LMMIs'7'78||#|$$-0VXX<<$$++113zA%d&>&>t~~&NOO'k:
>>*:~>VVV?  $$ ..tyy99!--*A!(E 
 , Ws=   HA9F- DH%H&H-H AHHHHc              #     K   | j                   sJ t        |t        j                        ryt        |t        j                        r|j
                  j                  t        j                  ur!t        j                  |j
                         t        | j                  | j                   dt        j                               yt        d|       w)z
        We wait for the current flow to be finished before parsing the next message,
        as we may want to upgrade to WebSocket or plain TCP before that.
        NzClient disconnected.)coderO   )r&   rF   r   rG   rQ   
connectionr+   r   CLOSEDr   rV   r    r.   r   CLIENT_CLOSED_REQUESTrS   r@   s     r9   waitzHttp1Connection.waitz   s     
 ~~~eV001v667 %%_-C-CC..u/?/?@@))NN*%;; *   !#5eW!=>>s   CCc              #   $   K   dE d {    y 7 wr>   r?   r@   s     r9   donezHttp1Connection.done   s     rB   c              #   F  K   | j                   | _        | j                  r~| j                  j                  t	        | j                              xs d}|j                  d      }|r8| j                  t        j                  | j                  |            E d {    y y y 7 w)Nr:   s   
)	rH   r+   r-   maybe_extract_at_mostlenlstripr   rG   r2   )r7   already_receiveds     r9   	make_pipezHttp1Connection.make_pipe   s     %%
88#xx==c$((mLSPS/66w?::f&9&9$))EU&VWWW  	 
 Xs   BB!BB!c              #     K   | j                   sJ t        |t        j                        r2t	        | j                  | j                   |j                               y t        |t        j                        rRt        | t              r!t	        t        | j                                y t	        t        | j                                y y wr4   )r&   rF   r   rG   r    r/   rI   rQ   r^   r   r   r@   s     r9   rH   zHttp1Connection.passthrough   s     ~~~eV001d..t~~uzzJKKv667$,!"5dnn"EFF!"6t~~"FGG	 8s   CC
rP   c             #     K   |rd| _         |rd| _        | j                   r)| j                  r| j                  sJ | j                  sJ t	        | j                  | j                        r| j                         E d {    y 	 t        j                  | j                  | j                        dk(  }|xs t        j                  | j                  j                  | j                  j                        xs t        j                  | j                  j                  | j                  j                        xs@ | j                  j                  xs | j                  j                  xr t        | t              }|r3t!        j"                  | j$                         | j&                  | _        y dx| _         | _        d x| _        | _        t        | t*              r| xj,                  dz  c_        nd | _        | j.                  | _        | j0                  r8| j)                  t3        j4                  | j$                  d            E d {    y y y y 7 # t        $ r d}Y w xY w7 w)NTF   r:   )r)   r*   r'   r(   should_make_piperq   r   expected_http_body_size
ValueErrorconnection_closehttp_versionrZ   is_http2is_http3rF   Http1Clientr   rV   r2   rk   r+   r^   r&   rD   r-   r   rG   )r7   r'   r(   read_until_eof_semanticsconnection_dones        r9   r_   zHttp1Connection.mark_done   s      $D!%D!3!3<<<== =dmm<>>+++111$,,NRTT ) ) ))LL--t||/C/C ))MM..0E0E	 \\**Cdll.C.C 6"45   ..tyy99!YY
5::D 2+//DL4=$,!#!%**DJxx::f&9&9$))S&IJJJ S "4 ,  1 ,1(1@ KsC   A<I#>I?I#-I 2FI#I!	I#II#II#)1__name__
__module____qualname__r&   r!   __annotations__r'   r   Requestr(   Responser)   boolr*   r   r   Eventr   CommandGeneratorTBodyReaderr   typer   r   r   r   r   r   r
   r   r6   abcabstractmethodr   rA   ConnectionEventrD   rJ   r"   StartrM   r+   rc   ri   rk   rq   rH   r_   __classcell__r8   s   @r9   r%   r%   (   sd   !%Ix$%#'GT\\D '%)Hdmmd")L$M4V\\NE$:$:4$@@AHLL	36KKLLkL01114HHII# #z # 	) (>(>t(D   	++				% 
	)6<< 	)E4J4J44P 	) FLL%006   E!v|| !0F0Ft0L !F?&,, ?5+A+A$+G ?0&00 U5K5KD5Q X511$7 XH H%2H2H2N H "'1K1K261K				%1Kr:   r%   )	metaclassc                        e Zd ZU dZeZeZeZ	e
ed<   def fdZdedej                   d   fdZdej&                  dej                   d   fd	Zd
d
ddededej                   d   f fdZ xZS )r^   z2A simple HTTP/1 server with no pipelining support.r&   r1   c                 H    t         |   ||j                         d| _        y )Nr   )r5   r6   clientr&   r7   r1   r8   s     r9   r6   zHttp1Server.__init__   s    '..1r:   r;   r<   Nc              #   :  K   |j                   | j                   k(  sJ t        |t              r|j                  x| _        }|j                  s|j
                  rF|j                         }d|_        t        j                  j                  |j                  d      |_        t        j                  |      }t        j                   | j"                  |       y t        |t$              r| j                  sJ d| j                  j&                  j                  dd      j)                         v r%dt+        |j,                        |j,                  fz  }n|j,                  }|r#t        j                   | j"                  |       y y t        |t.              r| j0                  sJ | j                  sJ | j0                  j2                  j5                         dk7  rXd| j                  j&                  j                  dd      j)                         v r"t        j                   | j"                  d       | j7                  d	      E d {    y t        |t8              r| j                  s]|j:                  t        j<                  k7  r@t        j                   | j"                  t?        |j:                  |j@                               | j"                  jB                  tD        jF                  z  r"t        jH                  | j"                         y y tK        d
|       7 ֭w)NHTTP/1.1 chunkedtransfer-encoding   %x
%s
HEAD   0

T)r(   rO   )&r&   rF   r   r(   r{   r|   copyrz   r   	RESPONSESgetstatus_codereasonr   assemble_response_headr   SendDatar2   r   rZ   lowerrn   rI   r   r'   r\   r]   r_   r   re   NO_RESPONSEmake_error_responsemessager+   r   	CAN_WRITErV   rS   )r7   r;   r(   raws       r9   rA   zHttp1Server.send   sY    $..000e_-',~~5DMH  H$5$5#==?(2%"."8"8"<"<X=Q=QSU"V ..x8C##DIIs33|,== =DMM11556I2NTTVV%UZZ%**(EEjj''		377 34<<<== =##))+v5==((,,-@"EKKMN ''		<@@~~t~44445==UZZ<3K3K%K''II25::u}}M  yy!:!::..tyy99 ; !#5eW!=>> 5s   I LLCLc           
   #     K   t        |t        j                        r"| j                  j	                         }|r	 t        j                  |D cg c]  }t        |       c}      | _        | j                  j                  j                  r)t        j                  | j                  j                         t        j                  | j                        }t-        t/        | j0                  | j                  |dk(               tA        |      | _!        | jD                  | _        | j?                  |      E d {    y y t        |t        jF                        rat        | j                        }|jI                         rt!        j4                  d|       t!        j*                  | j$                         y tK        d|       c c}w # t        $ r}t!        j"                  | j$                  t'        dt)        |                   t!        j*                  | j$                         | j                  rXt-        t/        | j0                  | j                  d             t-        t3        | j0                  t)        |      d             nCt!        j4                  t7        j8                  | j$                  j:                         d|        | j<                  | _        Y d }~y d }~ww xY w7 w)Ni  Fz: r   z<Client closed connection before completing request headers: rO   )&rF   r   rG   r-   maybe_extract_linesr   read_request_headrX   r'   r1   optionsvalidate_inbound_headersvalidate_headersrZ   rw   rx   r   r   r2   r   strrV   r    r   r&   r   Logr#   format_addresspeernamerk   r+   make_body_readerr,   rc   rQ   striprS   )r7   r;   request_headxexpected_body_sizera   r-   s          r9   rD   zHttp1Server.read_headers  sK     eV00188779L#(#:#:+78aq8$DL ||++DD..t||/C/CD).)F)Ft||)T&$ ""6HA6M 
 $44F#G !^^
::e,,,v667/Cyy{llRSVRYZ  **49955 #5eW!=>>Q 9
 " "++DII7J3PSTUPV7WXX"22499==||)*4>>4<<O  *0QM  'll$33DII4F4FGH1#N  "&DJ!0 -sP   9K6G G	!A4G A$K69K3:BK6	G 
K0DK+&K6+K00K6FrP   r'   r(   c             #      K   t         |   ||      E d {    | j                  r| j                  s| j                  | _        y y y 7 0w)NrP   )r5   r_   r)   r*   ri   r+   )r7   r'   r(   r8   s      r9   r_   zHttp1Server.mark_doneF  sK      7$Wx$HHHT%7%7DJ &8 	Is   AA	1A)r   r   r   __doc__r   r.   r   r/   r   r0   intr   r
   r6   r   r   r   rA   r   r   rD   r   r_   r   r   s   @r9   r^   r^      s    </K-N *?) *?(>(>t(D *?X0?++0?				%0?f "'##26#				%# #r:   r^   c                        e Zd ZdZeZeZeZ	de
f fdZdedej                  d   fdZdej"                  dej                  d   fdZ xZS )	r}   z2A simple HTTP/1 client with no pipelining support.r1   c                 :    t         |   ||j                         y r4   )r5   r6   serverr   s     r9   r6   zHttp1Client.__init__U  s    '..1r:   r;   r<   Nc              #     K   t        |t              r"t        j                  | j                         y | j
                  4t        |t              sJ |j
                  | _        |j                  | _        | j
                  |j
                  k(  sJ t        |t              r|j                  }|j                  s|j                  r|j                         }d|_        d|j                  vr3|j                  r'|j                  j                  dd|j                         d|_        |j                  j                  d      }t!        |      dkD  rdj#                  |      |j                  d<   t%        j&                  |      }t        j(                  | j                  |       y t        |t*              r| j                  sJ d| j                  j                  j-                  d	d      j/                         v r%d
t!        |j0                        |j0                  fz  }n|j0                  }|r#t        j(                  | j                  |       y y t        |t2              r| j                  sJ d| j                  j                  j-                  d	d      j/                         v r#t        j(                  | j                  d       nPt%        j4                  | j                  | j6                        dk(  r#t        j8                  | j                  d       | j;                  d      E d {    y t=        d|       7 w)Nr   Hostr   r   Cookier   z; r   r   r   r   rt   T)
half_close)r'   rO   )rF   r   r   rV   r2   r&   r   r'   r{   r|   r   rz   rZ   	authorityinsertget_allrn   joinr   assemble_request_headr   r   r   r   rI   r   rw   r(   CloseTcpConnectionr_   rS   )r7   r;   r'   cookie_headersr   s        r9   rA   zHttp1Client.sendX  s    e12**49955>>!e^444"__DN ==DL~~000e^,mmG7#3#3 LLN  (2$0W5F5FOO**1fg6G6GH$&!!(!8!8!B~&* 15		.0IGOOH---g6C##DIIs33{+<<<DLL00445H"MSSUU%UZZ%**(EEjj''		377 23<<<DLL00445H"MSSUU''		<@@..t||T]]KrQ11$))MM~~d~333 #5eW!=>> 4s   L(M *L>+M c           	   #     K   t        |t        j                        r| j                  sOt	        j
                  dt        | j                               t	        j                  | j                         y | j                  J | j                  j                         }|r	 t        j                  |D cg c]  }t        |       c}      | _        | j                  j                   j"                  r)t        j$                  | j                  j&                         t        j(                  | j                  | j                        }t-        t1        | j                  | j                  |dk(               t3        |      | _        | j6                  | _        | j9                  |      E d {    y y t        |t        j:                        r| j                  j8                  t<        j>                  z  r!t	        j                  | j                         | j                  rf| j                  r8t-        t/        | j                  dt        | j                                     y t-        t/        | j                  d             y y tA        d|       c c}w # t*        $ rO}t	        j                  | j                         t-        t/        | j                  d|              Y d }~y d }~ww xY w7 Jw)NzUnexpected data from server: zCannot parse HTTP response: r   zunexpected server response: zserver closed connectionrO   )!rF   r   rG   r'   r   r   rX   r-   rV   r2   r&   r   r   read_response_headr(   r1   r   r   r   rZ   rw   rx   r    r   r   r   r,   rc   r+   rQ   r   r   rS   )r7   r;   response_headr   expected_sizera   s         r9   rD   zHttp1Client.read_headers  sU     eV001<<ll%B5?BU#VWW..tyy99>>--- HH88:M$)$<$<+89aq9%DM ||++DD..t}}/D/DE$)$A$Admm%M "#DNNDMM=TUCUV  $4M#B !^^
::e,,,v667yy!:!::..tyy99~~88%- NN:5?:MN  &- NN,F   #5eW!=>>_ : " "22499==%- NN.J1#,N 
  -sR   B"K:%J 8J
A?J 	A$K:-K7.C)K:J 	K4%AK/*K:/K44K:)r   r   r   r   r   r.   r   r/   r   r0   r
   r6   r   r   r   rA   r   r   rD   r   r   s   @r9   r}   r}   N  sh    <0K.2 2.?) .?(>(>t(D .?`>?++>?				%>?r:   r}   r'   r(   r<   c                 ~    |j                   dk(  ry|j                   dk(  r| j                  j                         dk(  ryy)Ne   T   CONNECTF)r   r\   r]   rP   s     r9   rv   rv     s;    s"				$)=)=)?9)Lr:   r   c                 N    | 
t               S | dk(  r
t               S t        |       S )Nrt   )r   r   r   )r   s    r9   r   r     s+    	"	~"=11r:   r   r   c           	          t         j                  j                  | t        | |      t        j                  t
        j                  dd            }t        j                  |      S )Nclosez	text/html)Serverr   Content_Type)	r   r   maker   Headersr   	MITMPROXYr   assemble_response)r   r   resps      r9   r   r     sS     ==['*$$$	
D ""4((r:   )r   )>r   collections.abcr   typingr   rT   h11._readersr   r   r   h11._receivebufferr   r1   r
   _baser   r   _eventsr   r   r   r   r   r   r   r   r   	mitmproxyr   r   mitmproxy.connectionr   r   mitmproxy.net.httpr   r   mitmproxy.proxyr   r   r   !mitmproxy.proxy.layers.http._baser    r!   mitmproxy.proxy.utilsr"   mitmproxy.utilsr#   r   ABCMetar%   r^   r}   r   r   r   rv   r   r   r   rX   r   __all__r?   r:   r9   <module>r      s   
 $  
 & , % ,   !    ( # ) ! ) $ *   + 0 $ + $ " ! 9 6 ( !M<1DDEqKn qKho#/ o#dx?/ x?vdll dmm  2C$J 2; 2 ))) )" r:   