U
    EZh]p                     @  s>  d dl m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 d dlmZmZ d dl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# ej$dkrd dl	m%Z% nd dl&m%Z% zd dl'Z'W n e(k
r8   e)dY nX e	j*g e	j+ej,j- f Z.e	j*ee!ge	j/d f Z0e	j*e ge0f Z1e	j*e ee!ge	j/d f Z2e	j3e4e	j5e4e	j6e4 e7f f Z8dddddZ9G dd dZ:G dd de	j;Z<G dd de=Z>G dd de'j?e#Z@G dd dZAG dd de'jBZCG d d! d!e'jDZEdS )"    )annotationsN)Future)cached_property)GeneratorType)unquoteurljoin)ObjectReceiveStreamObjectSendStream)StapledObjectStream)is_async_callable)ASGIAppMessageReceiveScopeSend)WebSocketDisconnect)   
   )	TypeGuardzThe starlette.testclient module requires the httpx package to be installed.
You can install this with:
    $ pip install httpx
zASGI2App | ASGI3AppzTypeGuard[ASGI3App]appreturnc                 C  s   t | rt| dS t| S )N	__await__)inspectisclasshasattrr   r    r   [/home/aprabhat/apps/x.techxrdev.in/venv/lib/python3.8/site-packages/starlette/testclient.py	_is_asgi31   s    

r   c                   @  s4   e Zd ZdZdddddZddd	dd
ddZdS )
_WrapASGI2z7
    Provide an ASGI3 interface onto an ASGI2 app.
    ASGI2AppNoner   c                 C  s
   || _ d S Nr   )selfr   r   r   r   __init__<   s    z_WrapASGI2.__init__r   r   r   )scopereceivesendr   c                   s   |  |}|||I d H  d S r#   r   )r$   r&   r'   r(   instancer   r   r   __call__?   s    
z_WrapASGI2.__call__N)__name__
__module____qualname____doc__r%   r*   r   r   r   r   r    7   s   r    c                   @  s   e Zd ZU ded< ded< dS )_AsyncBackendstrbackenddict[str, typing.Any]backend_optionsN)r+   r,   r-   __annotations__r   r   r   r   r/   D   s   
r/   c                   @  s   e Zd ZdddddZdS )_UpgradeWebSocketTestSessionr"   )sessionr   c                 C  s
   || _ d S r#   )r7   )r$   r7   r   r   r   r%   J   s    z_Upgrade.__init__N)r+   r,   r-   r%   r   r   r   r   r5   I   s   r5   c                   @  s   e Zd ZdZdS )WebSocketDenialResponsez
    A special case of `WebSocketDisconnect`, raised in the `TestClient` if the
    `WebSocket` is closed before being accepted with a `send_denial_response()`.
    N)r+   r,   r-   r.   r   r   r   r   r8   N   s   r8   c                   @  s.  e Zd ZdddddddZd dd	d
ZeddddZddddZdddddZddddZ	ddddZ
dddddZdddddZdddddZd dd!d"d#Zd$dd!d%d&Zd<dd(dd)d*d+Zd=d.d/dd0d1d2Zddd3d4Zd dd5d6Zd$dd7d8Zd>d(dd9d:d;Zd-S )?r6   ASGI3Appr   _PortalFactoryTyper"   )r   r&   portal_factoryr   c                 C  s6   || _ || _d | _|| _t | _t | _d | _d S r#   )	r   r&   accepted_subprotocolr;   queueQueue_receive_queue_send_queueextra_headers)r$   r   r&   r;   r   r   r   r%   Y   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_contextr;   portalstart_task_soon_runr(   r'   _raise_on_close	Exceptionclosegetr<   rA   )r$   _messager   r   r   	__enter__g   s    

zWebSocketTestSession.__enter__zanyio.Eventc                 C  s   t  S r#   )anyioEventr$   r   r   r   should_closew   s    z!WebSocketTestSession.should_closec                   s   | j   d S r#   )rW   setrV   r   r   r   _notify_close{   s    z"WebSocketTestSession._notify_close
typing.Anyargsr   c              	   G  sR   z| d W 5 | j | j | j  X | j sN| j }t|t	r*|q*d S )N  )
rJ   rK   rY   rH   rO   r@   emptyrP   
isinstanceBaseException)r$   r\   rR   r   r   r   __exit__~   s    


zWebSocketTestSession.__exit__c              
     s`   ddd fdd}t  4 I dH ,}|||  j I dH  |j  W 5 Q I dH R X dS )zE
        The sub-thread in which the websocket session runs.
        zanyio.abc.TaskGroupr"   )tgr   c              
     s|   zjz  j j jI d H  W nF t k
r8   Y n0 tk
rf } z j	
|  W 5 d }~X Y nX W 5 | j   X d S r#   )cancel_scopecancelr   r&   _asgi_receive
_asgi_sendrT   Zget_cancelled_exc_classr`   r@   put)rb   excrV   r   r   run_app   s    z*WebSocketTestSession._run.<locals>.run_appN)rT   Zcreate_task_groupZ
start_soonrW   waitrc   rd   )r$   ri   rb   r   rV   r   rL      s
    zWebSocketTestSession._runr   c                   s0   | j  r&t | _| j I d H  q | j  S r#   )r?   r^   rT   rU   _queue_eventrj   rP   rV   r   r   r   re      s    

z"WebSocketTestSession._asgi_receiverR   r   c                   s   | j | d S r#   )r@   rg   r$   rR   r   r   r   rf      s    zWebSocketTestSession._asgi_sendc                 C  s   |d dkr*t |dd|dddnj|d dkr|d	 }|d
 }g }|  }|d dksbt||d  |ddsJqqJt||d|dd S )NrC   zwebsocket.closecoder]   reason )rn   ro   zwebsocket.http.response.startstatusrE   zwebsocket.http.response.bodybody	more_bodyF    )status_coderE   content)r   rP   r'   AssertionErrorappendr8   join)r$   rR   ru   rE   rr   r   r   r   rM      s    z$WebSocketTestSession._raise_on_closec                 C  s*   | j | t| dr&| j| jj d S )Nrk   )r?   rg   r   rJ   rK   rk   rX   rm   r   r   r   r(      s    
zWebSocketTestSession.sendr0   )datar   c                 C  s   |  d|d d S )Nwebsocket.receiverC   textr(   r$   rz   r   r   r   	send_text   s    zWebSocketTestSession.send_textbytesc                 C  s   |  d|d d S )Nr{   rC   r   r~   r   r   r   r   
send_bytes   s    zWebSocketTestSession.send_bytesr}   z"typing.Literal[('text', 'binary')])rz   moder   c                 C  sD   t j|ddd}|dkr*| d|d n| d|dd d S )	N),:F)
separatorsensure_asciir}   r{   r|   utf-8r   )jsondumpsr(   encode)r$   rz   r   r}   r   r   r   	send_json   s    zWebSocketTestSession.send_jsonr]   Nintz
str | None)rn   ro   r   c                 C  s   |  d||d d S )Nzwebsocket.disconnect)rC   rn   ro   r~   )r$   rn   ro   r   r   r   rO      s    zWebSocketTestSession.closec                 C  s   | j  }t|tr||S r#   )r@   rP   r_   r`   rm   r   r   r   r'      s    

zWebSocketTestSession.receivec                 C  s"   |   }| | tt|d S )Nr}   )r'   rM   typingcastr0   rm   r   r   r   receive_text   s    
z!WebSocketTestSession.receive_textc                 C  s"   |   }| | tt|d S )Nr   )r'   rM   r   r   r   rm   r   r   r   receive_bytes   s    
z"WebSocketTestSession.receive_bytes)r   r   c                 C  s<   |   }| | |dkr$|d }n|d d}t|S )Nr}   r   r   )r'   rM   decoder   loads)r$   r   rR   r}   r   r   r   receive_json   s    

z!WebSocketTestSession.receive_json)r}   )r]   N)r}   )r+   r,   r-   r%   rS   r   rW   rY   ra   rL   re   rf   rM   r(   r   r   r   rO   r'   r   r   r   r   r   r   r   r6   X   s&   r6   c                	   @  s8   e Zd Zdddddddd	d
ddZdddddZdS )_TestClientTransportTrp   r9   r:   boolr0   tuple[str, int]r2   r"   )r   r;   raise_server_exceptions	root_pathclient	app_stater   c                C  s(   || _ || _|| _|| _|| _|| _d S r#   )r   r   r   r;   r   r   )r$   r   r;   r   r   r   r   r   r   r   r%      s    
z_TestClientTransport.__init__zhttpx.Requesthttpx.Response)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rbj	dd }|d krg }ndd |dD }dt||ddd | j||
 || j||
g|| j di id}t| j|| j}t|ddjt||ddd | j||
 || j||
gdi i| j d}dddt id d  ddfdd}ddd  fd!d"}z6|  $}|tj|| j||| W 5 Q R X W n0 tk
r` } z| jrP|W 5 d }~X Y nX | jrzstd#nsd$g t d%t d ! d< tj"f d&i}d k	rЈ|_# |_$|S )'Nascii)encodingP   i  )httpwshttpswssr      hosts   hostc                 S  s$   g | ]\}}|   | fqS r   )lowerr   .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     r   Z	websocket   ?r   zwebsocket.http.response)rC   pathraw_pathr   schemequery_stringrE   r   serversubprotocolsstate
extensionsr   z1.1http.response.debug)rC   http_versionmethodr   r   r   r   r   rE   r   r   r   r   Fstreamr   rB   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 )	NrC   zhttp.disconnectr   rt   zhttp.requestT)rC   rr   rs   )rC   rr   )	is_setrj   readr_   r0   r   r   r(   StopIteration)rr   Z
body_byteschunk)r   request_completeresponse_completer   r   r'   B  s*    




z4_TestClientTransport.handle_request.<locals>.receiver"   rl   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 )NrC   zhttp.response.startz1Received multiple "http.response.start" messages.rq   ru   c                 S  s    g | ]\}}|  |  fqS r   )r   r   r   r   r   r   d  s     zE_TestClientTransport.handle_request.<locals>.send.<locals>.<listcomp>rE   Tzhttp.response.bodyz<Received "http.response.body" without "http.response.start".z7Received "http.response.body" after response completed.rr   rt   rs   FHEADr   r   r   infotemplatecontext)rw   rP   r   r   writeseekrX   )rR   rr   rs   )r   
raw_kwargsr   r   response_startedr   r   r   r(   ^  s$    

z1_TestClientTransport.handle_request.<locals>.sendz(TestClient did not receive any response.i  )ru   rE   r   r   )%urlr   netlocr   r   r   querysplitr   rE   r   Zmulti_itemsrP   r   r   r   r   copyr6   r   r;   r5   r   ioBytesIOcallrT   rU   r`   r   rw   httpxZ
ByteStreamr   Responser   r   )r$   r   r   r   r   r   r   default_portr   Zport_stringportrE   rD   r   r&   r7   r'   r(   rJ   rh   responser   )r   r   r   r   r   r   r   r   handle_request   s    



 
z#_TestClientTransport.handle_requestN)Trp   )r+   r,   r-   r%   r   r   r   r   r   r      s     r   c                      s
  e Zd ZU dZded< dZded< dLdddddddddddd fddZejddddZ	ddddddde
jje
jje
jjddddddd d!d"d#dd$d%d&dd'd( fd)d*Zddde
jje
jje
jjdd+dd"d#dd$d%d&dd'd,	 fd-d.Zddde
jje
jje
jjdd+dd"d#dd$d%d&dd'd,	 fd/d0Zddde
jje
jje
jjdd+dd"d#dd$d%d&dd'd,	 fd1d2Zddddddde
jje
jje
jjdddddd d!d"d#dd$d%d&dd'd3 fd4d5Zddddddde
jje
jje
jjdddddd d!d"d#dd$d%d&dd'd3 fd6d7Zddddddde
jje
jje
jjdddddd d!d"d#dd$d%d&dd'd3 fd8d9Zddde
jje
jje
jjdd+dd"d#dd$d%d&dd'd,	 fd:d;ZdMdd<d!d=d> fd?d@Zd ddAdBZd!ddCdDdEZdddFdGZdddHdIZdddJdKZ  ZS )N
TestClientFzFuture[None]taskNzanyio.abc.BlockingPortal | NonerJ   http://testserverTrp   asyncio
testclientiP  r   r0   r   z#typing.Literal[('asyncio', 'trio')]zdict[str, typing.Any] | Nonezhttpx._types.CookieTypes | Nonezdict[str, str] | Noner   r"   )r   base_urlr   r   r1   r3   cookiesrE   follow_redirectsr   r   c                   s   t ||p
i d| _t|r |}ntt|}t|}|| _i | _t	| j| j
||| j|
d}|d krfi }|dd t j||||	|d d S )N)r1   r3   )r;   r   r   r   r   z
user-agentr   )r   rE   	transportr   r   )r/   async_backendr   r   r   r!   r    r   r   r   _portal_factory
setdefaultsuperr%   )r$   r   r   r   r   r1   r3   r   rE   r   r   Zasgi_appr   	__class__r   r   r%     s2    zTestClient.__init__z6typing.Generator[anyio.abc.BlockingPortal, None, None]rB   c              	   c  s:   | j d k	r| j V  n"tjjf | j}|V  W 5 Q R X d S r#   )rJ   rT   from_threadstart_blocking_portalr   )r$   rJ   r   r   r   r     s    

zTestClient._portal_factoryrv   rz   filesr   paramsrE   r   authr   timeoutr   zhttpx._types.URLTypesz"httpx._types.RequestContent | Nonez_RequestData | Nonez httpx._types.RequestFiles | NonerZ   z#httpx._types.QueryParamTypes | Nonezhttpx._types.HeaderTypes | Nonez7httpx._types.AuthTypes | httpx._client.UseClientDefaultz%bool | httpx._client.UseClientDefaultz:httpx._types.TimeoutTypes | httpx._client.UseClientDefaultr   )r   r   rv   rz   r   r   r   rE   r   r   r   r   r   r   c                  s0   |  |}t j|||||||||	|
|||dS Nr   )Z
_merge_urlr   r   )r$   r   r   rv   rz   r   r   r   rE   r   r   r   r   r   r   r   r   r     s     
zTestClient.requestr   rE   r   r   r   r   r   )	r   r   rE   r   r   r   r   r   r   c          	   
     s   t  j||||||||dS Nr   )r   rP   	r$   r   r   rE   r   r   r   r   r   r   r   r   rP     s    zTestClient.getc          	   
     s   t  j||||||||dS r   )r   optionsr   r   r   r   r     s    zTestClient.optionsc          	   
     s   t  j||||||||dS r   )r   headr   r   r   r   r     s    zTestClient.head)r   rv   rz   r   r   r   rE   r   r   r   r   r   r   c                  s$   t  j|||||||||	|
||dS r   )r   postr$   r   rv   rz   r   r   r   rE   r   r   r   r   r   r   r   r   r   *  s    zTestClient.postc                  s$   t  j|||||||||	|
||dS r   )r   rg   r   r   r   r   rg   I  s    zTestClient.putc                  s$   t  j|||||||||	|
||dS r   )r   patchr   r   r   r   r   h  s    zTestClient.patchc          	   
     s   t  j||||||||dS r   )r   deleter   r   r   r   r     s    zTestClient.deleteztyping.Sequence[str] | Noner6   )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://testserverrE   
connectionupgradezsec-websocket-keyztestserver==zsec-websocket-versionZ13r   z, GETzExpected WebSocket upgrade)	r   rP   r   ry   r   r   r5   r7   RuntimeError)r$   r   r   r   rE   rh   r7   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
j\}}t	t
j\}}t||_t||_ j_ j |jdd fdd}| _W 5 Q R X S )Nr"   rB   c                     s
   d  _ d S r#   )rJ   r   rV   r   r   reset_portal  s    z*TestClient.__enter__.<locals>.reset_portalc                     s     j d S r#   )r   wait_shutdownr   rJ   r$   r   r   r    s    z+TestClient.__enter__.<locals>.wait_shutdown)rF   rG   rI   rT   r   r   r   rJ   callbackZcreate_memory_object_streammathinfr
   stream_sendstream_receiverK   lifespanr   r   wait_startuppop_allrH   )r$   stackr   Zsend1Zreceive1Zsend2Zreceive2r  r   r  r   rS     s    
zTestClient.__enter__r[   c                 G  s   | j   d S r#   )rH   rO   )r$   r\   r   r   r   ra     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  )rC   r   )r   r  r(   r   r  r'   )r$   r&   r   r   r   r    s     zTestClient.lifespanc                   s`    j ddiI d H  dd fdd}| I d H }|d dksDt|d dkr\| I d H  d S )	NrC   zlifespan.startuprZ   rB   c                    s&    j  I d H } | d kr" j  | S r#   r  r'   r   resultrR   rV   r   r   r'     s    
z(TestClient.wait_startup.<locals>.receive)zlifespan.startup.completelifespan.startup.failedr  )r  r(   rw   r$   r'   rR   r   rV   r   r	    s    zTestClient.wait_startupc                   s   dd fdd} j 4 I d H p  j4 I d H P  jddiI d H  | I d H }|d dksdt|d dkr|| I d H  W 5 Q I d H R X W 5 Q I d H R X d S )	NrZ   rB   c                    s&    j  I d H } | d kr" j  | S r#   r  r  rV   r   r   r'     s    
z)TestClient.wait_shutdown.<locals>.receiverC   zlifespan.shutdown)zlifespan.shutdown.completelifespan.shutdown.failedr  )r  r  r(   rw   r  r   rV   r   r    s     zTestClient.wait_shutdown)	r   Trp   r   NNNTr   )N)r+   r,   r-   Z__test__r4   rJ   r%   rF   contextmanagerr   r   Z_clientZUSE_CLIENT_DEFAULTr   rP   r   r   r   rg   r   r   r   rS   ra   r  r	  r  __classcell__r   r   r   r   r     s   
         ((0&&&&.#.#.#& r   )F
__future__r   rF   r   r   r   r  r=   sysr   concurrent.futuresr   	functoolsr   typesr   urllib.parser   r   rT   Z	anyio.abcZanyio.from_threadr   r	   Zanyio.streams.stapledr
   Zstarlette._utilsr   Zstarlette.typesr   r   r   r   r   Zstarlette.websocketsr   version_infor   typing_extensionsr   ModuleNotFoundErrorr   CallableContextManagerabcZBlockingPortalr:   	AwaitableZASGIInstancer!   r9   Mappingr0   UnionIterabler   Z_RequestDatar   r    	TypedDictr/   rN   r5   r   r8   r6   ZBaseTransportr   ZClientr   r   r   r   r   <module>   s^   
 

  *