o
    Cit                     @   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m	Z	 d dl
mZ d dlmZmZ d dlZd dlZd dlmZ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 d d	lmZ zd dl Z W n e!yu   e"d
w ej#g ej$ej%j& 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+ej,e-ej.e-ej/e- f f Z0dej.e*e+f de1fddZ2G dd dZ3G dd dej4Z5G dd de6Z7G dd dZ8G dd de j9Z:G dd de j;Z<dS )    N)Future)GeneratorType)unquoteurljoin)ObjectReceiveStreamObjectSendStream)StapledObjectStream)is_async_callable)ASGIAppMessageReceiveScopeSend)WebSocketDisconnectzThe starlette.testclient module requires the httpx package to be installed.
You can install this with:
    $ pip install httpx
appreturnc                 C   s   t | r
t| dS t| S )N	__await__)inspectisclasshasattrr	   r    r   l/var/www/html/fyndo/python/python_agents/rag_suite/venv/lib/python3.10/site-packages/starlette/testclient.py	_is_asgi3*   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.
    r   r   Nc                 C   
   || _ d S Nr   )selfr   r   r   r   __init__5      
z_WrapASGI2.__init__scopereceivesendc                    s    |  |}|||I d H  d S r   r   )r   r    r!   r"   instancer   r   r   __call__8   s   
z_WrapASGI2.__call__)
__name__
__module____qualname____doc__ASGI2Appr   r   r   r   r$   r   r   r   r   r   0   s    r   c                   @   s*   e Zd ZU eed< ejeejf ed< dS )_AsyncBackendbackendbackend_optionsN)r%   r&   r'   str__annotations__typingDictAnyr   r   r   r   r*   =   s   
 r*   c                   @   s   e Zd ZdddZdS )_UpgradesessionWebSocketTestSessionr   Nc                 C   r   r   )r3   )r   r3   r   r   r   r   C   r   z_Upgrade.__init__)r3   r4   r   N)r%   r&   r'   r   r   r   r   r   r2   B   s    r2   c                   @   s2  e Zd Zde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d0dej	deddfdd Zd1d"ed#ejedf ddfd$d%Zdefd&d'Zdefd(d)Zdefd*d+Zd0dedej	fd,d-ZdS )2r4   r   r    portal_factoryr   Nc                 C   s6   || _ || _d | _|| _t | _t | _d | _d S r   )	r   r    accepted_subprotocolr5   queueQueue_receive_queue_send_queueextra_headers)r   r   r    r5   r   r   r   r   H   s   


zWebSocketTestSession.__init__c                 C   s   t  | _| j|  | _z| j| j}| ddi | 	 }| 
| W n ty4   | j   w |dd | _|dd | _| S )Ntypezwebsocket.connectsubprotocolheaders)
contextlib	ExitStack
exit_stackenter_contextr5   portalstart_task_soon_runr"   r!   _raise_on_close	Exceptionclosegetr6   r;   )r   _messager   r   r   	__enter__V   s   

zWebSocketTestSession.__enter__argsc                 G   sZ   z|  d W | j   n| j   w | j s+| j }t|tr$|| j rd S d S )N  )rH   rA   r:   emptyrI   
isinstanceBaseException)r   rM   rK   r   r   r   __exit__f   s   


zWebSocketTestSession.__exit__c              
      sV   | j }| j}| j}z| |||I dH  W dS  ty* } z| j|  d}~ww )zE
        The sub-thread in which the websocket session runs.
        N)r    _asgi_receive
_asgi_sendr   rQ   r:   put)r   r    r!   r"   excr   r   r   rE   p   s   zWebSocketTestSession._runc                    s0   | j  rtdI d H  | j  s| j  S )Nr   )r9   rO   anyiosleeprI   r   r   r   r   rS   }   s
   


z"WebSocketTestSession._asgi_receiverK   c                    s   | j | d S r   )r:   rU   r   rK   r   r   r   rT      s   zWebSocketTestSession._asgi_sendc                 C   s*   |d dkrt |dd|ddd S )Nr<   zwebsocket.closecoderN   reason )r   rI   rZ   r   r   r   rF      s
   z$WebSocketTestSession._raise_on_closec                 C   s   | j | d S r   )r9   rU   rZ   r   r   r   r"      s   zWebSocketTestSession.senddatac                 C      |  d|d d S )Nwebsocket.receiver<   textr"   r   r^   r   r   r   	send_text      zWebSocketTestSession.send_textc                 C   r_   )Nr`   r<   bytesrc   rd   r   r   r   
send_bytes   rf   zWebSocketTestSession.send_bytesrb   modec                 C   sR   |dv sJ t j|ddd}|dkr| d|d d S | d|dd	 d S )
Nrb   binary),:F)
separatorsensure_asciirb   r`   ra   utf-8rg   )jsondumpsr"   encode)r   r^   rj   rb   r   r   r   	send_json   s
   zWebSocketTestSession.send_jsonrN   r[   r\   c                 C   s   |  d||d d S )Nzwebsocket.disconnect)r<   r[   r\   rc   )r   r[   r\   r   r   r   rH      s   zWebSocketTestSession.closec                 C   s   | j  }t|tr||S r   )r:   rI   rP   rQ   rZ   r   r   r   r!      s   

zWebSocketTestSession.receivec                 C   "   |   }| | tt|d S )Nrb   )r!   rF   r/   castr-   rZ   r   r   r   receive_text      
z!WebSocketTestSession.receive_textc                 C   rv   )Nrh   )r!   rF   r/   rw   rh   rZ   r   r   r   receive_bytes   ry   z"WebSocketTestSession.receive_bytesc                 C   sH   |dv sJ |   }| | |dkr|d }n|d d}t|S )Nrk   rb   rh   rq   )r!   rF   decoderr   loads)r   rj   rK   rb   r   r   r   receive_json   s   


z!WebSocketTestSession.receive_json)r   r4   r   N)rb   )rN   N)r%   r&   r'   ASGI3Appr   _PortalFactoryTyper   rL   r/   r1   rR   rE   r   rS   rT   rF   r"   r-   re   rh   ri   ru   intUnionrH   r!   rx   rz   r}   r   r   r   r   r4   G   s2    



"r4   c                   @   sV   e Zd Z		ddededededejeej	f dd	fd
dZ
dejdejfddZd	S )_TestClientTransportTr]   r   r5   raise_server_exceptions	root_path	app_stater   Nc                C   s"   || _ || _|| _|| _|| _d S r   )r   r   r   r5   r   )r   r   r5   r   r   r   r   r   r   r      s
   	
z_TestClientTransport.__init__requestc                    s  j j}j jjdd}j j}j j}j jjdd}ddddd| }d|v r6|dd\}}	t|	}
n|}|}
dj	v rBg }n|
|krNd	|
 fg}nd	| d|
 
 fg}|d
d j	 D 7 }|dv rj	dd }|d u rxg }n
dd |dD }dt||| j||
 |d ||
g|| j d}t| j|| j}t|ddjt||| j||
 |d ||
gdi i| j d}dddt id d  dtffdd}dtdd f fdd}z&|  }|tj|| j||| W d    n	1 sw   Y  W n ty+ } z| jr!|W Y d }~nd }~ww | jr8s7J dnsCdg t d td   d< tj!d"i d!i}d ure|_" |_#|S )#Nascii)encodingP   i  )httpwshttpswssrn      hosts   hostc                 S   s$   g | ]\}}|   | fqS r   )lowerrt   .0keyvaluer   r   r   
<listcomp>   s    z7_TestClientTransport.handle_request.<locals>.<listcomp>>   r   r   sec-websocket-protocolc                 S   s   g | ]}|  qS r   )strip)r   r   r   r   r   r      s    rm   	websocket)r<   pathraw_pathr   schemequery_stringr>   clientserversubprotocolsstater   z1.1http.response.debug)r<   http_versionmethodr   r   r   r   r   r>   r   r   
extensionsr   Fstreamr   c                     s   r  s I d H  ddiS   } t| tr!| d}n5| d u r(d}n.t| trTz| d }t|tr=|d}d|ddW S  tyS   dddd Y S w | }dd|dS )	Nr<   zhttp.disconnectrq       zhttp.requestT)r<   body	more_body)r<   r   )	is_setwaitreadrP   r-   rt   r   r"   StopIteration)r   
body_byteschunk)r   request_completeresponse_completer   r   r!     s.   





z4_TestClientTransport.handle_request.<locals>.receiverK   c                    s   | d dkr$rJ d| d d< dd |  dg D d< d	d S | d d
kras0J d r8J d|  dd}|  dd}jdkrPd | |s_d d   d S d S | d dkru| d d | d d  d S d S )Nr<   zhttp.response.startz1Received multiple "http.response.start" messages.statusstatus_codec                 S   s    g | ]\}}|  |  fqS r   )r{   r   r   r   r   r   ;  s    zE_TestClientTransport.handle_request.<locals>.send.<locals>.<listcomp>r>   Tzhttp.response.bodyz<Received "http.response.body" without "http.response.start".z7Received "http.response.body" after response completed.r   r   r   FHEADr   r   r   infotemplatecontext)rI   r   r   writeseekset)rK   r   r   )r   
raw_kwargsr   r   response_startedr   r   r   r"   3  s@   


z1_TestClientTransport.handle_request.<locals>.sendz(TestClient did not receive any response.i  )r   r>   r   r   r   )$urlr   netlocr{   r   r   querysplitr   r>   rt   multi_itemsrI   r   r   r   copyr4   r   r5   r2   r   ioBytesIOr   callrW   EventrQ   r   httpx
ByteStreamr   Responser   r   )r   r   r   r   r   r   r   default_portr   port_stringportr>   r=   r   r    r3   r!   r"   rC   rV   responser   )r   r   r   r   r   r   r   r   handle_request   s   

 

z#_TestClientTransport.handle_request)Tr]   )r%   r&   r'   r   r   boolr-   r/   r0   r1   r   r   Requestr   r   r   r   r   r   r      s"    
r   c                        s  e Zd ZU dZded< dZejej	j
 ed< 									dGd
edededededejejeejf  dejjdejeef deddf fddZejdejej	j
ddf fddZdeje deje dejeejjf fddZdddddddejjddejjdddedejjdejejj deje d ejejj  d!ejd"ejejj! dejejj" dejejj d#ejejj#ejjf deje deje d$ejejj$ejjf d%ejejeejf  dej%f fd&d'Z&dddejjddejjdd(dejjd"ejejj! dejejj" dejejj d#ejejj#ejjf deje deje d$ejejj$ejjf d%ejejeejf  dej%f fd)d*Z'dddejjddejjdd(dejjd"ejejj! dejejj" dejejj d#ejejj#ejjf deje deje d$ejejj$ejjf d%ejejeejf  dej%f fd+d,Z(dddejjddejjdd(dejjd"ejejj! dejejj" dejejj d#ejejj#ejjf deje deje d$ejejj$ejjf d%ejejeejf  dej%f fd-d.Z)dddddddejjddejjdddejjdejejj deje d ejejj  d!ejd"ejejj! dejejj" dejejj d#ejejj#ejjf deje deje d$ejejj$ejjf d%ejejeejf  dej%f fd/d0Z*dddddddejjddejjdddejjdejejj deje d ejejj  d!ejd"ejejj! dejejj" dejejj d#ejejj#ejjf deje deje d$ejejj$ejjf d%ejejeejf  dej%f fd1d2Z+dddddddejjddejjdddejjdejejj deje d ejejj  d!ejd"ejejj! dejejj" dejejj d#ejejj#ejjf deje deje d$ejejj$ejjf d%ejejeejf  dej%f fd3d4Z,dddejjddejjdd(dejjd"ejejj! dejejj" dejejj d#ejejj#ejjf deje deje d$ejejj$ejjf d%ejejeejf  dej%f fd5d6Z-	dHded7ej.e d8ejdd9f fd:d;Z/dId<d=Z0d>ejddfd?d@Z1dJdAdBZ2dJdCdDZ3dJdEdFZ4  Z5S )K
TestClientFzFuture[None]taskNrC   http://testserverTr]   asyncior   base_urlr   r   r+   r,   cookiesr>   follow_redirectsr   c
                    s   t ||pi d| _t|rtt|}|}
n
tt|}t|}
|
| _i | _	t
| j| j||| j	d}|d u r8i }|dd t j| j||||	|d d S )N)r+   r,   )r5   r   r   r   z
user-agent
testclient)r   r   r>   	transportr   r   )r*   async_backendr   r/   rw   r   r)   r   r   r   r   _portal_factory
setdefaultsuperr   )r   r   r   r   r   r+   r,   r   r>   r   asgi_appr   	__class__r   r   r   q  s8   
zTestClient.__init__c                 c   sX    | j d ur| j V  d S tjjdi | j}|V  W d    d S 1 s%w   Y  d S )Nr   )rC   rW   from_threadstart_blocking_portalr   )r   rC   r   r   r   r     s   

"zTestClient._portal_factoryallow_redirectsc                 C   sP   t jj}|d urd}t|t |}|d ur|}|S |d ur&|d ur&td|S )NzMThe `allow_redirects` argument is deprecated. Use `follow_redirects` instead.z9Cannot use both `allow_redirects` and `follow_redirects`.)r   _clientUSE_CLIENT_DEFAULTwarningswarnDeprecationWarningRuntimeError)r   r   r   redirectrK   r   r   r   _choose_redirect_arg  s   zTestClient._choose_redirect_arg)contentr^   filesrr   paramsr>   r   authr   r   timeoutr   r   r   r   r^   r   rr   r   r   r   r   c                   s<   |  |}| ||}t j|||||||||	|
|||dS N)r   r^   r   rr   r   r>   r   r   r   r   r   )
_merge_urlr   r   r   )r   r   r   r   r^   r   rr   r   r>   r   r   r   r   r   r   r   r   r   r   r     s"   
zTestClient.request)r   r>   r   r   r   r   r   r   c             
      (   |  ||}
t j||||||
||	dS N)r   r>   r   r   r   r   r   )r   r   rI   r   r   r   r>   r   r   r   r   r   r   r   r   r   r   rI        zTestClient.getc             
      r   r   )r   r   optionsr   r   r   r   r     r   zTestClient.optionsc             
      r   r   )r   r   headr   r   r   r   r     r   zTestClient.headc                   0   |  |
|}t j|||||||||	|||dS r   )r   r   postr   r   r   r^   r   rr   r   r>   r   r   r   r   r   r   r   r   r   r   r   ;     zTestClient.postc                   r   r   )r   r   rU   r   r   r   r   rU   `  r   zTestClient.putc                   r   r   )r   r   patchr   r   r   r   r     r   zTestClient.patchc             
      r   r   )r   r   deleter   r   r   r   r     r   zTestClient.deleter   kwargsr4   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-version13r   z, GETzExpected WebSocket upgrade)	r   rI   r   joinr   r   r2   r3   r   )r   r   r   r   r>   rV   r3   r   r   r   websocket_connect  s    
zTestClient.websocket_connectc                    s   t  \}|tjjdi j _ |jdfdd}t	t
j\}}t	t
j\}}t||_t||_ j_ j |jd fdd}| _W d    S 1 scw   Y  S )Nr   c                      s
   d  _ d S r   )rC   r   rY   r   r   reset_portal  s   
z*TestClient.__enter__.<locals>.reset_portalc                      s     j d S r   )r   wait_shutdownr   rC   r   r   r   r    s   z+TestClient.__enter__.<locals>.wait_shutdownr   r~   )r?   r@   rB   rW   r   r   r   rC   callbackcreate_memory_object_streammathinfr   stream_sendstream_receiverD   lifespanr   r   wait_startuppop_allrA   )r   stackr  send1receive1send2receive2r  r   r  r   rL     s&   


zTestClient.__enter__rM   c                 G   s   | j   d S r   )rA   rH   )r   rM   r   r   r   rR     s   zTestClient.__exit__c              	      sX   d| j d}z| || jj| jjI d H  W | jd I d H  d S | jd I d H  w )Nr  )r<   r   )r   r   r  r!   r  r"   )r   r    r   r   r   r    s
   *zTestClient.lifespanc                    sh    j ddiI d H  dtjf fdd}| I d H }|d dv s$J |d dkr2| I d H  d S d S )Nr<   zlifespan.startupr   c                     (    j  I d H } | d u r j  | S r   r  r!   r   resultrK   rY   r   r   r!   	  
   
z(TestClient.wait_startup.<locals>.receive)zlifespan.startup.completelifespan.startup.failedr  )r  r"   r/   r1   r   r!   rK   r   rY   r   r    s   zTestClient.wait_startupc              	      s   dt jf fdd} j4 I d H <  jddiI d H  | I d H }|d dv s,J |d dkrC| I d H  W d   I d H  d S W d   I d H  d S 1 I d H sTw   Y  d S )Nr   c                     r  r   r  r  rY   r   r   r!     r  z)TestClient.wait_shutdown.<locals>.receiver<   zlifespan.shutdown)zlifespan.shutdown.completelifespan.shutdown.failedr  )r/   r1   r  r  r"   r  r   rY   r   r    s   .zTestClient.wait_shutdown)r   Tr]   r   NNNTr   )r   r   r~   )6r%   r&   r'   __test__r.   rC   r/   OptionalrW   abcBlockingPortalr
   r-   r   r0   r1   r   _typesCookieTypesr   r?   contextmanager	Generatorr   r   r   UseClientDefaultr   r   URLTypesRequestContent_RequestDataRequestFilesQueryParamTypesHeaderTypes	AuthTypesTimeoutTypesr   r   rI   r   r   r   rU   r   r   Sequencer  rL   rR   r  r  r  __classcell__r   r   r   r   r   l  s  
 	
* 	
	
,
!
!
!	
)	
)	
)

!

r   )=r?   r   r   rr   r  r7   r/   r   concurrent.futuresr   typesr   urllib.parser   r   rW   anyio.from_thread	anyio.abcr   r   anyio.streams.stapledr   starlette._utilsr	   starlette.typesr
   r   r   r   r   starlette.websocketsr   r   ModuleNotFoundErrorr   CallableContextManagerr!  r"  r   	AwaitableASGIInstancer)   r   Mappingr-   r   Iterabler*  r   r   r   	TypedDictr*   rG   r2   r4   BaseTransportr   Clientr   r   r   r   r   <module>   sP    s 3