o
    [hlB                     @   s  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Zd dlZd dlZd dl	m
Z
mZmZ d dlZd dlmZmZmZmZ d dlmZ ejejeef ejjf Zejeejeef f Zejeejeef ejf Zejeej eef f Z!ejeejf Z"ejej eef ej#j$ej%ej&gej&f f Z'ej%eegej(d f Z)ej%ege)f Z*ej%eeegej(d f Z+G dd dej,j-j.j/Z0G dd dZ1G d	d
 d
e2Z3de4defddZ5deje*e+f de6fddZ7G dd dZ8G dd dej9j:Z;G dd dZ<G dd dej=Z>dS )    N)unquoteurljoinurlsplit)MessageReceiveScopeSend)WebSocketDisconnectc                   @   s"   e Zd ZdededefddZdS )_HeaderDictkeydefaultreturnc                 C   s
   |  |S N)
getheaders)selfr   r    r   {/home/ubuntu/experiments/live_experiments/Pythonexperiments/Otree/venv/lib/python3.10/site-packages/starlette/testclient.pyget_all&      
z_HeaderDict.get_allN)__name__
__module____qualname__strr   r   r   r   r   r
   %   s    r
   c                   @   s@   e Zd ZdZdejejeef  ddfddZde	fddZ
dS )	_MockOriginalResponsezi
    We have to jump through some hoops to present the response as if
    it was made using urllib3.
    headersr   Nc                 C   s   t || _d| _d S )NF)r
   msgclosed)r   r   r   r   r   __init__0   s   

z_MockOriginalResponse.__init__c                 C   s   | j S r   )r   r   r   r   r   isclosed4   s   z_MockOriginalResponse.isclosed)r   r   r   __doc__typingListTuplebytesr   boolr   r   r   r   r   r   *   s    "r   c                   @   s   e Zd ZdddZdS )_UpgradesessionWebSocketTestSessionr   Nc                 C   
   || _ d S r   )r'   )r   r'   r   r   r   r   9   r   z_Upgrade.__init__)r'   r(   r   N)r   r   r   r   r   r   r   r   r&   8   s    r&   status_coder   c                 C   s$   zt | jW S  ty   Y dS w )N )http
HTTPStatusphrase
ValueError)r*   r   r   r   _get_reason_phrase=   s
   r0   appc                 C   s>   t | r
t| dS t | rt| S t| dd }t|S )N	__await____call__)inspectisclasshasattr
isfunctionasyncioiscoroutinefunctiongetattr)r1   callr   r   r   	_is_asgi3D   s   




r<   c                   @   s<   e Zd ZdZdeddfddZdeded	eddfd
dZ	dS )
_WrapASGI2z7
    Provide an ASGI3 interface onto an ASGI2 app.
    r1   r   Nc                 C   r)   r   r1   )r   r1   r   r   r   r   R   r   z_WrapASGI2.__init__scopereceivesendc                    s    |  |}|||I d H  d S r   r>   )r   r?   r@   rA   instancer   r   r   r3   U   s   
z_WrapASGI2.__call__)
r   r   r   r    ASGI2Appr   r   r   r   r3   r   r   r   r   r=   M   s    r=   c                	   @   sL   e Zd Z	ddedededdfdd	Zd
ejde	j
de	j
dejfddZdS )_ASGIAdapterTr+   r1   raise_server_exceptions	root_pathr   Nc                 C   s   || _ || _|| _d S r   )r1   rE   rF   )r   r1   rE   rF   r   r   r   r   [   s   
z_ASGIAdapter.__init__requestargskwargsc                    s  dd t jD \}}}}}ddddd| }	d|v r)|dd\}
}t|}n|}
|	}djv r5g }n||	krAd	|
 fg}nd	|
 d|  fg}|d
d j D 7 }|dv rjdd }|d u rkg }n
dd |dD }dt|| j	|| |ddg|
|g|d	}t
| j|}t|ddjt|| j	|| |ddg|
|gdi id}ddddt id d  dtffdd}dtdd f fdd}zt }W n ty   t }t| Y nw z|| ||| W n ty } z| jr|d W Y d }~nd }~ww | jr%s$J d ns6d!d"d#g dtg t d$tjjjd%i }| |}d urQ|_ |_ |S )&Nc                 s   s    | ]}t |V  qd S r   )r   ).0itemr   r   r   	<genexpr>e   s    
z$_ASGIAdapter.send.<locals>.<genexpr>P   i  )r,   wshttpswss:   hosts   hostc                 S   s$   g | ]\}}|   | fqS r   )lowerencoderJ   r   valuer   r   r   
<listcomp>{   s    z%_ASGIAdapter.send.<locals>.<listcomp>>   rN   rP   sec-websocket-protocolc                 S   s   g | ]}|  qS r   )strip)rJ   rW   r   r   r   rX      s    ,Z	websocket
testclientiP  )	typepathrF   schemequery_stringr   clientserversubprotocolsr,   z1.1http.response.template)r]   http_versionmethodr^   rF   r_   r`   r   ra   rb   
extensionsFbodyr   c                     s   rst dI d H  rddiS  j} t| tr!| d}n6| d u r(d}n/t| tjrUz| d }t|tr>|d}d|ddW S  t	yT   dddd	 Y S w | }dd|d	S )
Ng-C6?r]   zhttp.disconnectutf-8    zhttp.requestT)r]   rh   	more_body)r]   rh   )
r8   sleeprh   
isinstancer   rU   typesGeneratorTyperA   StopIteration)rh   Z
body_byteschunk)rG   request_completeresponse_completer   r   r@      s0   




z"_ASGIAdapter.send.<locals>.receivemessagec                    s
  | d dkr:rJ ddd< | d d< t | d d< dd	 | d
 D d
< dd< td
 d< dd S | d dkrssFJ drLJ d| dd}| dd}jdkrdd | |sqd d dd S d S | d dkr| d | d  d S d S )Nr]   zhttp.response.startz1Received multiple "http.response.start" messages.   versionstatusreasonc                 S   s    g | ]\}}|  |  fqS r   )decoderV   r   r   r   rX      s    z3_ASGIAdapter.send.<locals>.send.<locals>.<listcomp>r   Fpreload_contentoriginal_responseTzhttp.response.bodyz<Received "http.response.body" without "http.response.start".z7Received "http.response.body" after response completed.rh   rj   rk   HEADr   rd   templatecontext)r0   r   getrf   writeseek)rt   rh   rk   )r~   
raw_kwargsrG   rs   response_startedr}   r   r   rA      sL   

z_ASGIAdapter.send.<locals>.sendz(TestClient did not receive any response.ru   i  zInternal Server Error)rv   rw   rx   r   rz   r{   rh   r   )!r   urlsplitintr   rU   itemsr   r   rF   r(   r1   r&   rf   ioBytesIOr   r8   get_event_loopRuntimeErrornew_event_loopZset_event_looprun_until_completeBaseExceptionrE   r   requestspackagesurllib3HTTPResponsebuild_responser}   r~   )r   rG   rH   rI   r_   netlocr^   queryfragmentdefault_portrS   Zport_stringportr   subprotocolrc   r?   r'   r@   rA   loopexcrawresponser   )r~   r   rG   rr   rs   r   r}   r   rA   b   s   

 $

z_ASGIAdapter.send)Tr+   )r   r   r   ASGI3Appr%   r   r   r   PreparedRequestr!   AnyResponserA   r   r   r   r   rD   Z   s(    
rD   c                   @   s   e Zd ZdededdfddZd,ddZd	ejddfd
dZ	d-ddZ
defddZdeddfddZdeddfddZdeddfddZdeddfddZdeddfddZd.dejdeddfddZd/d!eddfd"d#Zdefd$d%Zdefd&d'Zdefd(d)Zd.dedejfd*d+ZdS )0r(   r1   r?   r   Nc                 C   s|   || _ || _d | _t | _t | _t | _	t
j| jd| _| ddi | j  |  }| | |dd | _d S )N)targetr]   zwebsocket.connectr   )r1   r?   Zaccepted_subprotocolr8   r   _loopqueueQueue_receive_queue_send_queue	threadingThread_run_threadrA   startr@   _raise_on_closer   )r   r1   r?   rt   r   r   r   r     s   




zWebSocketTestSession.__init__c                 C   s   | S r   r   r   r   r   r   	__enter__  s   zWebSocketTestSession.__enter__rH   c                 G   sH   |  d | j  | j s"| j }t|tr|| j rd S d S )N  )closer   joinr   emptyr   rm   r   )r   rH   rt   r   r   r   __exit__  s   




zWebSocketTestSession.__exit__c              
   C   sb   | j }| j}| j}z| j| ||| W dS  ty0 } z| j| W Y d}~dS d}~ww )zE
        The sub-thread in which the websocket session runs.
        N)	r?   _asgi_receive
_asgi_sendr   r   r1   r   r   put)r   r?   r@   rA   r   r   r   r   r   $  s   zWebSocketTestSession._runc                    s0   | j  rtdI d H  | j  s| j  S )Nr   )r   r   r8   rl   r   r   r   r   r   r   0  s
   


z"WebSocketTestSession._asgi_receivert   c                    s   | j | d S r   )r   r   r   rt   r   r   r   r   5  s   zWebSocketTestSession._asgi_sendc                 C   s    |d dkrt |ddd S )Nr]   zwebsocket.closecoder   )r	   r   r   r   r   r   r   8  s   z$WebSocketTestSession._raise_on_closec                 C   s   | j | d S r   )r   r   r   r   r   r   rA   <  s   zWebSocketTestSession.senddatac                 C      |  d|d d S )Nwebsocket.receiver]   textrA   r   r   r   r   r   	send_text?     zWebSocketTestSession.send_textc                 C   r   )Nr   r]   r$   r   r   r   r   r   
send_bytesB  r   zWebSocketTestSession.send_bytesr   modec                 C   sL   |dv sJ t |}|dkr| d|d d S | d|dd d S )Nr   binaryr   r   r   ri   r   )jsondumpsrA   rU   )r   r   r   r   r   r   r   	send_jsonE  s
   
zWebSocketTestSession.send_jsonr   r   c                 C   r   )Nzwebsocket.disconnect)r]   r   r   )r   r   r   r   r   r   M  r   zWebSocketTestSession.closec                 C   s   | j  }t|tr||S r   )r   r   rm   r   r   r   r   r   r@   P  s   

zWebSocketTestSession.receivec                 C      |   }| | |d S )Nr   r@   r   r   r   r   r   receive_textV     
z!WebSocketTestSession.receive_textc                 C   r   )Nr$   r   r   r   r   r   receive_bytes[  r   z"WebSocketTestSession.receive_bytesc                 C   sH   |dv sJ |   }| | |dkr|d }n|d d}t|S )Nr   r   r$   ri   )r@   r   ry   r   loads)r   r   rt   r   r   r   r   receive_json`  s   


z!WebSocketTestSession.receive_json)r   r(   r   N)r   )r   )r   r   r   r   r   r   r   r!   r   r   r   r   r   r   r   rA   r   r   r$   r   r   r   r   r@   r   r   r   r   r   r   r   r(   
  s"    

r(   c                #       sX  e Zd ZdZ			d.dejeef dede	ded	d
f
 fddZ
	
	
	
	
	
	
	
	
	
	
	
	
	
	
d/dededededejeef dedededede	dejeef dejde	deje	ef dejeejeef f dejd	ejf" fddZ	
d0dedeje d ejd	ejf fd!d"Zd1d#d$Zd%ejd	d
fd&d'Zd2d(d)Zd2d*d+Zd2d,d-Z  ZS )3
TestClientFhttp://testserverTr+   r1   base_urlrE   rF   r   Nc                    s   t t|   t|rtt|}|}n
tt|}t|}t	|||d}| 
d| | 
d| | 
d| | 
d| | jddi || _|| _d S )N)rE   rF   zhttp://zhttps://zws://zwss://z
user-agentr\   )superr   r   r<   r!   castr   rC   r=   rD   mountr   updater1   r   )r   r1   r   rE   rF   Zasgi_appadapter	__class__r   r   r   n  s$   
zTestClient.__init__rf   r   paramsr   r   cookiesfilesauthtimeoutallow_redirectsproxieshooksstreamverifycertr   c                    s8   t | j|}t j|||||||||	|
||||||dS )N)r   r   r   r   r   r   r   r   r   r   r   r   r   r   )r   r   r   rG   )r   rf   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rG     s&   zTestClient.requestrc   rI   c              
      s   t d|}|di }|dd |dd |dd |d ur*|d	d
| ||d< zt jd|fi | W td tyT } z
|j}W Y d }~|S d }~ww )Nzws://testserverr   
connectionupgradezsec-websocket-keyztestserver==zsec-websocket-versionZ13rY   z, GETzExpected WebSocket upgrade)	r   r   
setdefaultr   r   rG   r&   r'   r   )r   r   rc   rI   r   r   r'   r   r   r   websocket_connect  s    
zTestClient.websocket_connectc                 C   s>   t  }t  | _t  | _||  | _|| 	  | S r   )
r8   r   r   
send_queuereceive_queueZcreate_tasklifespantaskr   wait_startup)r   r   r   r   r   r     s   

zTestClient.__enter__rH   c                 G   s   t  }||   d S r   )r8   r   r   wait_shutdown)r   rH   r   r   r   r   r     s   zTestClient.__exit__c              	      sT   ddi}z|  || jj| jjI d H  W | jd I d H  d S | jd I d H  w )Nr]   r   )r1   r   r   r   r   )r   r?   r   r   r   r     s
   *zTestClient.lifespanc                    s   | j ddiI d H  | j I d H }|d u r| j  |d dv s%J |d dkr>| j I d H }|d u r@| j  d S d S d S )Nr]   zlifespan.startup)zlifespan.startup.completelifespan.startup.failedr   r   r   r   r   r   resultr   r   r   r   r     s   
zTestClient.wait_startupc                    sZ   | j ddiI d H  | j I d H }|d u r| j  |d dks%J | jI d H  d S )Nr]   zlifespan.shutdownzlifespan.shutdown.completer   r   r   r   r   r     s   
zTestClient.wait_shutdown)r   Tr+   )NNNNNNNNNNNNNNr   )r   r   r   )r   r   r   Z__test__r!   UnionrC   r   r   r%   r   ParamsDataTypeMutableMappingCookiesFileTypeAuthTypeTimeOutr   r#   r   r   rG   Sequencer   r   r   r   r   r   __classcell__r   r   r   r   r   k  s    	
(


r   )?r8   r,   r4   r   r   r   r   rn   r!   urllib.parser   r   r   r   Zstarlette.typesr   r   r   r   Zstarlette.websocketsr	   r   r   r   r   RequestsCookieJarr   r$   r   IOr   floatr#   r   r   r   AuthBaseCallableRequestr   	AwaitableZASGIInstancerC   r   r   r   _collectionsHTTPHeaderDictr
   r   	Exceptionr&   r   r0   r%   r<   r=   adaptersHTTPAdapterrD   r(   Sessionr   r   r   r   r   <module>   sN    	 1a