
    hg                         d 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
mZmZ ddlmZmZmZmZ  G d de          Z G d	 d
          Z G d d          Z G d d          ZdS )zRHouses the classes used to transfer request and response data between components.     )datetime)
HTTPStatus)HTTPMessage)DictIterableListOptionalTupleUnion)parse_qs	urlencodeurlsplit
urlunsplitc                       e Zd ZdZd ZdS )HTTPHeaderszgA dict-like data-structure to hold HTTP headers.

    Note that duplicate key names are permitted.
    c                 D    t          |                                           S N)repritemsselfs    M/var/www/fb-scrape/myenv/lib/python3.11/site-packages/seleniumwire/request.py__repr__zHTTPHeaders.__repr__   s    DJJLL!!!    N)__name__
__module____qualname____doc__r    r   r   r   r   	   s-         
" " " " "r   r   c            
       B   e Zd ZdZdddededeeeef                  defdZe	d	efd
            Z
e
j        defd            Z
e	d	efd            Zej        defd            Ze	d	eeeeee         f         f         fd            Zej        deeeeee         f         f         fd            Ze	d	efd            Ze	d	efd            Zej        defd            Z	 ddedeeeef         eeeef                  f         defdZej        fdefdZd Zd ZdS )RequestzRepresents an HTTP request.r   bodymethodurlheadersr#   c                   d| _         || _        || _        t                      | _        |D ] \  }}| j                            ||           !|| _        d| _        t          j	                    | _
        g | _        i | _        dS )a  Initialise a new Request object.

        Args:
            method: The request method - GET, POST etc.
            url: The request URL.
            headers: The request headers as an iterable of 2-element tuples.
            body: The request body as bytes.
        N)idr$   r%   r   r&   
add_headerr#   responser   nowdatews_messagescert)r   r$   r%   r&   r#   kvs          r   __init__zRequest.__init__   s     "&"}} 	* 	*DAqL##Aq))))	,0&lnn	35			r   returnc                     | j         S )zKGet the request body.

        Returns: The request body as bytes.
        _bodyr   s    r   r#   zRequest.body-        zr   bc                     |	d| _         d S t          |t                    r|                    d          | _         d S t          |t                    st          d          || _         d S Nr   utf-8zbody must be of type bytesr5   
isinstancestrencodebytes	TypeErrorr   r7   s     r   r#   zRequest.body5   g    9DJJJ3 	'**DJJJAu%% 	8999DJJJr   c                 4    t          | j                  j        S )zSGet the query string from the request.

        Returns: The query string.
        )r   r%   queryr   s    r   querystringzRequest.querystring@   s     !!''r   qsc                 z    t          t          | j                            }||d<   t          |          | _        d S )N   listr   r%   r   )r   rF   partss      r   rE   zRequest.querystringH   s5    Xdh''((ae$$r   c                     | j         }| j                            d          dk    r#| j        r| j                            dd          }d t          |d                                          D             S )	aI  Get the request parameters.

        Parameters are returned as a dictionary. Each dictionary entry will have a single
        string value, unless a parameter happens to occur more than once in the request,
        in which case the value will be a list of strings.

        Returns: A dictionary of request parameters.
        Content-Type!application/x-www-form-urlencodedr:   replaceerrorsc                 P    i | ]#\  }}|t          |          d k    r|d         n|$S )   r   )len).0namevals      r   
<dictcomp>z"Request.params.<locals>.<dictcomp>]   s4    uuu94CAc!ff3uuur   T)keep_blank_values)rE   r&   getr#   decoder   r   )r   rF   s     r   paramszRequest.paramsN   sz     <N++/RRRW[W`R!!')!<<BuuQSgkHlHlHlHrHrHtHtuuuur   pc                    t          |d          }| j                            d          dk    r|                    dd          | _        d S t          t          | j                            }||d<   t          |          | _        d S )	NT)doseqrM   rN   r:   rO   rP   rH   )	r   r&   rZ   r>   r#   rJ   r   r%   r   )r   r]   rF   rK   s       r   r\   zRequest.params_   s~    q%%%<N++/RRR		')	<<DIII$(++,,EE!H!%((DHHHr   c                 4    t          | j                  j        S )zBGet the request path.

        Returns: The request path.
        )r   r%   pathr   s    r   ra   zRequest.pathj   s     !!&&r   c                 4    t          | j                  j        S )zBGet the request host.

        Returns: The request host.
        )r   r%   netlocr   s    r   hostzRequest.hostr   s     !!((r   c                 z    t          t          | j                            }||d<   t          |          | _        d S )N   rI   )r   r]   rK   s      r   ra   zRequest.pathz   s5    Xdh''((ae$$r   r   status_codec                 H   	 d t           j                                        D             |         }n0# t          $ r# t	          d                    |                    w xY wt          |t                    r|                                }t          ||||          | _
        dS )z7Create a response object and attach it to this request.c                     i | ]
}||j         S r   )phrase)rU   r0   s     r   rX   z+Request.create_response.<locals>.<dictcomp>   s    KKKaaKKKr   zUnknown status code: {})rg   reasonr&   r#   N)r   __members__valuesKeyError
ValueErrorformatr<   dictr   Responser*   )r   rg   r&   r#   rk   s        r   create_responsezRequest.create_response   s    	LKK:+A+H+H+J+JKKKKXFF 	L 	L 	L6==kJJKKK	L gt$$ 	&mmooG [QX_cddds	   .1 -A
error_codec                 2    |                      |           dS )ztConvenience method for signalling that this request is to be terminated
        with a specific error code.
        )rg   N)rs   )r   rt   s     r   abortzRequest.abort   s!     	44444r   c                 F    d                     t          |                     S )NzLRequest(method={method!r}, url={url!r}, headers={headers!r}, body={_body!r})
format_mapvarsr   s    r   r   zRequest.__repr__   s     ]hhimnrisistttr   c                     | j         S r   )r%   r   s    r   __str__zRequest.__str__   s	    xr   N)r   r   )r   r   r   r   r=   r   r
   r?   r1   propertyr#   setterrE   r   r   r   r\   ra   rd   intrs   r   	FORBIDDENrv   r   r|   r   r   r   r!   r!      s       %%cf   # C (5c?:S [`    . e    X 
[e    [ (S ( ( ( X( %c % % % %
 vS%T#Y"778 v v v Xv  ])S%T#Y"778 ) ) ) ]) 'c ' ' ' X' )c ) ) ) X) 
[%c % % % [% ore ee).tCH~xcSVh?X/X)Yefke e e e '1&: 5 5 5 5 5 5u u u    r   r!   c            
           e Zd ZdZdddededeeeef                  defdZ	e
d	efd
            Zej        defd            Zd Zd ZdS )rr   zRepresents an HTTP response.r   r"   rg   rk   r&   r#   c                    || _         || _        t                      | _        |D ] \  }}| j                            ||           !|| _        t          j                    | _        i | _	        dS )a"  Initialise a new Response object.

        Args:
            status_code: The status code.
            reason: The reason message (e.g. "OK" or "Not Found").
            headers: The response headers as an iterable of 2-element tuples.
            body: The response body as bytes.
        N)
rg   rk   r   r&   r)   r#   r   r+   r,   r.   )r   rg   rk   r&   r#   r/   r0   s          r   r1   zResponse.__init__   sk     '"}} 	* 	*DAqL##Aq))))	&lnn				r   r2   c                     | j         S )zMGet the response body.

        Returns: The response body as bytes.
        r4   r   s    r   r#   zResponse.body   r6   r   r7   c                     |	d| _         d S t          |t                    r|                    d          | _         d S t          |t                    st          d          || _         d S r9   r;   rA   s     r   r#   zResponse.body   rB   r   c                 F    d                     t          |                     S )Nz]Response(status_code={status_code!r}, reason={reason!r}, headers={headers!r}, body={_body!r})rx   r   s    r   r   zResponse.__repr__   s    (jd44	
r   c                 B    d                     | j        | j                  S )Nz{} {})rp   rg   rk   r   s    r   r|   zResponse.__str__   s    ~~d.<<<r   N)r   r   r   r   r   r=   r   r
   r?   r1   r}   r#   r~   r   r|   r   r   r   rr   rr      s        &&kn   s C (5QTVYQY?B[ ch    ( e    X 
[e    [
 
 
= = = = =r   rr   c                   B    e Zd ZdZdedeeef         defdZ	d Z
d ZdS )	WebSocketMessagez\Represents a websocket message transmitted between client and server
    or vice versa.
    from_clientcontentr,   c                0    || _         || _        || _        dS )zInitialise a new websocket message.

        Args:
            from_client: True if the message was sent by the client.
            content: The text or binary message data.
            date: The datetime the message was sent or received.
        N)r   r   r,   )r   r   r   r,   s       r   r1   zWebSocketMessage.__init__   s     '			r   c                 t    t          | j        t                    r| j        S dt          | j                   dS )N<z  bytes of binary websocket data>)r<   r   r=   rT   r   s    r   r|   zWebSocketMessage.__str__   s9    dlC(( 	 <F3t|$$FFFFr   c                     t          |t                    sdS | |u rdS | j        |j        k    o| j        |j        k    o| j        |j        k    S )NFT)r<   r   r   r   r,   )r   others     r   __eq__zWebSocketMessage.__eq__   sY    %!122 	5U]]45#44r9Vr[_[dhmhr[rrr   N)r   r   r   r   boolr   r=   r?   r   r1   r|   r   r   r   r   r   r      sv         
t 
eCJ6G 
x 
 
 
 
G G G
s s s s sr   r   N)r   r   httpr   http.clientr   typingr   r   r   r	   r
   r   urllib.parser   r   r   r   r   r!   rr   r   r   r   r   <module>r      sU   X X             # # # # # # ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? B B B B B B B B B B B B" " " " "+ " " "E E E E E E E EP1= 1= 1= 1= 1= 1= 1= 1=hs s s s s s s s s sr   