a
    &gSm                     @  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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! zd dl#Z#W n e$y   e%dY n0 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/e0ej1e0ej2e0 e3f f Z4dddddZ5G dd dZ6G dd dej7Z8G dd de9Z:G dd de#j;eZ<G dd dZ=G dd de#j>Z?G dd de#j@ZAdS )     )annotationsN)Future)GeneratorType)unquoteurljoin)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   R/var/www/html/texto_audio/venv/lib/python3.9/site-packages/starlette/testclient.py	_is_asgi3/   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   5   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,   B   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    )r4   )r!   r4   r   r   r   r"   H   s    z_Upgrade.__init__N)r(   r)   r*   r"   r   r   r   r   r2   G   s   r2   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   r5   L   s   r5   c                   @  s   e Zd Zddd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 Z
d6dd"dd#d$d%Zd7d(d)dd*d+d,Zddd-d.Zddd/d0Zddd1d2Zd8d"dd3d4d5Zd'S )9r3   ASGI3Appr   _PortalFactoryTyper   )r   r#   portal_factoryr   c                 C  s"   || _ || _d | _|| _d | _d S r    )r   r#   accepted_subprotocolr8   extra_headers)r!   r   r#   r8   r   r   r   r"   W   s
    zWebSocketTestSession.__init__r   c                 C  s   t  }||   | _}|| j\}}||j ||j	|j
 | ddi |  }| | |dd | _|dd | _|| jd | | _| W  d    S 1 s0    Y  d S )Ntypezwebsocket.connectsubprotocolheaders  )
contextlib	ExitStackenter_contextr8   portalZ
start_task_runcallbackresultcallcancelr%   r$   _raise_on_closegetr9   r:   closepop_all
exit_stack)r!   stackrC   Zfutcsmessager   r   r   	__enter__c   s    


zWebSocketTestSession.__enter__
typing.Anyzbool | Noneargsr   c                 G  s   | j j| S r    )rM   __exit__r!   rT   r   r   r   rU   r   s    zWebSocketTestSession.__exit__z'anyio.abc.TaskStatus[anyio.CancelScope])task_statusr   c          	        s$  t tj}|\}}t tj}|\}}| | | |v t  N}|| _|| _|| | | j	|j
|jI dH  t  I dH  W d   n1 s0    Y  W d   n1 s0    Y  W d   n1 s0    Y  W d   n1 s0    Y  W d   n1 s0    Y  dS )zE
        The sub-thread in which the websocket session runs.
        N)anyiocreate_memory_object_streammathinfZCancelScope_receive_tx_send_rxstartedr   r#   r$   r%   Zsleep_forever)	r!   rW   r%   Zsend_txZsend_rxr$   Z
receive_txZ
receive_rxrO   r   r   r   rD   u   s    "
zWebSocketTestSession._runr
   rP   r   c                 C  s   |d dkr*t |dd|dddnj|d dkr|d	 }|d
 }g }|  }|d dksbJ ||d  |ddsJqqJt||d|dd S )Nr<   zwebsocket.closecoder?   reason )r`   ra   zwebsocket.http.response.startstatusr>   zwebsocket.http.response.bodybody	more_bodyF    )status_coder>   content)r   rJ   r$   appendr5   join)r!   rP   rg   r>   rd   r   r   r   rI      s    z$WebSocketTestSession._raise_on_closec                 C  s   | j | jj| d S r    )rC   rG   r\   r%   r!   rP   r   r   r   r%      s    zWebSocketTestSession.sendr-   )datar   c                 C  s   |  d|d d S )Nwebsocket.receiver<   textr%   r!   rl   r   r   r   	send_text   s    zWebSocketTestSession.send_textbytesc                 C  s   |  d|d d S )Nrm   r<   rs   rp   rq   r   r   r   
send_bytes   s    zWebSocketTestSession.send_bytesro   z typing.Literal['text', 'binary'])rl   moder   c                 C  sD   t j|ddd}|dkr*| d|d n| d|dd d S )	N),:F)
separatorsensure_asciiro   rm   rn   utf-8rt   )jsondumpsr%   encode)r!   rl   rv   ro   r   r   r   	send_json   s    zWebSocketTestSession.send_jsonr?   Nintz
str | None)r`   ra   r   c                 C  s   |  d||d d S )Nzwebsocket.disconnect)r<   r`   ra   rp   )r!   r`   ra   r   r   r   rK      s    zWebSocketTestSession.closec                 C  s   | j | jjS r    )rC   rG   r]   r$   r!   r   r   r   r$      s    zWebSocketTestSession.receivec                 C  s"   |   }| | tt|d S )Nro   )r$   rI   typingcastr-   rk   r   r   r   receive_text   s    
z!WebSocketTestSession.receive_textc                 C  s"   |   }| | tt|d S )Nrs   )r$   rI   r   r   rs   rk   r   r   r   receive_bytes   s    
z"WebSocketTestSession.receive_bytes)rv   r   c                 C  s<   |   }| | |dkr$|d }n|d d}t|S )Nro   rs   r{   )r$   rI   decoder|   loads)r!   rv   rP   ro   r   r   r   receive_json   s    

z!WebSocketTestSession.receive_json)ro   )r?   N)ro   )r(   r)   r*   r"   rQ   rU   rD   rI   r%   rr   ru   r   rK   r$   r   r   r   r   r   r   r   r3   V   s   r3   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 )_TestClientTransportTrb   r6   r7   boolr-   tuple[str, int]r/   r   )r   r8   raise_server_exceptions	root_pathclient	app_stater   c                C  s(   || _ || _|| _|| _|| _|| _d S r    )r   r   r   r8   r   r   )r!   r   r8   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|v rl|dd\}}	t|	}
n|}|}
dj	v rg }n0|
|krd	|
 fg}nd	| d|
 
 fg}|d
d j	 D 7 }|dv rbj	dd }|d u 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"}zL|  .}|tj|| j||| W d    n1 s:0    Y  W n2 tyx } z| jrd|W Y d }~n
d }~0 0 | jrsJ d#nsd$g t d%td   d< tj!f i d&i}d ur|_" |_#|S )'Nascii)encodingP   i  )httpwshttpswssrx      hosts   hostc                 S  s$   g | ]\}}|   | fqS r   )lowerr~   .0keyvaluer   r   r   
<listcomp>   rf   z7_TestClientTransport.handle_request.<locals>.<listcomp>>   r   r   sec-websocket-protocolc                 S  s   g | ]}|  qS r   )strip)r   r   r   r   r   r      rf   rw   Z	websocket   ?r   zwebsocket.http.response)r<   pathraw_pathr   schemequery_stringr>   r   serversubprotocolsstate
extensionsr   z1.1http.response.debug)r<   http_versionmethodr   r   r   r   r   r>   r   r   r   r   Fstreamr
   r;   c                    s   r"  s I d H  ddiS   } t| tr@| d}nl| d u rNd}n^t| trz,| d }t|trx|d}d|ddW S  ty   dddd Y S 0 n| }dd|dS )	Nr<   zhttp.disconnectr{   rf   zhttp.requestT)r<   rd   re   )r<   rd   )	is_setwaitread
isinstancer-   r~   r   r%   StopIteration)rd   Z
body_byteschunk)r   request_completeresponse_completer   r   r$     s*    




z4_TestClientTransport.handle_request.<locals>.receiver   r_   c                   s   | d dkrDrJ d| d d< dd |  dg D d< d	n| d d
krs\J d rlJ 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.rc   rg   c                 S  s    g | ]\}}|  |  fqS r   )r   r   r   r   r   r   >  rf   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.rd   rf   re   FHEADr   r   r   infotemplatecontext)rJ   r   r   writeseekset)rP   rd   re   )r   
raw_kwargsr   r   response_startedr   r   r   r%   8  s$    

z1_TestClientTransport.handle_request.<locals>.sendz(TestClient did not receive any response.i  )rg   r>   r   r   )$urlr   netlocr   r   r   querysplitr   r>   r~   Zmulti_itemsrJ   r   r   r   r   copyr3   r   r8   r2   r   ioBytesIOrG   rX   EventBaseExceptionr   httpxZ
ByteStreamr   Responser   r   )r!   r   r   r   r   r   r   default_portr   Zport_stringportr>   r=   r   r#   r4   r$   r%   rC   excresponser   )r   r   r   r   r   r   r   r   handle_request   s    



6
z#_TestClientTransport.handle_requestN)Trb   )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 | NonerC   http://testserverTrb   asyncio
testclientiP  r	   r-   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   r.   r0   cookiesr>   follow_redirectsr   r   c                   s   t ||p
i d| _t|r |}ntt|}t|}|| _i | _t	| j| j
||| j|
d}|d u rfi }|dd t j||||	|d d S )N)r.   r0   )r8   r   r   r   r   z
user-agentr   )r   r>   	transportr   r   )r,   async_backendr   r   r   r   r   r   r   r   _portal_factory
setdefaultsuperr"   )r!   r   r   r   r   r.   r0   r   r>   r   r   Zasgi_appr   	__class__r   r   r"   m  s2    zTestClient.__init__z6typing.Generator[anyio.abc.BlockingPortal, None, None]r;   c                 c  sR   | j d ur| j V  n:tjjf i | j}|V  W d    n1 sD0    Y  d S r    )rC   rX   from_threadstart_blocking_portalr   )r!   rC   r   r   r   r     s    

zTestClient._portal_factoryrh   rl   filesr|   paramsr>   r   authr   timeoutr   zhttpx._types.URLTypesz"httpx._types.RequestContent | Nonez_RequestData | Nonez httpx._types.RequestFiles | NonerR   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   rh   rl   r   r|   r   r>   r   r   r   r   r   r   c                  sF   |t jurtdt | |}t j|||||||||	|
|||dS )NzYou should not use the 'timeout' argument with the TestClient. See https://github.com/encode/starlette/issues/1108 for more information.r   )r   USE_CLIENT_DEFAULTwarningswarnDeprecationWarningZ
_merge_urlr   r   )r!   r   r   rh   rl   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   c          	   
     s   t  j||||||||dS Nr   )r   rJ   	r!   r   r   r>   r   r   r   r   r   r   r   r   rJ     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   rh   rl   r   r|   r   r>   r   r   r   r   r   r   c                  s$   t  j|||||||||	|
||dS Nr   )r   postr!   r   rh   rl   r   r|   r   r>   r   r   r   r   r   r   r   r   r   
  s    zTestClient.postc                  s$   t  j|||||||||	|
||dS r   )r   putr   r   r   r   r   )  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   g  s    zTestClient.deleteztyping.Sequence[str] | Noner3   )r   r   kwargsr   c              
     s   t d|}|di }|dd |dd |dd |d urT|d	d
| ||d< zt jd|fi | W n* ty } z|j}W Y d }~nd }~0 0 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   rj   r   r   r2   r4   RuntimeError)r!   r   r   r   r>   r   r4   r   r   r   websocket_connect~  s    
zTestClient.websocket_connectc                   s   t  }|tjjf i j _ |jddfdd}t	t
j}t	t
j}g ||R D ]}||j qht| _t| _ j_ j |jdd fdd}| _W d    n1 s0    Y  S )Nr   r;   c                     s
   d  _ d S r    )rC   r   r   r   r   reset_portal  s    z*TestClient.__enter__.<locals>.reset_portalc                     s     j d S r    )rG   wait_shutdownr   rC   r!   r   r   r     s    z+TestClient.__enter__.<locals>.wait_shutdown)r@   rA   rB   rX   r   r   r   rC   rE   rY   rZ   r[   rK   r   stream_sendstream_receiveZstart_task_soonlifespanr   rG   wait_startuprL   rM   )r!   rN   r   r%   r$   Zchannelr   r   r   r   rQ     s$    
 



(zTestClient.__enter__rS   c                 G  s   | j   d S r    )rM   rK   rV   r   r   r   rU     s    zTestClient.__exit__c              	     sX   d| j d}z2| || jj| jjI d H  W | jd I d H  n| jd I d H  0 d S )Nr  )r<   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v sDJ |d dkr\| I d H  d S )	Nr<   zlifespan.startuprR   r;   c                    s&    j  I d H } | d u r" j  | S r    r   r$   r   rF   rP   r   r   r   r$     s    
z(TestClient.wait_startup.<locals>.receive)zlifespan.startup.completelifespan.startup.failedr  r  r%   r!   r$   rP   r   r   r   r    s    zTestClient.wait_startupc                   s`   dd fdd} j ddiI d H  | I d H }|d dv sDJ |d dkr\| I d H  d S )	NrR   r;   c                    s&    j  I d H } | d u 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  r  r   r   r   r     s    zTestClient.wait_shutdown)	r   Trb   r   NNNTr   )N)r(   r)   r*   Z__test__r1   rC   r"   r@   contextmanagerr   r   Z_clientr   r   rJ   r   r   r   r   r   r   r   rQ   rU   r  r  r   __classcell__r   r   r   r   r   h  s   
         ((0,&&&.#.#.#& r   )B
__future__r   r@   r   r   r|   rZ   sysr   r   concurrent.futuresr   typesr   urllib.parser   r   rX   Z	anyio.abcZanyio.from_threadZanyio.streams.stapledr   Zstarlette._utilsr   Zstarlette.typesr	   r
   r   r   r   Zstarlette.websocketsr   version_infor   Ztyping_extensionsr   ModuleNotFoundErrorr   CallableContextManagerabcZBlockingPortalr7   	AwaitableZASGIInstancer   r6   Mappingr-   UnionIterablers   Z_RequestDatar   r   	TypedDictr,   	Exceptionr2   r   r5   r3   ZBaseTransportr   ZClientr   r   r   r   r   <module>   sX   

 

i *