
    EgCY                        d dl Z 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  ej        e          Z G d d	ej                  Z G d
 d          Z G d dej                  Zd Z G d dej                  Zej        dej        dej         diZ!d Z" G d dej                  Z#dS )    N)connections)
exceptionsflowhttp)
websockets)base)WebSocketLayer)strutilsc                   \    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd ZdS )_HttpTransmissionLayerc                     t                      NNotImplementedErrorselfr   s     k/var/www/sysmax/venv/lib/python3.11/site-packages/seleniumwire/thirdparty/mitmproxy/server/protocol/http.pyread_request_headersz+_HttpTransmissionLayer.read_request_headers       !###    c                     t                      r   r   r   requests     r   read_request_bodyz(_HttpTransmissionLayer.read_request_body   r   r   c                     t                      r   r   r   s     r   read_request_trailersz,_HttpTransmissionLayer.read_request_trailers   r   r   c                     t                      r   r   r   s     r   send_requestz#_HttpTransmissionLayer.send_request   r   r   c                     t                      r   r   r   s    r   read_response_headersz,_HttpTransmissionLayer.read_response_headers    r   r   c              #   "   K   t                      r   r   r   r   responses      r   read_response_bodyz)_HttpTransmissionLayer.read_response_body#   s      !###r   c                     t                      r   r   r#   s      r   read_response_trailersz-_HttpTransmissionLayer.read_response_trailers'   r   r   c                     |                                  }d                    |                     ||                    |j        _        |                     ||          |j        _        |S )Nr   )r!   joinr%   datacontentr'   trailersr#   s      r   read_responsez$_HttpTransmissionLayer.read_response*   s_    --// ###GX66!
 !
 "&!<!<Wh!O!Or   c                     |j         j        t          j        d          |                     |           |                     ||j         j        g           |                     |           d S )Nz)Cannot assemble flow with missing content)r*   r+   r   HttpExceptionsend_response_headerssend_response_bodysend_response_trailersr   r$   s     r   send_responsez$_HttpTransmissionLayer.send_response2   sk    = (*+VWWW""8,,,8=+@*ABBB##H-----r   c                     t                      r   r   r3   s     r   r0   z,_HttpTransmissionLayer.send_response_headers9   r   r   c                     t                      r   r   r   r$   chunkss      r   r1   z)_HttpTransmissionLayer.send_response_body<   r   r   c                     t                      r   r   r7   s      r   r2   z-_HttpTransmissionLayer.send_response_trailers?   r   r   c                     t                      r   r   )r   fs     r   check_close_connectionz-_HttpTransmissionLayer.check_close_connectionB   r   r   N)__name__
__module____qualname__r   r   r   r   r!   r%   r'   r-   r4   r0   r1   r2   r<    r   r   r   r      s        $ $ $$ $ $$ $ $$ $ $$ $ $$ $ $$ $ $  . . .$ $ $$ $ $$ $ $$ $ $ $ $r   r   c                   :    e Zd ZdZd Zed             Zd Zd ZdS )ConnectServerConnectionzf
    "Fake" ServerConnection to represent state after a CONNECT request to an upstream mitmproxy.
    c                 "    || _         || _        d S r   )address_ctx)r   rD   ctxs      r   __init__z ConnectServerConnection.__init__L   s    			r   c                     | j         j        S r   )rE   server_connr    s    r   viazConnectServerConnection.viaP   s    y$$r   c                 ,    t          | j        |          S r   )getattrrJ   )r   items     r   __getattr__z#ConnectServerConnection.__getattr__T   s    tx&&&r   c                 4    | j                                         S r   )rJ   	connectedr    s    r   rP   z!ConnectServerConnection.connectedW   s    x!!###r   N)	r=   r>   r?   __doc__rG   propertyrJ   rN   rP   r@   r   r   rB   rB   F   sf            % % X%' ' '$ $ $ $ $r   rB   c                   <     e Zd Z fdZd Zd Zd Zd Zd Z xZ	S )UpstreamConnectLayerc                     t                                          |           || _        t          |j        |j        f| j                  | _        d S r   )superrG   connect_requestrB   hostportrF   rI   )r   rF   rW   	__class__s      r   rG   zUpstreamConnectLayer.__init__]   sN    .2!?#78H
 
r   c                 N    | j                             |           } |             d S r   )rF   
next_layer)r   layers     r   __call__zUpstreamConnectLayer.__call__e   s&    ##D))r   c           	      r   |                      ddd                    | j        j        j                  d                    | j        j        | j        j                  g           |                     | j                   | 	                    | j                  }|j
        dk    rt          j        d          d S )NzSending CONNECT requestdebugzProxy Server: {}zConnect to: {}:{}   z2Reconnect: Upstream server refuses CONNECT request)logformatrF   rI   rD   rW   rX   rY   r   r-   status_coder   ProtocolException)r   resps     r   _send_connect_requestz*UpstreamConnectLayer._send_connect_requesti   s    *G%%dh&:&BCC&&t';'@$BVB[\\6
 	 	 	 	$.///!!$"677s""./cddd #"r   c                     | j                                         s/| j                                         |                                  d S d S r   )rI   rP   rF   connectrg   r    s    r   ri   zUpstreamConnectLayer.connects   sJ    ))++ 	H&&(((((Dr   c                     |                      d                    t          |                    d           || j        j        j        k    r| j                            |           d S d S )Nz-Changing upstream mitmproxy to {} (CONNECTed)r`   )rb   rc   reprrI   rJ   rD   rF   
set_serverr   rD   s     r   change_upstream_proxy_serverz1UpstreamConnectLayer.change_upstream_proxy_serverz   sd    @GGWVVX_```d&*222H((((( 32r   c                     | j         j                                        r| j                                          |d         | j        _        |d         | j        _        || j        _        d S )Nr      )rF   rI   rP   
disconnectrW   rX   rY   rD   rm   s     r   rl   zUpstreamConnectLayer.set_server   s^    8))++ 	"H!!!$+AJ!$+AJ!#*   r   )
r=   r>   r?   rG   r^   rg   ri   rn   rl   __classcell__rZ   s   @r   rT   rT   [   s        
 
 
 
 
  e e e  ) ) )
+ + + + + + +r   rT   c                 "    d| cxk    odk     nc S )Nra   i,  r@   )statuss    r   is_okrv      s$    &3r   c                       e Zd ZdZdZdZdS )HTTPModerp         N)r=   r>   r?   regulartransparentupstreamr@   r   r   rx   rx      s        GKHHHr   rx   )	authorityabsolute)relativec                    |j         dk    r%|j        dvrt          j        d|j        z            t          |          }|j         |vr|j        r| t          j        u r|j         dk    rd S | t          j        k    rGt          j	        d          
                                                    |j         dk    rdnd          }n!dd	                    |          d
|j         d}t          j        |          d S )Nr   )r   httpszInvalid request scheme: %sz
                Mitmproxy received an {} request even though it is not running
                in regular mode. This usually indicates a misconfiguration,
                please see the mitmproxy mode documentation for details.
                r~   zHTTP CONNECTzabsolute-formz%Invalid HTTP request form (expected: z or z, got: ))first_line_formatschemer   r/   MODE_REQUEST_FORMSis_http2rx   r|   textwrapdedentstriprc   r)   )moder   allowed_request_formserr_messages       r   validate_request_formr      s    J..7>IZ3Z3Z&(7>9
 
 	
 /t4 (=== 	(< < <AZ^hAhAhF8'''"/  uwwvv0I[0X0Xnn^mnn K ( 12222G4M4M4MK &{333 >=r   c                   j     e Zd ZU 	  fdZd Zd Z	d Z
d Zddd
Zd ZdededefdZd Zd Z xZS )	HttpLayerFNrI   c                     t                                          |           || _        d | _        	 	 d | _        d| _        d S )NF)rV   rG   r   "_HttpLayer__initial_server_address_HttpLayer__initial_server_tlsrW   )r   rF   r   rZ   s      r   rG   zHttpLayer.__init__   sH    	/3%[R %)!$r   c                     | j         t          j        k    r| j        | _        | j        j        | _        	 t          j	        | j
        | j        | | j         j                  }|                     |          sd S D)NT)liver   )r   rx   r|   
server_tlsr   rI   rD   r   r   HTTPFlowclient_connname_process_flowr   s     r   r^   zHttpLayer.__call__   s}    9,,,(,D%,0,<,DD)	=  Y^	  D %%d++ 	r   c                    d| _         	 |                     |j        j        |j        j        f           |j        r|j        }n#t          j        |j        j        j	                  }| 
                    |           t          |j                  r$| j                            |           } |             n# t          j        t          j        f$ ro}|                     dt'          |                     t)          j        t-          |                    |_        | j                            d|           Y d }~dS d }~ww xY wdS )NT  errorF)rW   rl   r   rX   rY   r$   r   make_connect_responser*   http_versionr4   rv   rd   rF   r\   r   re   NetlibExceptionsend_error_responserk   r   Errorstrr   channelask)r   r;   rf   r]   es        r   handle_regular_connectz HttpLayer.handle_regular_connect   s.   #	OOQY^QY^<===z Oz1!).2MNNt$$$T%&& ++D11(**D
 	 	 	
 $$S$q''222jQ((AGLWa(((55555	 us   B*B4 4D>A$D99D>c                 `   |j         s|                     |j        j        |j        j        |j        j                   |                     |j                   |                                 |_         d                    | 	                    |j        |j                             |j         j
        _        |                     |j                    t          |j         j                  rt          | |j                  } |            S |j         j        dk    rt                               d           dS )Nr   i  z)Invalid proxy server credentials suppliedF)r$   establish_server_connectionr   rX   rY   r   r   r!   r)   r%   r*   r+   r4   rv   rd   rT   rb   r   )r   r;   r]   s      r   handle_upstream_connectz!HttpLayer.handle_upstream_connect   s
    z 
	,,			   
 ai(((3355AJ&)hh''	1:>>' 'AJO# 	1:&&&'(( 	C(qy99E577NZ#s**IIABBBur   c                     	 	                                 }n# t          j        $ r Y dS w xY w|_         j        t
          j        u rV                     j                  r<                     j        j	        j        j
        f           t
          j         _        |j        dk    rd                                         j                            j        j        _                             j                  j        j        _        t'          j                    j        _         j                            d            j        t
          j        u r                               S  j        t
          j        u r*                                                               S d}                     d|           dS  j        j        j        st=           j        |            j                            d            j        t
          j        u r!j        j         s                                 j        j        j        st=           j        |           |j!        "                    dd	          #                                d
k    r@ $                    tK          j&                               |j!        '                    d           j        j(        rd j        j        _        n7d                                         |                    j        j        _                             j                  j        j        _        t'          j                    |_        n# t          j)        $ r}                     dtU          |                     d _        tW          j,        t[          |                    _.         j                            d           d/                    |          } j        j        j0        r 1                    dd|g           n 1                    dd|g           Y d }~dS d }~ww xY w 1                    ddtU          |          g            j        t
          j        u r|j        dk    rd	|_2         j        j        j        3                    d          r2 j        j        j4        s! j        j5        j6        d         j        _7         j        t
          j8        u rR j9        d         j        j        _	         j9        d         j        j        _
         j:        rdndj        j        _;         j                            d           	 ty          j=        |j!                  r>ty          j>        |j!                  r%dj?        d<    j                            d           j@        s A                    j        j	        j        j
        j        j;                    fd}	  |             n# t          jB        $ r} 1                    dtU          |          z  d           t          |t          jD                  rt          jE        d          j        j(        rh                     dd           tW          j,        tU          |                    _.         j                            d           Y d }~r	d_F        dS dS  G                                  H                                  |             Y d }~nd }~ww xY w j                            d           j@        j(        rd j@        j        _        nBd                     I                    j        j@                            j@        j        _        t'          j                    j@        _         j        _        n j                            d            J                    j        j@                  j@        j        _         1                    d dtU          j@                  g            j                            d            j@        j(        s $                    j@                   n K                    j@                    I                    j        j@                  }t          j@        j(                  rj@        (                    |          } M                    j@        |           t'          j                    j@        _         N                              r	 r	d_F        dS dS j@        jO        d!k    rty          j=        j        j!                  oty          j=        j@        j!                  }|r' j        j        jP        s 1                    d"d#           |r" j        j        jP        rt                     }n jR        S                               } |             	 r	d_F        dS dS n# t          jE        t          jB        f$ r}j@        su                     d$tU          |                     tW          j,        t[          |                    _.         j                            d           Y d }~r	d_F        dS dS t          jE        d%tU          |          z            d }~ww xY w	 rd_F        n# rd_F        w xY wdS )&NFr~   r   http_connectzUnexpected CONNECT request.i  requestheadersexpect z100-continuer   z)HTTP protocol error in client request: {}r   r`   warnr   zreverse:r   rp   s   httpss   httpT	websocketwebsocket_handshakec                                          j                   j        j        ri                    j                  } t	          j        j                  rj                            |           }                     j        |            n+                    j        j        j        j        g                               j                   	                                _
        d S r   )send_request_headersr   streamr   callablesend_request_bodyr*   r+   send_request_trailersr!   r$   )r8   r;   r   s    r   get_responsez-HttpLayer._process_flow.<locals>.get_responset  s    --ai888y' T!%!7!7	!B!B#AI$455 >%&Y%5%5f%=%=F..qy&AAAA..qy19>;Q:RSSS..qy999!%!;!;!=!=AJJJr   zserver communication error: %s)levelz8First and only attempt to get response via HTTP2 failed.i  zRequest Timeoutresponseheadersr$   e   zDClient requested WebSocket connection, but the protocol is disabled.infor   zError in HTTP connection: %s)Tr   r   HttpReadDisconnectr   r   rx   r}   should_bypass_upstream_proxyrl   rX   rY   r{   r   r)   r   r*   r+   r   r,   timetimestamp_endr   r   r   apply_proxy_authr   r   configoptionsrelax_http_form_validationr   rI   rJ   headersgetlowerr4   r   make_expect_continue_responsepopr   r/   rk   r   r   r   r   rc   suppress_connection_errorsrb   r~   
startswithkeep_host_headerupstream_serverrD   host_headerr|   r   r   r   r   check_handshakecheck_client_versionmetadatar$   r   r   
isinstanceHttp2ProtocolExceptionre   r   rq   ri   r%   r'   r0   r   r1   r<   rd   r   r	   rF   r\   )	r   r;   r   msgr   r   r8   is_websocketr]   s	   ``       r   r   zHttpLayer._process_flow  s
   H	,0,E,Ea,H,H0    uu
  AIyH---$2S2STUT]2^2^- @AAA$,	(K77 *-**1955* *	& +/*D*DQY*O*O	'*.)++	'  3339 00066q999Y("333))!,,,77:::7C,,S#666 5;&A :%di999L-q111yH---am6G-%%a((( ;&A :%di999""8R006688NJJ ""4#E#G#GHHH##H---y S)-	&&),$2H2H2Q2Q)R)R	&&*&@&@&K&KAIN#$(IKKG!!' 	 	 	 $$S$q''222AIjQ((AGLWa(((=DDQGGC{"= 3GcU3333FSE22255555	 	Gd7mm_555 9(((W-F*-T-T "G ;#..z:: 	K4;CVCg 	K$(K$?$G$JAI! 9,,, #'"?"BAIN"&"?"BAIN040I$VHHwAIN!A&&&Q	)'/:: ;z?^_f_n?o?o ;*.
;'   !6:::: L700ININI$  > > > > > >"# LNNNN!1  #  #  #HH8477B%      "!Z%FGG %(:V   ) % 006GHHH"&*T!WW"5"5((!444$uuuj   g OO%%%LLNNN LNNNNNNNNA #H   !2A666:$ .2AJO++.1hh//	1:FF/ /AJO+ ,09;;
( !% 0   !2A666'+'B'B19aj'Y'YAJO$HHZ4
+;+;*<===LZ+++:$ 7 ""1:.... **1:66600IJ  AJ-.. 7Z..v66F''
F;;;+/9;;
(**1-- F   A z%,,
 .qy/@AA C.qz/ABB    (;(E HH^  
   6DK$7$A 6*433EE H//55E   A -* ,j.HI 		 		 		: ((d1gg666*SVV,,  !,,,uuu   	 !22T!WW<  		+ -@    ts    M, .M, .EM, 2<M, /M, 	F"M, ,Q;CQQ,Bh 
X h \(#B8\#h ,2\#h #\((Hh B=h k( k5A+k k( 1$kkk( (k3returnc                    	 t          j        |||          }|                     |           d S # t          j        t
          j        j        t          j        f$ r- |                     d	                    |          d           Y d S w xY w)Nz+Failed to send error response to client: {}r`   )
r   make_error_responser4   r   r   h2H2Errorr   rb   rc   )r   codemessager   r$   s        r   r   zHttpLayer.send_error_response  s    	]/gwGGHx(((((*BM,A:Cde 	] 	] 	]HHBII'RRT[\\\\\\	]s   +/ ABBc                 "   t          | j        d          r| j                            |           d S || j        j        k    rM|                     d                    t          |                    d           |                     |           d S d S )Nrn   z1Changing upstream mitmproxy to {} (not CONNECTed)r`   )	hasattrrF   rn   rI   rD   rb   rc   rk   rl   rm   s     r   rn   z&HttpLayer.change_upstream_proxy_server  s     48;<< 	%H11':::::(000HHHOOPTU\P]P]^^`ghhhOOG$$$$$ 10r   rX   rY   r   c                    |dk    }| j         t          j        u s| j         t          j        u r||f}|| j        j        k    s|| j        k    r1|                     |           |                     ||d                    | j        	                                s| 
                                 d S d S | j        	                                s| 
                                 |rt          j        d          d S )Nr   r   z0Cannot change scheme in upstream mitmproxy mode.)r   rx   r{   r|   rI   rD   r   rl   set_server_tlsrP   ri   r   HttpProtocolException)r   rX   rY   r   tlsrD   s         r   r   z%HttpLayer.establish_server_connection  s     9(((DI9M,M,MTlG$*222cT_6L6L(((##C444#--//   #--//  k 67ijjjk kr   c                     d}| j         j        j        D ]Y}|                    d          ^}}|j                            |          r"d}|rt          |d                   |j        k    }|r nZ|S )zWhether we should bypass any upstream proxy.

        This checks whether the request address is in the no_proxy list.
        F:Tr   )r   r   no_proxysplitrX   endswithintrY   )r   r   r   addrrX   rY   s         r   r   z&HttpLayer.should_bypass_upstream_proxy  s    
 K'0 	 	D**S//KD4|$$T** < <"47||w|;H  r   c                    d}	 | j         j        j        }n# t          $ r Y nw xY w|sN	 | j         j        j        }|r)dt          j        t          j        |                    z   }n# t          $ r Y nw xY w|r||j	        j
        d<   dS dS )z7Apply proxy authorization to the request if configured.Ns   Basic zProxy-Authorization)r   r   upstream_custom_authAttributeErrorupstream_authbase64	b64encoder
   always_bytesr   r   )r   r;   auths      r   r   zHttpLayer.apply_proxy_auth3  s    	;&;DD 	 	 	D	  	{*8 [*V-=h>STX>Y>Y-Z-ZZD!     	<7;AI3444	< 	<s    
##<A& &
A32A3r   )r   N)r=   r>   r?   rI   r   ServerConnection__annotations__rG   r^   r   r   r   r   rn   r   r   r   r   r   rr   rs   s   @r   r   r      s         9
% 
% 
% 
% 
%    8  ,v v vp] ] ] ] ]% % %k k3 k k k k k$  ,< < < < < < <r   r   )$r   enumloggingr   r   h2.exceptionsr   !seleniumwire.thirdparty.mitmproxyr   r   r   r   %seleniumwire.thirdparty.mitmproxy.netr   1seleniumwire.thirdparty.mitmproxy.server.protocolr   ;seleniumwire.thirdparty.mitmproxy.server.protocol.websocketr	   'seleniumwire.thirdparty.mitmproxy.utilsr
   	getLoggerr=   rb   Layerr   rB   rT   rv   Enumrx   r{   r|   r}   r   r   r   r@   r   r   <module>r      s            9 9 9 9 9 9 D D D D D D D D D D < < < < < < B B B B B B V V V V V V < < < < < <g!!0$ 0$ 0$ 0$ 0$TZ 0$ 0$ 0$f$ $ $ $ $ $ $ $*)+ )+ )+ )+ )+4: )+ )+ )+X      ty    /-0 4 4 40U< U< U< U< U<
 U< U< U< U< U<r   