o
    likm                     @  sd  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	m
Z
mZmZmZmZmZ d dl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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l0m/Z/ ej.dkrd dlm1Z1 nd dl0m1Z1 zd dl2Z2W n e3y   e4dw eg eej5j6 f Z7ee)e+ge
d f Z8ee*ge8f Z9ee*e)e+ge
d f Z:ee;ee;ee; e<f f Z=d&ddZ>G dd dZ?G dd deZ@G dd deAZBG dd de2jCe-ZDG d d! d!ZEG d"d# d#e2jFZGG d$d% d%e2jHZIdS )'    )annotationsN)	Awaitable	GeneratorIterableMappingMutableMappingSequence)Future)AbstractContextManager)GeneratorType)AnyCallableLiteral	TypedDictUnioncast)unquoteurljoin)StapledObjectStream)is_async_callable)ASGIAppMessageReceiveScopeSend)WebSocketDisconnect)   
   )	TypeGuard)r      )SelfzThe starlette.testclient module requires the httpx package to be installed.
You can install this with:
    $ pip install httpx
appASGI2App | ASGI3AppreturnTypeGuard[ASGI3App]c                 C  s   t | r
t| dS t| S )N	__await__)inspectisclasshasattrr   r!    r*   [/home/app/PaddleOCR-VL/.venv_paddleocr/lib/python3.10/site-packages/starlette/testclient.py	_is_asgi3=   s   

r,   c                   @  s$   e Zd ZdZdddZdddZdS )
_WrapASGI2z7
    Provide an ASGI3 interface onto an ASGI2 app.
    r!   ASGI2Appr#   Nonec                 C  
   || _ d S Nr)   )selfr!   r*   r*   r+   __init__H      
z_WrapASGI2.__init__scoper   receiver   sendr   c                   s    |  |}|||I d H  d S r1   r)   )r2   r5   r6   r7   instancer*   r*   r+   __call__K   s   
z_WrapASGI2.__call__N)r!   r.   r#   r/   )r5   r   r6   r   r7   r   r#   r/   )__name__
__module____qualname____doc__r3   r9   r*   r*   r*   r+   r-   C   s    
r-   c                   @  s   e Zd ZU ded< ded< dS )_AsyncBackendstrbackenddict[str, Any]backend_optionsN)r:   r;   r<   __annotations__r*   r*   r*   r+   r>   P   s   
 r>   c                   @  s   e Zd ZdddZdS )	_UpgradesessionWebSocketTestSessionr#   r/   c                 C  r0   r1   )rE   )r2   rE   r*   r*   r+   r3   V   r4   z_Upgrade.__init__N)rE   rF   r#   r/   )r:   r;   r<   r3   r*   r*   r*   r+   rD   U   s    rD   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+   rG   Z   s    rG   c                   @  s   e Zd Zd8d	d
Zd9ddZd:ddZd;ddZd<ddZd<ddZd=ddZ	d>d!d"Z
d?d@d&d'ZdAdBd.d/ZdCd0d1ZdDd2d3ZdEd4d5Zd?dFd6d7Zd)S )GrF   r!   ASGI3Appr5   r   portal_factory_PortalFactoryTyper#   r/   c                 C  s"   || _ || _d | _|| _d | _d S r1   )r!   r5   accepted_subprotocolrI   extra_headers)r2   r!   r5   rI   r*   r*   r+   r3   e   s
   
zWebSocketTestSession.__init__c                 C  s   t  T}||   | _}|| j\}}||j ||j	|j
 | ddi |  }| | |dd | _|dd | _|| jd | | _| W  d    S 1 s[w   Y  d S )Ntypezwebsocket.connectsubprotocolheaders  )
contextlib	ExitStackenter_contextrI   portal
start_task_runcallbackresultcallcancelr7   r6   _raise_on_closegetrK   rL   closepop_all
exit_stack)r2   stackrT   futcsmessager*   r*   r+   	__enter__q   s   


$zWebSocketTestSession.__enter__argsr   bool | Nonec                 G  s   | j j| S r1   )r_   __exit__r2   re   r*   r*   r+   rg      s   zWebSocketTestSession.__exit__task_status'anyio.abc.TaskStatus[anyio.CancelScope]c          	        s6  t tj}|\}}t tj}|\}}|z |_ |M |; t  '}|| _|| _|| | | j	|j
|jI dH  t  I dH  W d   n1 sOw   Y  W d   n1 s^w   Y  W d   n1 smw   Y  W d   n1 s|w   Y  W d   dS W d   dS 1 sw   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!   r5   r6   r7   Zsleep_forever)	r2   ri   r7   Zsend_txZsend_rxr6   Z
receive_txZ
receive_rxrb   r*   r*   r+   rV      s$   "
  P zWebSocketTestSession._runrc   r   c                 C  s   |d dkrt |dd|ddd|d dkrJ|d	 }|d
 }g }	 |  }|d dks1J ||d  |dds?nq%t||d|dd S )NrM   zwebsocket.closecoderP   reason )rr   rs   zwebsocket.http.response.startstatusrO   Tzwebsocket.http.response.bodybody	more_bodyF    )status_coderO   content)r   r\   r6   appendrG   join)r2   rc   ry   rO   rv   r*   r*   r+   r[      s   z$WebSocketTestSession._raise_on_closec                 C  s   | j | jj| d S r1   )rT   rY   ro   r7   r2   rc   r*   r*   r+   r7         zWebSocketTestSession.senddatar?   c                 C     |  d|d d S )Nwebsocket.receiverM   textr7   r2   r   r*   r*   r+   	send_text      zWebSocketTestSession.send_textbytesc                 C  r   )Nr   rM   r   r   r   r*   r*   r+   
send_bytes   r   zWebSocketTestSession.send_bytesr   modeLiteral['text', 'binary']c                 C  sF   t j|ddd}|dkr| d|d d S | d|dd d S )	N),:F)
separatorsensure_asciir   r   r   utf-8r   )jsondumpsr7   encode)r2   r   r   r   r*   r*   r+   	send_json   s   zWebSocketTestSession.send_jsonrP   Nrr   intrs   
str | Nonec                 C  s   |  d||d d S )Nzwebsocket.disconnect)rM   rr   rs   r   )r2   rr   rs   r*   r*   r+   r]      r~   zWebSocketTestSession.closec                 C  s   | j | jjS r1   )rT   rY   rp   r6   r2   r*   r*   r+   r6      s   zWebSocketTestSession.receivec                 C      |   }| | tt|d S )Nr   )r6   r[   r   r?   r}   r*   r*   r+   receive_text      
z!WebSocketTestSession.receive_textc                 C  r   )Nr   )r6   r[   r   r   r}   r*   r*   r+   receive_bytes   r   z"WebSocketTestSession.receive_bytesc                 C  s<   |   }| | |dkr|d }n|d d}t|S )Nr   r   r   )r6   r[   decoder   loads)r2   r   rc   r   r*   r*   r+   receive_json   s   


z!WebSocketTestSession.receive_json)r!   rH   r5   r   rI   rJ   r#   r/   )r#   rF   )re   r   r#   rf   )ri   rj   r#   r/   rc   r   r#   r/   )r   r?   r#   r/   )r   r   r#   r/   )r   )r   r   r   r   r#   r/   )rP   N)rr   r   rs   r   r#   r/   r#   r   )r#   r?   )r#   r   )r   r   r#   r   )r:   r;   r<   r3   rd   rg   rV   r[   r7   r   r   r   r]   r6   r   r   r   r*   r*   r*   r+   rF   d   s    










rF   c                   @  s&   e Zd Z		ddddZdddZdS )_TestClientTransportTrt   r!   rH   rI   rJ   raise_server_exceptionsbool	root_pathr?   clienttuple[str, int]	app_staterA   r#   r/   c                C  s(   || _ || _|| _|| _|| _|| _d S r1   )r!   r   r   rI   r   r   )r2   r!   rI   r   r   r   r   r*   r*   r+   r3      s   

z_TestClientTransport.__init__requesthttpx.Requesthttpx.Responsec                   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||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'fdd}d( fd!d"}z&|  }|tj|| j||| W d    n	1 sw   Y  W n ty6 } z| jr,|W Y d }~nd }~ww | jrCsBJ d#nsNd$g t d%td   d< tj!d)i d&i}d urp|_" |_#|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)rM   pathraw_pathr   schemequery_stringrO   r   serversubprotocolsstate
extensionsr   z1.1http.response.debug)rM   http_versionmethodr   r   r   r   r   rO   r   r   r   r   Fstreamr#   r   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 )	NrM   zhttp.disconnectr   rx   zhttp.requestT)rM   rv   rw   )rM   rv   )	is_setwaitread
isinstancer?   r   r   r7   StopIteration)rv   Z
body_byteschunk)r   request_completeresponse_completer*   r+   r6   *  s.   





z4_TestClientTransport.handle_request.<locals>.receiverc   r/   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 )NrM   zhttp.response.startz1Received multiple "http.response.start" messages.ru   ry   c                 S  s    g | ]\}}|  |  fqS r*   )r   r   r*   r*   r+   r   L  s     zE_TestClientTransport.handle_request.<locals>.send.<locals>.<listcomp>rO   Tzhttp.response.bodyz<Received "http.response.body" without "http.response.start".z7Received "http.response.body" after response completed.rv   rx   rw   FHEADr   r   r   infotemplatecontext)r\   r   r   writeseekset)rc   rv   rw   )r   
raw_kwargsr   r   response_startedr   r*   r+   r7   F  s*   
z1_TestClientTransport.handle_request.<locals>.sendz(TestClient did not receive any response.i  )ry   rO   r   r   r   r   r*   )$urlr   netlocr   r   r   querysplitr   rO   r   Zmulti_itemsr\   r   r   r   r   copyrF   r!   rI   rD   r   ioBytesIOrY   rk   EventBaseExceptionr   httpxZ
ByteStreamr   Responser   r   )r2   r   r   r   r   r   r   default_portr   Zport_stringportrO   rN   r   r5   rE   r6   r7   rT   excresponser*   )r   r   r   r   r   r   r   r+   handle_request   s   



z#_TestClientTransport.handle_requestN)Trt   )r!   rH   rI   rJ   r   r   r   r?   r   r   r   rA   r#   r/   )r   r   r#   r   )r:   r;   r<   r3   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< 					
					d^d_ fd d!Zejd`d#d$Z	ddddddde
jje
jje
jjdd%da fd;d<Zddde
jje
jje
jjdd=db fd>d?Zddde
jje
jje
jjdd=db fd@dAZddde
jje
jje
jjdd=db fdBdCZddddddde
jje
jje
jjdd%dc fdDdEZddddddde
jje
jje
jjdd%dc fdFdGZddddddde
jje
jje
jjdd%dc fdHdIZddde
jje
jje
jjdd=db fdJdKZ	ddde fdPdQZdfdSdTZdgdVdWZdhdXdYZdhdZd[Zdhd\d]Z  ZS )i
TestClientFzFuture[None]taskNzanyio.abc.BlockingPortal | NonerT   http://testserverTrt   asyncio
testclientiP  r!   r   base_urlr?   r   r   r   r@   Literal['asyncio', 'trio']rB   dict[str, Any] | Nonecookieshttpx._types.CookieTypes | NonerO   dict[str, str] | Nonefollow_redirectsr   r   r#   r/   c                   s   t ||pi d| _t|r|}n	tt|}t|}|| _i | _t| j| j	||| j|
d}|d u r2i }|
dd t j||||	|d d S )N)r@   rB   )rI   r   r   r   r   z
user-agentr   )r   rO   	transportr   r   )r>   async_backendr,   r   r.   r-   r!   r   r   _portal_factory
setdefaultsuperr3   )r2   r!   r   r   r   r@   rB   r   rO   r   r   Zasgi_appr   	__class__r*   r+   r3   {  s2   

zTestClient.__init__/Generator[anyio.abc.BlockingPortal, None, None]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*   )rT   rk   from_threadstart_blocking_portalr   )r2   rT   r*   r*   r+   r     s   
"zTestClient._portal_factoryrz   r   filesr   paramsrO   r   authr   timeoutr   r   r   httpx._types.URLTypesrz   "httpx._types.RequestContent | Noner   _RequestData | Noner   httpx._types.RequestFiles | Noner   r   r  #httpx._types.QueryParamTypes | Nonehttpx._types.HeaderTypes | Noner  7httpx._types.AuthTypes | httpx._client.UseClientDefault%bool | httpx._client.UseClientDefaultr  :httpx._types.TimeoutTypes | httpx._client.UseClientDefaultr   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/Kludex/starlette/issues/1108 for more information.r  )r   USE_CLIENT_DEFAULTwarningswarnDeprecationWarningZ
_merge_urlr   r   )r2   r   r   rz   r   r  r   r  rO   r   r  r   r  r   r   r*   r+   r     s*   

zTestClient.requestr  rO   r   r  r   r  r   c          	   
        t  j||||||||dS Nr  )r   r\   	r2   r   r  rO   r   r  r   r  r   r   r*   r+   r\        zTestClient.getc          	   
     r  r  )r   optionsr  r   r*   r+   r    r  zTestClient.optionsc          	   
     r  r  )r   headr  r   r*   r+   r    r  zTestClient.headc                  $   t  j|||||||||	|
||dS Nr  )r   postr2   r   rz   r   r  r   r  rO   r   r  r   r  r   r   r*   r+   r       zTestClient.postc                  r  r  )r   putr  r   r*   r+   r   7  r  zTestClient.putc                  r  r  )r   patchr  r   r*   r+   r!  V  r  zTestClient.patchc          	   
     r  r  )r   deleter  r   r*   r+   r"  u  r  zTestClient.deleter   Sequence[str] | NonekwargsrF   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://testserverrO   
connectionupgradezsec-websocket-keyztestserver==zsec-websocket-versionZ13r   z, GETzExpected WebSocket upgrade)	r   r\   r   r|   r   r   rD   rE   RuntimeError)r2   r   r   r$  rO   r   rE   r   r*   r+   websocket_connect  s    
zTestClient.websocket_connectr    c                   s   t  f}|tjjdi j _ |jdfdd}t	t
j}t	t
j}g ||R D ]}||j q2t| _t| _ j_ j |jd fdd}| _W d    S 1 smw   Y  S )	Nr#   r/   c                     s
   d  _ d S r1   )rT   r*   r   r*   r+   reset_portal  s   
z*TestClient.__enter__.<locals>.reset_portalc                     s     j d S r1   )rY   wait_shutdownr*   rT   r2   r*   r+   r+    s   z+TestClient.__enter__.<locals>.wait_shutdownr*   r#   r/   )rQ   rR   rS   rk   r   r  r   rT   rW   rl   rm   rn   r]   r   stream_sendstream_receiveZstart_task_soonlifespanr   rY   wait_startupr^   r_   )r2   r`   r*  r7   r6   Zchannelr+  r*   r,  r+   rd     s,   
 



zTestClient.__enter__re   c                 G  s   | j   d S r1   )r_   r]   rh   r*   r*   r+   rg     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 )Nr0  )rM   r   )r   r!   r/  r6   r.  r7   )r2   r5   r*   r*   r+   r0    s
   *zTestClient.lifespanc                   sb    j ddiI d H  d	 fdd}| I d H }|d dv s!J |d dkr/| I d H  d S d S )
NrM   zlifespan.startupr#   r   c                    (    j  I d H } | d u r j  | S r1   r.  r6   r   rX   rc   r   r*   r+   r6     
   
z(TestClient.wait_startup.<locals>.receive)zlifespan.startup.completelifespan.startup.failedr6  r#   r   r/  r7   r2   r6   rc   r*   r   r+   r1    s   zTestClient.wait_startupc                   sb   d	 fdd} j ddiI d H  | I d H }|d dv s!J |d dkr/| I d H  d S d S )
Nr#   r   c                    r2  r1   r3  r4  r   r*   r+   r6     r5  z)TestClient.wait_shutdown.<locals>.receiverM   zlifespan.shutdown)zlifespan.shutdown.completelifespan.shutdown.failedr:  r7  r8  r9  r*   r   r+   r+    s   zTestClient.wait_shutdown)	r   Trt   r   NNNTr   )r!   r   r   r?   r   r   r   r?   r@   r   rB   r   r   r   rO   r   r   r   r   r   r#   r/   )r#   r   )r   r?   r   r  rz   r  r   r	  r  r
  r   r   r  r  rO   r  r   r   r  r  r   r  r  r  r   r   r#   r   )r   r  r  r  rO   r  r   r   r  r  r   r  r  r  r   r   r#   r   )r   r  rz   r  r   r	  r  r
  r   r   r  r  rO   r  r   r   r  r  r   r  r  r  r   r   r#   r   r1   )r   r?   r   r#  r$  r   r#   rF   )r#   r    )re   r   r#   r/   r-  )r:   r;   r<   Z__test__rC   rT   r3   rQ   contextmanagerr   r   Z_clientr  r   r\   r  r  r  r   r!  r"  r)  rd   rg   r0  r1  r+  __classcell__r*   r*   r   r+   r   v  s   
 (,###



r   )r!   r"   r#   r$   )J
__future__r   rQ   r&   r   r   rm   sysr  collections.abcr   r   r   r   r   r   concurrent.futuresr	   r
   typesr   typingr   r   r   r   r   r   urllib.parser   r   rk   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    r   ModuleNotFoundErrorr(  abcZBlockingPortalrJ   ZASGIInstancer.   rH   r?   r   Z_RequestDatar,   r-   r>   	ExceptionrD   r   rG   rF   BaseTransportr   ZClientr   r*   r*   r*   r+   <module>   sf      




i *