U
    &%er                     @   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
 d dlmZ d dlmZm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mZmZmZ d dlmZ ejd	krd d
lm Z  nd d
l!m Z  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 Z/ej-e)e*f e0dddZ1G dd dZ2G dd de Z3G dd de4Z5G dd dZ6G dd dej7Z8G dd dej9Z:dS )    N)Future)GeneratorType)unquoteurljoin)StapledObjectStream)is_async_callable)ASGIAppMessageReceiveScopeSend)WebSocketDisconnect)      )	TypedDictappreturnc                 C   s   t | rt| dS t| S )N	__await__)inspectisclasshasattrr   r    r   S/var/www/html/Darija-Ai-API/env/lib/python3.8/site-packages/starlette/testclient.py	_is_asgi3(   s    

r   c                   @   s4   e Zd ZdZeddddZeeeddddZ	dS )	
_WrapASGI2z7
    Provide an ASGI3 interface onto an ASGI2 app.
    Nr   c                 C   s
   || _ d S Nr   )selfr   r   r   r   __init__3   s    z_WrapASGI2.__init__)scopereceivesendr   c                    s   |  |}|||I d H  d S r   r   )r   r    r!   r"   instancer   r   r   __call__6   s    
z_WrapASGI2.__call__)
__name__
__module____qualname____doc__ASGI2Appr   r   r
   r   r$   r   r   r   r   r   .   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ddZdS )_UpgradeWebSocketTestSessionN)sessionr   c                 C   s
   || _ d S r   )r4   )r   r4   r   r   r   r   A   s    z_Upgrade.__init__)r%   r&   r'   r   r   r   r   r   r2   @   s   r2   c                   @   s  e Zd ZeeeddddZd dddZej	ddd	d
Z
ddddZedddZeddddZeddddZeddddZeddddZeddddZd,ej	eddddZd-edd d!d"Zedd#d$Zedd%d&Zedd'd(Zd.eej	d)d*d+ZdS )/r3   N)r   r    portal_factoryr   c                 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   F   s    

zWebSocketTestSession.__init__r   c                 C   s   t  | _| j|  | _z2| j| j}| ddi | 	 }| 
| W n  tk
rn   | j   Y nX |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__T   s    

zWebSocketTestSession.__enter__argsr   c                 G   sD   z| d W 5 | j   X | j s@| j }t|tr|qd S )N  )rB   rI   r:   emptyrJ   
isinstanceBaseException)r   rO   rL   r   r   r   __exit__d   s    


zWebSocketTestSession.__exit__c              
      s`   | j }| j}| j}z| |||I dH  W n0 tk
rZ } z| j|  W 5 d}~X Y nX dS )zE
        The sub-thread in which the websocket session runs.
        N)r    _asgi_receive
_asgi_sendr   rS   r:   put)r   r    r!   r"   excr   r   r   rF   n   s    zWebSocketTestSession._runc                    s&   | j  rtdI d H  q | j  S )Nr   )r9   rQ   anyiosleeprJ   r   r   r   r   rU   {   s    
z"WebSocketTestSession._asgi_receiverL   r   c                    s   | j | d S r   )r:   rW   r   rL   r   r   r   rV      s    zWebSocketTestSession._asgi_sendc                 C   s*   |d dkr&t |dd|ddd S )Nr=   zwebsocket.closecoderP   reason )r   rJ   r]   r   r   r   rG      s
    
 
z$WebSocketTestSession._raise_on_closec                 C   s   | j | d S r   )r9   rW   r]   r   r   r   r"      s    zWebSocketTestSession.send)datar   c                 C   s   |  d|d d S )Nwebsocket.receiver=   textr"   r   ra   r   r   r   	send_text   s    zWebSocketTestSession.send_textc                 C   s   |  d|d d S )Nrb   r=   bytesre   rf   r   r   r   
send_bytes   s    zWebSocketTestSession.send_bytesrd   )ra   moder   c                 C   sN   |dkst tj|dd}|dkr4| d|d n| d|dd d S )	Nrd   binary),:)
separatorsrd   rb   rc   utf-8rh   )AssertionErrorjsondumpsr"   encode)r   ra   rk   rd   r   r   r   	send_json   s
    zWebSocketTestSession.send_jsonrP   )r^   r   c                 C   s   |  d|d d S )Nzwebsocket.disconnect)r=   r^   re   )r   r^   r   r   r   rI      s    zWebSocketTestSession.closec                 C   s   | j  }t|tr||S r   )r:   rJ   rR   rS   r]   r   r   r   r!      s    

zWebSocketTestSession.receivec                 C   s   |   }| | |d S )Nrd   r!   rG   r]   r   r   r   receive_text   s    
z!WebSocketTestSession.receive_textc                 C   s   |   }| | |d S )Nri   rw   r]   r   r   r   receive_bytes   s    
z"WebSocketTestSession.receive_bytes)rk   r   c                 C   sH   |dkst |  }| | |dkr0|d }n|d d}t|S )Nrl   rd   ri   rq   )rr   r!   rG   decoders   loads)r   rk   rL   rd   r   r   r   receive_json   s    

z!WebSocketTestSession.receive_json)rd   )rP   )rd   )r%   r&   r'   ASGI3Appr   _PortalFactoryTyper   rM   r/   r1   rT   rF   r	   rU   rV   rG   r"   r-   rg   ri   rj   rv   intrI   r!   rx   ry   r|   r   r   r   r   r3   E   s(   
r3   c                   @   sF   e Zd Zd
eeeeejeej	f ddddZ
ejejddd	ZdS )_TestClientTransportTr`   N)r   r5   raise_server_exceptions	root_path	app_stater   c                C   s"   || _ || _|| _|| _|| _d S r   )r   r   r   r5   r   )r   r   r5   r   r   r   r   r   r   r      s
    	z_TestClientTransport.__init__)requestr   c                    s  j j}j jjdd}j j}j j}j jjdd}ddddd| }d|krl|dd\}}	t|	}
n|}|}
dj	krg }n0|
|krd	|
 fg}nd	| d|
 
 fg}|d
d j	 D 7 }|dkrRj	dd }|d krg }ndd |dD }dt||| j||
 |ddg||
g|| j d}t| j|| j}t|ddjt||| j||
 |ddg||
gdi i| j d}dddt id d  tdfdd}td d fdd}z6|  $}|tj|| j||| W 5 Q R X W n0 tk
rF } z| jr6|W 5 d }~X Y nX | jr`svtd nsvd!g t d"t d ! d< tj"f d#i}d k	r|_# |_$|S )$Nascii)encodingP   i  )httpwshttpswssro      hosts   hostc                 S   s$   g | ]\}}|   | fqS r   )lowerru   .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     rn   Z	websocket
testclientiP  )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}nn| d krNd}n`t| trz,| d }t|trx|d}d|ddW S  tk
r   dddd Y S X n| }dd|dS )	Nr=   zhttp.disconnectrq       zhttp.requestT)r=   body	more_body)r=   r   )	is_setwaitreadrR   r-   ru   r   r"   StopIteration)r   Z
body_byteschunk)r   request_completeresponse_completer   r   r!     s*    




z4_TestClientTransport.handle_request.<locals>.receiver\   c                    s   | d dkrDrt d| d d< dd | dg D d< d	n| d d
krs\t d rlt d| dd}| dd}jdkrd | |s܈d d   n$| d dkr| d d | d d  d S )Nr=   zhttp.response.startz1Received multiple "http.response.start" messages.statusstatus_codec                 S   s    g | ]\}}|  |  fqS r   )rz   r   r   r   r   r   9  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)rr   rJ   r   r   writeseekset)rL   r   r   )r   
raw_kwargsr   r   response_startedr   r   r   r"   1  s:    



z1_TestClientTransport.handle_request.<locals>.sendz(TestClient did not receive any response.i  )r   r?   r   r   )%urlr   netlocrz   r   r   querysplitr   r?   ru   itemsrJ   r   r   r   copyr3   r   r5   r2   r   ioBytesIOr	   callrY   EventrS   r   rr   httpxZ
ByteStreamr   Responser   r   )r   r   r   r   r   r   r   default_portr   Zport_stringportr?   r>   r   r    r4   r!   r"   rD   rX   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< d6eeeeeejejeejf  ejjejeef dd
	 fddZejejej	j
ddf dddZeje eje ejeejjf dddZdddddddejjddejjddeejjejejj eje ejejj  ejejejj! ejejj" ejejj ejejj#ejjf eje eje ejejj$ejjf ejejeejf  ej%d fddZ&dddejjddejjddejjejejj! ejejj" ejejj ejejj#ejjf eje eje ejejj$ejjf ejejeejf  ej%d
 fddZ'dddejjddejjddejjejejj! ejejj" ejejj ejejj#ejjf eje eje ejejj$ejjf ejejeejf  ej%d
 fddZ(dddejjddejjddejjejejj! ejejj" ejejj ejejj#ejjf eje eje ejejj$ejjf ejejeejf  ej%d
 fddZ)dddddddejjddejjddejjejejj eje ejejj  ejejejj! ejejj" ejejj ejejj#ejjf eje eje ejejj$ejjf ejejeejf  ej%d fd d!Z*dddddddejjddejjddejjejejj eje ejejj  ejejejj! ejejj" ejejj ejejj#ejjf eje eje ejejj$ejjf ejejeejf  ej%d fd"d#Z+dddddddejjddejjddejjejejj eje ejejj  ejejejj! ejejj" ejejj ejejj#ejjf eje eje ejejj$ejjf ejejeejf  ej%d fd$d%Z,dddejjddejjddejjejejj! ejejj" ejejj ejejj#ejjf eje eje ejejj$ejjf ejejeejf  ej%d
 fd&d'Z-d7eej.e ejejd( fd)d*Z/d dd+d,Z0ejdd-d.d/Z1ddd0d1Z2ddd2d3Z3ddd4d5Z4  Z5S )8
TestClientFzFuture[None]taskNrD   http://testserverTr`   asyncio)	r   base_urlr   r   r+   r,   cookiesr?   r   c	                    s   t ||p
i d| _t|r,tt|}|}	ntt|}t|}	|	| _i | _	t
| j| j||| j	d}
|d krpi }|dd t j| j|||
d|d d S )N)r+   r,   )r5   r   r   r   z
user-agentr   T)r   r   r?   	transportfollow_redirectsr   )r*   async_backendr   r/   castr}   r)   r   r   r   r   _portal_factory
setdefaultsuperr   )r   r   r   r   r   r+   r,   r   r?   Zasgi_appr   	__class__r   r   r   o  s:     zTestClient.__init__r<   c              	   c   s:   | j d k	r| j V  n"tjjf | j}|V  W 5 Q R X d S r   )rD   rY   from_threadstart_blocking_portalr   )r   rD   r   r   r   r     s    

zTestClient._portal_factory)r   allow_redirectsr   c                 C   sN   t jj}|d k	r$d}t|t |}|d k	r2|}n|d k	rJ|d k	rJt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   redirectrL   r   r   r   _choose_redirect_arg  s    zTestClient._choose_redirect_arg)contentra   filesrs   paramsr?   r   authr   r   timeoutr   )r   r   r   ra   r   rs   r   r?   r   r   r   r   r   r   r   c                   s>   | j |}| ||}t j|||||||||	|
|||dS N)r   ra   r   rs   r   r?   r   r   r   r   r   )r   joinr   r   r   )r   r   r   r   ra   r   rs   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   )
r   r   r?   r   r   r   r   r   r   r   c             
      s(   |  ||}
t j||||||
||	dS N)r   r?   r   r   r   r   r   )r   r   rJ   r   r   r   r?   r   r   r   r   r   r   r   r   r   r   rJ     s    zTestClient.getc             
      s(   |  ||}
t j||||||
||	dS r   )r   r   optionsr   r   r   r   r     s    zTestClient.optionsc             
      s(   |  ||}
t j||||||
||	dS r   )r   r   headr   r   r   r   r     s    zTestClient.head)r   r   ra   r   rs   r   r?   r   r   r   r   r   r   r   c                   s0   |  |
|}t j|||||||||	|||dS r   )r   r   postr   r   r   ra   r   rs   r   r?   r   r   r   r   r   r   r   r   r   r   r   8  s    zTestClient.postc                   s0   |  |
|}t j|||||||||	|||dS r   )r   r   rW   r   r   r   r   rW   ]  s    zTestClient.putc                   s0   |  |
|}t j|||||||||	|||dS r   )r   r   patchr   r   r   r   r     s    zTestClient.patchc             
      s(   |  ||}
t j||||||
||	dS r   )r   r   deleter   r   r   r   r     s    zTestClient.delete)r   r   kwargsr   c              
      s   t d|}|di }|dd |dd |dd |d k	rT|d	d
| ||d< zt jd|f| W n( tk
r } z
|j}W 5 d }~X Y n
X td|S )Nzws://testserverr?   
connectionupgradezsec-websocket-keyztestserver==zsec-websocket-versionZ13r   z, GETzExpected WebSocket upgrade)	r   rJ   r   r   r   r   r2   r4   r   )r   r   r   r   r?   rX   r4   r   r   r   websocket_connect  s    
zTestClient.websocket_connectc              	      s   t  }|tjjf j _ |jd dfdd}t	t
tj _t	t
tj _ j_ j |jd d fdd}| _W 5 Q R X S )Nr<   c                      s
   d  _ d S r   )rD   r   r[   r   r   reset_portal  s    z*TestClient.__enter__.<locals>.reset_portalc                      s     j d S r   )r   wait_shutdownr   rD   r   r   r   r     s    z+TestClient.__enter__.<locals>.wait_shutdown)r@   rA   rC   rY   r   r   r   rD   callbackr   Zcreate_memory_object_streammathinfstream_sendstream_receiverE   lifespanr   r   wait_startuppop_allrB   )r   stackr   r   r   r   r   rM     s$    



zTestClient.__enter__rN   c                 G   s   | j   d S r   )rB   rI   )r   rO   r   r   r   rT     s    zTestClient.__exit__c              	      sF   d| j d}z | || jj| jjI d H  W 5 | jd I d H  X d S )Nr  )r=   r   )r   r   r"   r   r   r!   )r   r    r   r   r   r    s     zTestClient.lifespanc                    sb    j ddiI d H  tjd fdd}| I d H }|d dksFt|d dkr^| I d H  d S )Nr=   zlifespan.startupr<   c                     s&    j  I d H } | d kr" j  | S r   r   r!   r   resultrL   r[   r   r   r!      s    
z(TestClient.wait_startup.<locals>.receive)zlifespan.startup.completelifespan.startup.failedr  )r   r"   r/   r1   rr   r   r!   rL   r   r[   r   r    s    zTestClient.wait_startupc              
      s   t jd fdd} j4 I d H P  jddiI d H  | I d H }|d dksVt|d dkrn| I d H  W 5 Q I d H R X d S )Nr<   c                     s&    j  I d H } | d kr" j  | S r   r  r  r[   r   r   r!     s    
z)TestClient.wait_shutdown.<locals>.receiver=   zlifespan.shutdown)zlifespan.shutdown.completelifespan.shutdown.failedr
  )r/   r1   r   r   r"   rr   r	  r   r[   r   r     s    zTestClient.wait_shutdown)r   Tr`   r   NNN)N)6r%   r&   r'   Z__test__r.   rD   r/   OptionalrY   abcBlockingPortalr   r-   r   r0   r1   r   r   ZCookieTypesr   r@   contextmanager	Generatorr   UnionZUseClientDefaultr   r   _typesZURLTypesZRequestContent_RequestDataZRequestFilesZQueryParamTypesZHeaderTypesZ	AuthTypesZTimeoutTypesr   r   rJ   r   r   r   rW   r   r   Sequencer   rM   rT   r  r  r   __classcell__r   r   r   r   r   j  s  
       ) ,!!!)))   r   );r@   r   r   rs   r   r7   sysr/   r   concurrent.futuresr   typesr   urllib.parser   r   rY   Zanyio.from_threadr   Zanyio.streams.stapledr   Zstarlette._utilsr   Zstarlette.typesr   r	   r
   r   r   Zstarlette.websocketsr   version_infor   Ztyping_extensionsCallableContextManagerr  r  r~   	AwaitableZASGIInstancer)   r}   Mappingr-   r  Iterabler  r   r   r   r*   rH   r2   r3   BaseTransportr   ZClientr   r   r   r   r   <module>   sH   
s 3