
    <g1                        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	m
Z
 d ZddZd ZddZd Zdd	Zd
 Z	 	 ddej$                  dej&                  e	j(                     defdZd Zd Zd Zd Zd Zej8                  fdZy)    N)
exceptions)headersrequestresponseurlc                 |    || vrg S | |   j                  d      }|D cg c]  }|j                          c}S c c}w )z
        Retrieve all tokens for a header key. A number of different headers
        follow a pattern where each header line can containe comma-separated
        tokens, and headers can be set multiple times.
    ,)splitstrip)r   keytokenstokens       i/var/www/html/myenv/lib/python3.12/site-packages/seleniumwire/thirdparty/mitmproxy/net/http/http1/read.pyget_header_tokensr      s?     '	S\$F'-.eEKKM...s   9c                     t        |       }t        |      }dj                  t        | ||            |j                  _        t        j                         |_        |S )N    )limit)read_request_headexpected_http_body_sizejoin	read_bodydatacontenttimetimestamp_end)rfilebody_size_limitr   expected_body_sizes       r   read_requestr      sI    &G0988Ie5G$_`GLL IIKGNr   c                    t        j                          }t        | d      r| j                          t        |       \  }}}}}}}t	        |       }	t        | d      r| j
                  }t        j                  ||||||||	dd|d      S )a  
    Parse an HTTP request head (request line + headers) from an input stream

    Args:
        rfile: The input stream

    Returns:
        The HTTP request object (without body)

    Raises:
        exceptions.HttpReadDisconnect: No bytes can be read from rfile.
        exceptions.HttpSyntaxException: The input is malformed HTTP.
        exceptions.HttpException: Any other error occurred.
    reset_timestampsfirst_byte_timestampN)r   hasattrr!   _read_request_line_read_headersr"   r   Request)
r   timestamp_starthostportmethodscheme	authoritypathhttp_versionr   s
             r   r   r      s     iikOu() @RSX@Y=D$	4E"Gu,-44??dFFIt\7DRVXgim r   c                     t        |       }t        ||      }dj                  t        | ||            |j                  _        t        j                         |_        |S )Nr   )read_response_headr   r   r   r   r   r   r   )r   r   r   r   r   s        r   read_responser1   >   sK    !%(H0(CHHYu6H/%Z[HMM!YY[HOr   c           
          t        j                          }t        | d      r| j                          t        |       \  }}}t	        |       }t        | d      r| j
                  }t        j                  ||||dd|d      S )a  
    Parse an HTTP response head (response line + headers) from an input stream

    Args:
        rfile: The input stream

    Returns:
        The HTTP request object (without body)

    Raises:
        exceptions.HttpReadDisconnect: No bytes can be read from rfile.
        exceptions.HttpSyntaxException: The input is malformed HTTP.
        exceptions.HttpException: Any other error occurred.
    r!   r"   N)r   r#   r!   _read_response_liner%   r"   r   Response)r   r'   r.   status_codemessager   s         r   r0   r0   F   sy      iikOu() )<U)C&L+wE"Gu,-44\;$PTVegkllr   c              #   F  K   |r|dk  rt         j                  }|s|}|t        | |      D ]  }|  y|dk\  r~|*||kD  r%t        j                  dj                  ||            |}|rMt        ||      }| j                  |      }t        |      |k  rt        j                  d      | ||z  }|rLyy|}|r,t        ||      }| j                  |      }|sy| ||z  }|r,| j                  d      }|r$t        j                  dj                  |            yw)a  
        Read an HTTP message body

        Args:
            rfile: The input stream
            expected_size: The expected body size (see :py:meth:`expected_body_size`)
            limit: Maximum body size
            max_chunk_size: Maximium chunk size that gets yielded

        Returns:
            A generator that yields byte chunks of the content.

        Raises:
            exceptions.HttpException, if an error occurs

        Caveats:
            max_chunk_size is not considered if the transfer encoding is chunked.
    r   NzEHTTP Body too large. Limit is {}, content length was advertised as {}zUnexpected EOF   z!HTTP body too large. Limit is {}.)	sysmaxsize_read_chunkedr   HttpExceptionformatminreadlen)	r   expected_sizer   max_chunk_sizex
bytes_left
chunk_sizer   not_dones	            r   r   r   d   sG    & EAIue, 	AG		!	!6**CCI6%Q^C_  #
Z8Jjj,G7|j( ../?@@M*$J  
Z8Jjj,GM*$J  ::a=**+N+U+UV[+\]] s   B4D!71D!)8D!c                 N    d|v rt        |d      }d|v ryd|v ry| dk7  xr | dk7  S )z
        Checks the message to see if the client connection should be closed
        according to RFC 2616 Section 8.1.
        If we don't have a Connection header, HTTP 1.1 connections are assumed
        to be persistent.
    
connectioncloseTz
keep-aliveFzHTTP/1.1s   HTTP/1.1)r   )r.   r   r   s      r   connection_closerJ      sC     w"7L9fV#:%E,+*EEr   r   r   expect_continue_as_0c                    |s3| j                   }|r |j                  dd      j                         dk(  r~y|j                   }| j                  j	                         dk(  ryd|j
                  cxk  rdk  ry |j
                  dk(  r| j                  j	                         d	k(  ry|j
                  d
v ryd |j                  dd      j                         v ryd|v r]	  |j                  d      t        fdD              }|rt        j                  d      t        d         }|dk  r
t               |S |syy# t        $ r}t        j                  d      |d}~ww xY w)a  
        Args:
            - expect_continue_as_0: If true, incorrectly predict a body size of 0 for requests which are waiting
              for a 100 Continue response.
        Returns:
            The expected body length:
            - a positive integer, if the size is known in advance
            - None, if the size in unknown in advance (chunked encoding)
            - -1, if all data should be read until end of stream.

        Raises:
            exceptions.HttpSyntaxException, if the content length header is invalid
    expect z100-continuer   HEADd         CONNECT)   i0  chunkedztransfer-encodingNzcontent-lengthc              3   .   K   | ]  }|d    k7    yw)r   N ).0rC   sizess     r   	<genexpr>z*expected_http_body_size.<locals>.<genexpr>   s     2PQ1a=2Ps   z"Conflicting Content Length HeaderszUnparseable Content Length)r   getlowerr*   upperr5   get_allanyr   HttpSyntaxExceptionint
ValueError)r   r   rK   r    different_content_length_headerssizeerY   s          @r   r   r      sd   ( //KGKK"$=$C$C$E$W"">>!V+(&&-#- .3&7>>+?+?+AY+N:-KGKK 3R8>>@@7"
	V#GOO$45E/22P%2P/P,/ 445YZZuQx=Dax l"K 	  	V001MNTUU	Vs   AD= =	E!EE!c                    	 | j                         }|dk(  s|dk(  r| j                         }|st        j                  d      |j                         S # t        j                  t        j                  f$ r t        j                  d      w xY w)N   
   
zRemote disconnected)readliner   TcpDisconnectTlsExceptionHttpReadDisconnectr   )r   lines     r   _get_first_linero      s    C~~7?dem>>#D ++,ABB::<	 $$j&=&=> C++,ABBCs   *A 9Bc                    	 t        |       }	 |j                         \  }}}|dk(  s|j	                  d      rdd|}}}d\  }}	n|dk(  r(d|d}}}t        j                  |d      \  }}	|	st        |j                  d	d
      \  }}
d|
vr|
dz   }
|
j                  dd
      \  }}d|z   }t        j                  |d      \  }}	|	xs t        j                  |      }	|	st        t        j                  |       t        |       ||	|||||fS # t        j                  $ r t        j                  d      w xY w# t        $ r t        j                  d|       w xY w)NzClient disconnected   *   /r   )rN   r   s   CONNECTT)checks   ://r8   )maxsplitzBad HTTP request line: )ro   r   rm   r
   
startswithr   parse_authorityrc   default_portparse_check_http_versionra   )r   rn   r*   targetr.   r+   r,   r-   r(   r)   restpath_s               r   r$   r$      s   Cu%
O'+zz|$T>V..t4&)3tIFJD$z!&)63tIF,,YdCJD$  !<<<;LFD
 4d{#zz$z;Iu%<D,,YdCJD$33++F3D  IIfL) vvy$DDI (( C++,ABBCB  O,,/Ftf-MNNOs   D C8D; )D8;"Ec                 z   	 t        |       }	 |j                  d d      }t	        |      dk(  r|j                  d       |\  }}}t        |      }t        |       |||fS # t        j                  $ r t        j                  d      w xY w# t        $ r% t        j                  dj                  |            w xY w)NzServer disconnected   r   zBad HTTP response line: {})ro   r   rm   r
   r@   appendrb   ry   rc   ra   r=   )r   rn   partsr.   r5   r6   s         r   r3   r3     s    Cu%

X

4#u:?LL-2*k7+&L)
 g--! (( C++,ABBC  X,,-I-P-PQU-VWWXs   A  AB  )B	.B:c                 x    t        j                  d|       s$t        j                  dj	                  |             y )Ns   ^HTTP/\d\.\d$zUnknown HTTP version: {})rematchr   ra   r=   )r.   s    r   ry   ry   /  s3    88%|4,,-G-N-N|-\]] 5r   c                    g }	 | j                         }|r
|dk(  s|dk(  rn|d   dv r?|st        j                  d      |d   d   |d   d   dz   |j                         z   f|d<   nE	 |j	                  d	d      \  }}|j                         }|s
t               |j                  ||f       t        j                  |      S # t
        $ r" t        j                  d
t        |      z        w xY w)z
        Read a set of headers.
        Stop once a blank line is reached.

        Returns:
            A headers object

        Raises:
            exceptions.HttpSyntaxException
    rh   ri   r   s    	zInvalid headersr[   r8   s   
    :zInvalid header line: %s)
rj   r   ra   r   r
   rc   r   reprr   Headers)r   retrn   namevalues        r   r%   r%   4  s     C
~~tw$%-7f 445FGG2wqz3r71:#84::<#GHCG	"jjq1e$,&

D%=)! * ??3	   44-T
: s   (AC +C-c              #     K   d}	 | j                  d      }|dk(  rt        j                  d      |dk7  r|dk7  r	 t        |d      }||z  }||kD  r%t        j                  d	j                  ||            | j                  |      }| j                  d
      }|dk7  rt        j
                  d      |dk(  ry| # t        $ r% t        j
                  dj                  |            w xY ww)z
    Read a HTTP body with chunked transfer encoding.

    Args:
        rfile: the input file
        limit: A positive integer
    r      r   zConnection closed prematurelyrh   ri      z#Invalid chunked encoding length: {}z@HTTP Body too large. Limit is {}, chunked content longer than {}   zMalformed chunked bodyN)rj   r   r<   rb   rc   ra   r=   r?   )r   r   totalrn   lengthchunksuffixs          r   r;   r;   X  s     E
~~c"3;**+JKK7?tu}iT2 VOEu} ..55;VE55I  JJv&E^^A&F  445MNN{K+   i 445Z5a5abf5ghhis   9C/B> A6C/>.C,,C/)N)Ni   )NT)r   r9   r   typing!seleniumwire.thirdparty.mitmproxyr   *seleniumwire.thirdparty.mitmproxy.net.httpr   r   r   r   r   r   r   r1   r0   r   rJ   r&   Optionalr4   boolr   ro   r$   r3   ry   r%   r:   r;   rW   r   r   <module>r      s    	 
   8G G	/>m<4^nF& 8<%)33//("3"343 #3l
'ET.,^
! H  #{{ r   