o
    hSm                     @  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rrd dlm!Z! nd dl"m!Z! zd dl#Z#W n e$y   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/e0ej1e0ej2e0 e3f f Z4d!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
appASGI2App | ASGI3AppreturnTypeGuard[ASGI3App]c                 C  s   t | r
t| dS t| S )N	__await__)inspectisclasshasattrr   r    r   h/var/www/html/construction_image-detection-poc/venv/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__:      
z_WrapASGI2.__init__scoper   receiver   sendr   c                   s    |  |}|||I d H  d S r"   r   )r#   r&   r'   r(   instancer   r   r   __call__=   s   
z_WrapASGI2.__call__N)r   r   r   r    )r&   r   r'   r   r(   r   r   r    )__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ZdS )	_UpgradesessionWebSocketTestSessionr   r    c                 C  r!   r"   )r6   )r#   r6   r   r   r   r$   H   r%   z_Upgrade.__init__N)r6   r7   r   r    )r+   r,   r-   r$   r   r   r   r   r5   G   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   L   s    r8   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 )Gr7   r   ASGI3Appr&   r   portal_factory_PortalFactoryTyper   r    c                 C  s"   || _ || _d | _|| _d | _d S r"   )r   r&   accepted_subprotocolr:   extra_headers)r#   r   r&   r:   r   r   r   r$   W   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_contextr:   portal
start_task_runcallbackresultcallcancelr(   r'   _raise_on_closegetr<   r=   closepop_all
exit_stack)r#   stackrE   futcsmessager   r   r   	__enter__c   s   


$zWebSocketTestSession.__enter__args
typing.Anybool | Nonec                 G  s   | j j| S r"   )rP   __exit__r#   rV   r   r   r   rY   r   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infCancelScope_receive_tx_send_rxstartedr   r&   r'   r(   sleep_forever)	r#   r[   r(   send_txsend_rxr'   
receive_tx
receive_rxrS   r   r   r   rG   u   s$   "
  P zWebSocketTestSession._runrT   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 )Nr>   zwebsocket.closecoderA   reason )rj   rk   zwebsocket.http.response.startstatusr@   Tzwebsocket.http.response.bodybody	more_bodyF    )status_coder@   content)r   rM   r'   appendr8   join)r#   rT   rq   r@   rn   r   r   r   rL      s   z$WebSocketTestSession._raise_on_closec                 C  s   | j | jj| d S r"   )rE   rJ   rb   r(   r#   rT   r   r   r   r(         zWebSocketTestSession.senddatar0   c                 C     |  d|d d S )Nwebsocket.receiver>   textr(   r#   rw   r   r   r   	send_text      zWebSocketTestSession.send_textbytesc                 C  rx   )Nry   r>   r   r|   r}   r   r   r   
send_bytes   r   zWebSocketTestSession.send_bytesr{   mode typing.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{   ry   rz   utf-8r   )jsondumpsr(   encode)r#   rw   r   r{   r   r   r   	send_json   s   zWebSocketTestSession.send_jsonrA   Nrj   intrk   
str | Nonec                 C  s   |  d||d d S )Nzwebsocket.disconnect)r>   rj   rk   r|   )r#   rj   rk   r   r   r   rN      rv   zWebSocketTestSession.closec                 C  s   | j | jjS r"   )rE   rJ   rc   r'   r#   r   r   r   r'      s   zWebSocketTestSession.receivec                 C  "   |   }| | tt|d S )Nr{   )r'   rL   typingcastr0   ru   r   r   r   receive_text      
z!WebSocketTestSession.receive_textc                 C  r   )Nr   )r'   rL   r   r   r   ru   r   r   r   receive_bytes   r   z"WebSocketTestSession.receive_bytesc                 C  s<   |   }| | |dkr|d }n|d d}t|S )Nr{   r   r   )r'   rL   decoder   loads)r#   r   rT   r{   r   r   r   receive_json   s   


z!WebSocketTestSession.receive_json)r   r9   r&   r   r:   r;   r   r    )r   r7   )rV   rW   r   rX   )r[   r\   r   r    rT   r
   r   r    )rw   r0   r   r    )rw   r   r   r    )r{   )rw   rW   r   r   r   r    )rA   N)rj   r   rk   r   r   r    r   r
   )r   r0   )r   r   )r   r   r   rW   )r+   r,   r-   r$   rU   rY   rG   rL   r(   r~   r   r   rN   r'   r   r   r   r   r   r   r   r7   V   s    










r7   c                   @  s&   e Zd Z		ddddZdddZdS )_TestClientTransportTrl   r   r9   r:   r;   raise_server_exceptionsbool	root_pathr0   clienttuple[str, int]	app_stater2   r   r    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__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   	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}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.disconnectr   rp   zhttp.requestT)r>   rn   ro   )r>   rn   )	is_setwaitread
isinstancer0   r   r   r(   StopIteration)rn   
body_byteschunk)r   request_completeresponse_completer   r   r'     s.   





z4_TestClientTransport.handle_request.<locals>.receiverT   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 )Nr>   zhttp.response.startz1Received multiple "http.response.start" messages.rm   rq   c                 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.rn   rp   ro   FHEADr   r   r   infotemplatecontext)rM   r   r   writeseekset)rT   rn   ro   )r   
raw_kwargsr   r   response_startedr   r   r   r(   8  s*   
z1_TestClientTransport.handle_request.<locals>.sendz(TestClient did not receive any response.i  )rq   r@   r   r   r   r   r   )$urlr   netlocr   r   r   querysplitr   r@   r   multi_itemsrM   r   r   r   r   copyr7   r   r:   r5   r   ioBytesIOrJ   r]   EventBaseExceptionr   httpx
ByteStreamr   Responser   r   )r#   r   r   r   r   r   r   default_portr   port_stringportr@   r?   r   r&   r6   r'   r(   rE   excresponser   )r   r   r   r   r   r   r   r   handle_request   s   



z#_TestClientTransport.handle_requestN)Trl   )r   r9   r:   r;   r   r   r   r0   r   r   r   r2   r   r    )r   r   r   r   )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< 					
					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%d` fd;d<Z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=da fd@dAZddde
jje
jje
jjdd=da fdBdCZddddddde
jje
jje
jjdd%db fdDdEZddddddde
jje
jje
jjdd%db fdFdGZddddddde
jje
jje
jjdd%db fdHdIZddde
jje
jje
jjdd=da fdJdKZ	dcdd fdPdQZdedRdSZdfdUdVZdgdWdXZdgdYdZZdgd[d\Z  ZS )h
TestClientFzFuture[None]taskNzanyio.abc.BlockingPortal | NonerE   http://testserverTrl   asyncio
testclientiP  r   r	   base_urlr0   r   r   r   r1   !typing.Literal['asyncio', 'trio']r3   dict[str, typing.Any] | Nonecookieshttpx._types.CookieTypes | Noner@   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 r3i }|dd t j||||	|d d S )N)r1   r3   )r:   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   r1   r3   r   r@   r   r   asgi_appr   	__class__r   r   r$   m  s2   
zTestClient.__init__6typing.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   )rE   r]   from_threadstart_blocking_portalr   )r#   rE   r   r   r   r     s   
"zTestClient._portal_factoryrr   rw   filesr   paramsr@   r   authr   timeoutr   r   r   httpx._types.URLTypesrr   "httpx._types.RequestContent | Nonerw   _RequestData | Noner   httpx._types.RequestFiles | Noner   rW   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/encode/starlette/issues/1108 for more information.r  )r   USE_CLIENT_DEFAULTwarningswarnDeprecationWarning
_merge_urlr   r   )r#   r   r   rr   rw   r  r   r  r@   r   r  r   r  r   r   r   r   r     s*   

zTestClient.requestr  r@   r   r  r   r  r   c          	   
        t  j||||||||dS Nr  )r   rM   	r#   r   r  r@   r   r  r   r  r   r   r   r   rM        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r#   r   rr   rw   r  r   r  r@   r   r  r   r  r   r   r   r   r  
     zTestClient.postc                  r  r  )r   putr  r   r   r   r!  )  r   zTestClient.putc                  r  r  )r   patchr  r   r   r   r"  H  r   zTestClient.patchc          	   
     r  r  )r   deleter  r   r   r   r#  g  r  zTestClient.deleter   typing.Sequence[str] | Nonekwargsr7   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   rM   r   rt   r   r   r5   r6   RuntimeError)r#   r   r   r%  r@   r   r6   r   r   r   websocket_connect~  s    
zTestClient.websocket_connectc                   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 r"   )rE   r   r   r   r   reset_portal  s   
z*TestClient.__enter__.<locals>.reset_portalc                     s     j d S r"   )rJ   wait_shutdownr   rE   r#   r   r   r-    s   z+TestClient.__enter__.<locals>.wait_shutdownr   r   r    )rB   rC   rD   r]   r   r  r   rE   rH   r^   r_   r`   rN   r   stream_sendstream_receivestart_task_soonlifespanr   rJ   wait_startuprO   rP   )r#   rQ   r,  r(   r'   channelr-  r   r.  r   rU     s*   
 




zTestClient.__enter__rV   c                 G  s   | j   d S r"   )rP   rN   rZ   r   r   r   rY     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 )Nr3  )r>   r   )r   r   r1  r'   r0  r(   )r#   r&   r   r   r   r3    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 )
Nr>   zlifespan.startupr   rW   c                    (    j  I d H } | d u r j  | S r"   r0  r'   r   rI   rT   r   r   r   r'     
   
z(TestClient.wait_startup.<locals>.receive)zlifespan.startup.completelifespan.startup.failedr:  r   rW   r1  r(   r#   r'   rT   r   r   r   r4    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   rW   c                    r6  r"   r7  r8  r   r   r   r'     r9  z)TestClient.wait_shutdown.<locals>.receiver>   zlifespan.shutdown)zlifespan.shutdown.completelifespan.shutdown.failedr>  r;  r<  r=  r   r   r   r-    s   zTestClient.wait_shutdown)	r   Trl   r   NNNTr   )r   r	   r   r0   r   r   r   r0   r1   r   r3   r   r   r   r@   r   r   r   r   r   r   r    )r   r   )r   r0   r   r  rr   r  rw   r	  r  r
  r   rW   r  r  r@   r  r   r   r  r  r   r  r  r  r   r   r   r   )r   r  r  r  r@   r  r   r   r  r  r   r  r  r  r   r   r   r   )r   r  rr   r  rw   r	  r  r
  r   rW   r  r  r@   r  r   r   r  r  r   r  r  r  r   r   r   r   r"   )r   r0   r   r$  r%  rW   r   r7   )r   r   )rV   rW   r   r    r/  )r+   r,   r-   __test__r4   rE   r$   rB   contextmanagerr   r   _clientr  r   rM   r  r  r  r!  r"  r#  r+  rU   rY   r3  r4  r-  __classcell__r   r   r   r   r   h  s   
 (,###



r   )r   r   r   r   )B
__future__r   rB   r   r   r   r_   sysr   r  concurrent.futuresr   typesr   urllib.parser   r   r]   	anyio.abcanyio.from_threadanyio.streams.stapledr   starlette._utilsr   starlette.typesr	   r
   r   r   r   starlette.websocketsr   version_infor   typing_extensionsr   ModuleNotFoundErrorr*  CallableContextManagerabcBlockingPortalr;   	AwaitableASGIInstancer   r9   Mappingr0   UnionIterabler   _RequestDatar   r   	TypedDictr/   	Exceptionr5   r   r8   r7   BaseTransportr   Clientr   r   r   r   r   <module>   s\    
 


i *