o
    [h}#                     @   s  d dl Z d dlZd dl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 d dlmZmZmZmZ zd dlmZ W n eyO   dZY nw h dZd	ed
ejeef fddZG dd deZG dd deZ d
efddZ!ded
dfddZ"G dd de Z#dS )    N)Mapping)cookies)URLAddressFormDataHeadersQueryParamsState)
FormParserMultiPartParser)MessageReceiveScopeSend)parse_options_header>   zaccept-languagezcache-controlz
user-agentacceptzaccept-encodingcookie_stringreturnc                 C   sd   i }|  dD ](}d|v r| dd\}}nd|}}| | }}|s(|r/t|||< q|S )a   
    This function parses a ``Cookie`` HTTP header into a dict of key/value pairs.

    It attempts to mimic browser cookie parsing behavior: browsers and web servers
    frequently disregard the spec (RFC 6265) when setting and reading cookies,
    so we attempt to suit the common scenarios here.

    This function has been adapted from Django 3.1.0.
    Note: we are explicitly _NOT_ using `SimpleCookie.load` because it is based
    on an outdated spec and will fail on lots of input we want to support
    ;=    )splitstriphttp_cookies_unquote)r   cookie_dictchunkkeyval r    y/home/ubuntu/experiments/live_experiments/Pythonexperiments/Otree/venv/lib/python3.10/site-packages/starlette/requests.pycookie_parser   s   
r"   c                   @   s   e Zd ZdS )ClientDisconnectN)__name__
__module____qualname__r    r    r    r!   r#   5   s    r#   c                   @   s\  e Zd ZdZd+dededdfddZdedefd	d
Zde	j
e fddZdefddZede	jfddZedefddZedefddZedefddZedefddZedefddZede	jeef fddZedefddZedefdd Zede	jfd!d"Zede	jfd#d$Z ede!fd%d&Z"d'ed(e	jdefd)d*Z#dS ),HTTPConnectionz
    A base class for incoming HTTP connections, that is used to provide
    any functionality that is common to both `Request` and `WebSocket`.
    Nscopereceiver   c                 C   s   |d dv sJ || _ d S )Ntype)httpZ	websocketr(   )selfr(   r)   r    r    r!   __init__?   s   
zHTTPConnection.__init__r   c                 C   s
   | j | S Nr,   )r-   r   r    r    r!   __getitem__C      
zHTTPConnection.__getitem__c                 C   
   t | jS r/   )iterr(   r-   r    r    r!   __iter__F   r1   zHTTPConnection.__iter__c                 C   r2   r/   )lenr(   r4   r    r    r!   __len__I   r1   zHTTPConnection.__len__c                 C   
   | j d S )Nappr,   r4   r    r    r!   r9   L      
zHTTPConnection.appc                 C      t | dst| jd| _| jS )N_urlr,   )hasattrr   r(   r<   r4   r    r    r!   urlP      
zHTTPConnection.urlc                 C   sN   t | ds$t| j}d|d< d|d< |d|dd|d< t|d	| _| jS )
N	_base_url/path    query_stringZapp_root_path	root_pathr   r,   )r=   dictr(   getr   r@   )r-   Zbase_url_scoper    r    r!   base_urlV   s   

zHTTPConnection.base_urlc                 C   r;   )N_headersr,   )r=   r   r(   rI   r4   r    r    r!   headersb   r?   zHTTPConnection.headersc                 C   s    t | dst| jd | _| jS )N_query_paramsrD   )r=   r   r(   rK   r4   r    r    r!   query_paramsh   s   
zHTTPConnection.query_paramsc                 C   s   | j di S )Npath_params)r(   rG   r4   r    r    r!   rM   n   s   zHTTPConnection.path_paramsc                 C   s2   t | dsi }| jd}|rt|}|| _| jS )N_cookiescookie)r=   rJ   rG   r"   rN   )r-   r   cookie_headerr    r    r!   r   r   s   
zHTTPConnection.cookiesc                 C   s    | j dpd\}}t||dS )Nclient)NN)hostport)r(   rG   r   )r-   rR   rS   r    r    r!   rQ   }   s   zHTTPConnection.clientc                 C      d| j v s	J d| j d S )Nsessionz=SessionMiddleware must be installed to access request.sessionr,   r4   r    r    r!   rU         
zHTTPConnection.sessionc                 C   rT   )NauthzAAuthenticationMiddleware must be installed to access request.authr,   r4   r    r    r!   rW      rV   zHTTPConnection.authc                 C   rT   )NuserzAAuthenticationMiddleware must be installed to access request.userr,   r4   r    r    r!   rX      rV   zHTTPConnection.userc                 C   s.   t | ds| jdi  t| jd | _| jS )N_statestate)r=   r(   
setdefaultr	   rY   r4   r    r    r!   rZ      s   
zHTTPConnection.statenamerM   c                 K   s*   | j d }|j|fi |}|j| jdS )Nrouter)rH   )r(   Zurl_path_forZmake_absolute_urlrH   )r-   r\   rM   r]   Zurl_pathr    r    r!   url_for   s   
zHTTPConnection.url_forr/   )$r$   r%   r&   __doc__r   r   r.   strr0   typingIteratorr5   intr7   propertyAnyr9   r   r>   rH   r   rJ   r   rL   rF   rM   Dictr   r   rQ   rU   rW   rX   r	   rZ   r^   r    r    r    r!   r'   9   s>    
	r'   c                      
   t d)Nz+Receive channel has not been made availableRuntimeErrorr    r    r    r!   empty_receive      rj   messagec                    rg   )Nz(Send channel has not been made availablerh   )rl   r    r    r!   
empty_send   rk   rm   c                       s   e Zd Zeefdededef fddZe	de
fddZe	defd	d
Zdejedf fddZdefddZdejfddZdefddZdddZdefddZde
ddfddZ  ZS )Requestr(   r)   sendc                    s8   t  | |d dksJ || _|| _d| _d| _d S )Nr*   r+   F)superr.   _receive_send_stream_consumed_is_disconnected)r-   r(   r)   ro   	__class__r    r!   r.      s   
zRequest.__init__r   c                 C   r8   )Nmethodr,   r4   r    r    r!   rw      r:   zRequest.methodc                 C   s   | j S r/   )rq   r4   r    r    r!   r)      s   zRequest.receiveNc                 C  s   t | dr| jV  dV  d S | jrtdd| _	 |  I d H }|d dkr:|dd}|r2|V  |dd	s9nn|d d
krFd| _t qdV  d S )N_bodyrC   zStream consumedTr*   zhttp.requestbodyZ	more_bodyFhttp.disconnect)r=   rx   rs   ri   rq   rG   rt   r#   )r-   rl   ry   r    r    r!   stream   s,   

zRequest.streamc                    sD   t | dsg }|  2 z3 d H W }|| q6 d|| _| jS )Nrx   rC   )r=   r{   appendjoinrx   )r-   chunksr   r    r    r!   ry      s   
zRequest.bodyc                    s,   t | ds|  I d H }t|| _| jS )N_json)r=   ry   jsonloadsr   )r-   ry   r    r    r!   r      s
   
zRequest.jsonc                    s   t | dsLtd usJ d| jd}t|\}}|dkr1t| j|  }| I d H | _| jS |dkrHt| j|  }| I d H | _| jS t	 | _| jS )N_formzEThe `python-multipart` library must be installed to use form parsing.zContent-Types   multipart/form-datas!   application/x-www-form-urlencoded)
r=   r   rJ   rG   r   r{   parser   r
   r   )r-   Zcontent_type_headercontent_typeoptionsZmultipart_parserZform_parserr    r    r!   form   s"   

zRequest.formc                    s$   t | dr| j I d H  d S d S )Nr   )r=   r   closer4   r    r    r!   r      s   
zRequest.closec                    sX   | j s)ztj|  ddI d H }W n tjy   i }Y nw |ddkr)d| _ | j S )NgHz>)timeoutr*   rz   T)rt   asynciowait_forrq   TimeoutErrorrG   )r-   rl   r    r    r!   is_disconnected   s   zRequest.is_disconnectedrB   c                    sn   d| j di v r5g }tD ]}| j|D ]}||d|df qq| d||dI d H  d S d S )Nzhttp.response.push
extensionszlatin-1)r*   rB   rJ   )r(   rG   SERVER_PUSH_HEADERS_TO_COPYrJ   getlistr|   encoderr   )r-   rB   Zraw_headersr\   valuer    r    r!   send_push_promise  s   
zRequest.send_push_promise)r   N)r$   r%   r&   rj   rm   r   r   r   r.   rd   r`   rw   r)   ra   AsyncGeneratorbytesr{   ry   re   r   r   r   r   boolr   r   __classcell__r    r    ru   r!   rn      s(    

rn   )$r   r   ra   collections.abcr   r+   r   r   Zstarlette.datastructuresr   r   r   r   r   r	   Zstarlette.formparsersr
   r   Zstarlette.typesr   r   r   r   Zmultipart.multipartr   ImportErrorr   r`   rf   r"   	Exceptionr#   r'   rj   rm   rn   r    r    r    r!   <module>   s(     	n