
    Oj]T                    Z   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' 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m1Z1 nd dl2m1Z1 erd dl3Z4n	 d dl3Z4eg eejp                  jr                     f   Z:ee+e-ge
d   f   Z;ee,ge;f   Z<ee,e+e-ge
d   f   Z=ee>e>ee>   z  e?z  f   Z@d#dZA G d d      ZB G d de      ZC G d deD      ZE G d de4j                  e/      ZG G d d      ZH G d d e4j                        ZJ G d! d"e4j                        ZLy# e5$ r0 	 d dl4Z4 ejl                  de'd       n# e5$ r
  e7d      dw xY wY w xY w)$    )annotationsN)	AwaitableCallable	GeneratorIterableMappingSequence)Future)AbstractContextManager)GeneratorType)TYPE_CHECKINGAnyLiteral	TypedDict	TypeGuardcast)unquoteurljoin)StapledObjectStream)is_async_callable)StarletteDeprecationWarning)ASGIAppMessageReceiveScopeSend)WebSocketDisconnect)      )SelfzRUsing `httpx` with `starlette.testclient` is deprecated; install `httpx2` instead.   
stacklevelzThe starlette.testclient module requires the httpx2 package to be installed.
You can install this with:
    $ pip install httpx2
c                Z    t        j                  |       rt        | d      S t        |       S )N	__await__)inspectisclasshasattrr   apps    k/var/www/origus_pro_usr/data/www/origus.pro/core/.venv/lib/python3.12/site-packages/starlette/testclient.py	_is_asgi3r,   ?   s&    ssK((S!!    c                       e Zd ZdZddZddZy)
_WrapASGI2z7
    Provide an ASGI3 interface onto an ASGI2 app.
    c                    || _         y Nr)   )selfr*   s     r+   __init__z_WrapASGI2.__init__J   s	    r-   c                T   K   | j                  |      } |||       d {    y 7 wr1   r)   )r2   scopereceivesendinstances        r+   __call__z_WrapASGI2.__call__M   s#     88E?w%%%s   (&(N)r*   ASGI2AppreturnNone)r5   r   r6   r   r7   r   r;   r<   )__name__
__module____qualname____doc__r3   r9    r-   r+   r/   r/   E   s    &r-   r/   c                  "    e Zd ZU ded<   ded<   y)_AsyncBackendstrbackenddict[str, Any]backend_optionsN)r=   r>   r?   __annotations__rA   r-   r+   rC   rC   R   s    L##r-   rC   c                      e Zd ZddZy)_Upgradec                    || _         y r1   )session)r2   rL   s     r+   r3   z_Upgrade.__init__X   s	    r-   N)rL   WebSocketTestSessionr;   r<   )r=   r>   r?   r3   rA   r-   r+   rJ   rJ   W   s    r-   rJ   c                      e Zd ZdZy)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@   rA   r-   r+   rO   rO   \   s    r-   rO   c                      e Zd Z	 	 	 	 	 	 	 	 ddZddZddZddZddZddZddZ	ddZ
ddd	ZdddZddZddZddZdddZy
)rM   c                J    || _         || _        d | _        || _        d | _        y r1   )r*   r5   accepted_subprotocolportal_factoryextra_headers)r2   r*   r5   rS   s       r+   r3   zWebSocketTestSession.__init__g   s*     
$(!,!r-   c                   t        j                         5 }|j                  | j                               x| _        }|j                  | j                        \  }}|j                  |j                         |j                  |j                  |j                         | j                  ddi       | j                         }| j                  |       |j                  dd       | _        |j                  dd       | _        |j                  | j"                  d       |j%                         | _        | cd d d        S # 1 sw Y   y xY w)Ntypezwebsocket.connectsubprotocolheaders  )
contextlib	ExitStackenter_contextrS   portal
start_task_runcallbackresultcallcancelr7   r6   _raise_on_closegetrR   rT   closepop_all
exit_stack)r2   stackr]   futcsmessages         r+   	__enter__zWebSocketTestSession.__enter__s   s    !!# 	u#(#6#6t7J7J7L#MMDK&''		2GCNN3::&NN6;;		2IIv234llnG  )(/M4(HD%!(Y!=DNN4::t,#mmoDO	 	 	s   DD99Ec                4     | j                   j                  | S r1   )rh   __exit__r2   argss     r+   ro   zWebSocketTestSession.__exit__   s    't''..r-   c          
       K   t        j                  t           t        j                        \  }}t        j                  t           t        j                        \  }}|5  |5  |5  |5  t        j
                         5 }|| _        || _        |j                  |       | j                  | j                  |j                  |j                         d{    t        j                          d{    ddd       ddd       ddd       ddd       ddd       y7 I7 /# 1 sw Y   .xY w# 1 sw Y   2xY w# 1 sw Y   6xY w# 1 sw Y   :xY w# 1 sw Y   yxY ww)zE
        The sub-thread in which the websocket session runs.
        N)anyiocreate_memory_object_streamr   mathinfCancelScope_receive_tx_send_rxstartedr*   r5   r6   r7   sleep_forever)r2   task_statussend_txsend_rx
receive_tx
receive_rxrk   s          r+   r_   zWebSocketTestSession._run   s)     !<<WEdhhO!&!B!B7!KDHH!U
J 	(g 	(z 	(: 	(u7H7H7J 	(b)D#DM#((4::z'9'97<<HHH %%'''	( 	( 	( 	( 	( 	( I (	( 	( 	( 	( 	( 	( 	( 	( 	( 	(s   AEE"E%D7(D+	=ADDD-D.D2D+	:D7E
E	EDDD($D+	+D40D77E <EE	EEEc                V   |d   dk(  r-t        |j                  dd      |j                  dd            |d   dk(  rl|d	   }|d
   }g }	 | j                         }|d   dk(  sJ |j                  |d          |j                  dd      snBt	        ||dj                  |            y )NrV   zwebsocket.closecoderY   reason )r   r   zwebsocket.http.response.startstatusrX   zwebsocket.http.response.bodybody	more_bodyFr-   )status_coderX   content)r   re   r6   appendrO   join)r2   rl   r   rX   r   s        r+   rd   z$WebSocketTestSession._raise_on_close   s    6?//%7;;vt+DW[[YaceMfggV_ ??&x0K181CG "D,,.v*HHHHGFO,{{;6  *k7\_\d\dei\jkk @r-   c                d    | j                   j                  | j                  j                  |       y r1   )r]   rb   rx   r7   r2   rl   s     r+   r7   zWebSocketTestSession.send   s"    ))..8r-   c                ,    | j                  d|d       y )Nwebsocket.receiverV   textr7   r2   datas     r+   	send_textzWebSocketTestSession.send_text   s    		.=>r-   c                ,    | j                  d|d       y )Nr   rV   bytesr   r   s     r+   
send_byteszWebSocketTestSession.send_bytes   s    		.>?r-   c                    t        j                  |dd      }|dk(  r| j                  d|d       y | j                  d|j                  d      d       y )	N),:F)
separatorsensure_asciir   r   r   utf-8r   )jsondumpsr7   encode)r2   r   moder   s       r+   	send_jsonzWebSocketTestSession.send_json   sH    zz$:EJ6>II2DABII2T[[=QRSr-   Nc                .    | j                  d||d       y )Nzwebsocket.disconnect)rV   r   r   r   )r2   r   r   s      r+   rf   zWebSocketTestSession.close   s    		146RSr-   c                `    | j                   j                  | j                  j                        S r1   )r]   rb   ry   r6   r2   s    r+   r6   zWebSocketTestSession.receive   s!    {{ 5 566r-   c                j    | j                         }| j                  |       t        t        |d         S )Nr   )r6   rd   r   rD   r   s     r+   receive_textz!WebSocketTestSession.receive_text   s,    ,,.W%C))r-   c                j    | j                         }| j                  |       t        t        |d         S )Nr   )r6   rd   r   r   r   s     r+   receive_bytesz"WebSocketTestSession.receive_bytes   s-    ,,.W%E77+,,r-   c                    | j                         }| j                  |       |dk(  r|d   }n|d   j                  d      }t        j                  |      S )Nr   r   r   )r6   rd   decoder   loads)r2   r   rl   r   s       r+   receive_jsonz!WebSocketTestSession.receive_json   sO    ,,.W%6>6?D7#**73Dzz$r-   )r*   ASGI3Appr5   r   rS   _PortalFactoryTyper;   r<   r;   r    )rq   r   r;   zbool | None)r|   z'anyio.abc.TaskStatus[anyio.CancelScope]r;   r<   rl   r   r;   r<   )r   rD   r;   r<   )r   r   r;   r<   )r   )r   r   r   Literal['text', 'binary']r;   r<   )rY   N)r   intr   z
str | Noner;   r<   r;   r   )r;   rD   )r;   r   )r   r   r;   r   )r=   r>   r?   r3   rm   ro   r_   rd   r7   r   r   r   rf   r6   r   r   r   rA   r-   r+   rM   rM   f   sr    
"
" 
" +	
"
 

"/(l9?@TT7*
-
 r-   rM   c                  <    e Zd Z	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 ddZddZy)_TestClientTransportc               X    || _         || _        || _        || _        || _        || _        y r1   )r*   raise_server_exceptions	root_pathrS   	app_stateclient)r2   r*   rS   r   r   r   r   s          r+   r3   z_TestClientTransport.__init__   s0     '>$","r-   c                .   j                   j                  }j                   j                  j                  d      }j                   j                  }j                   j
                  }j                   j                  j                  d      }ddddd|   }j                   j                  }||}dj                  v rg }	ndj                   j                  fg}	|	j                  j                         D 
cg c]3  \  }
}|
j                         j                         |j                         f5 c}}
z  }	|dv rj                  j                  d	d       }|g }n,|j                  d
      D cg c]  }|j                          }}dt!        |      |j                  dd      d   | j"                  ||j                         |	| j$                  ||g|| j&                  j)                         di id}t+        | j,                  || j.                        }t1        |      ddj2                  t!        |      |j                  dd      d   | j"                  ||j                         |	| j$                  ||gi i d| j&                  j)                         d}ddddg dt5        j6                         id d!fd}d"fd}	 | j/                         5 }|j9                  t:        j<                        |j9                  | j,                  |||       d d d        | j@                  r	s!J d       sdg t5        j6                         dtC        jD                  d   jG                               d<   tC        jH                  d#i di}r|jJ                  d<   +|jJ                  d<   dv r
d   |_&        d v r
d    |_'        |S c c}}
w c c}w # 1 sw Y   xY w# t>        $ r}| j@                  r|Y d }~d }~ww xY w)$Nascii)encodingP   i  )httpwshttpswsshosts   host>   r   r   sec-websocket-protocolr   	websocket   ?   r   zwebsocket.http.response)rV   pathraw_pathr   schemequery_stringrX   r   serversubprotocolsstate
extensionsr   z1.1)http.response.debughttp.response.trailers)rV   http_versionmethodr   r   r   r   r   rX   r   r   r   r   Fstreamc                   K   r,j                         sj                          d {    ddiS j                         } t        | t              r| j                  d      }nP| d}nKt        | t              r9	 | j                  d       }t        |t              r|j                  d      }d|ddS | }dd|dS 7 # t        $ r
 ddddcY S w xY ww)	NrV   zhttp.disconnectr   r-   zhttp.requestT)rV   r   r   )rV   r   )	is_setwaitread
isinstancerD   r   r   r7   StopIteration)r   
body_byteschunkrequestrequest_completeresponse_completes      r+   r6   z4_TestClientTransport.handle_request.<locals>.receive&  s       (//1+00222 122<<>D$$$(KK$8
 
D-0A IIdOE!%- %W 5$2EPTUU
 "
#*J??+ 3 % A'+$$2C@@As4   &CB;AC:7B= 1C=CCCCc                T  K   | d   dk(  rl
rJ d       | d   d<   | j                  dg       D cg c]%  \  }}|j                         |j                         f' c}}d<   d
| j                  dd	      y | d   d
k(  r
sJ d       	j                         rJ d       rJ d       | j                  dd      }| j                  dd	      }j                  dk7  rd   j	                  |       |s*d   j                  d       ds	j                          y y y | d   dk(  rnsJ d       sJ d       	j                         rJ d       j                  | j                  dg              | j                  dd	      s	j                          y y | d   dk(  r| d   y y c c}}w w)NrV   zhttp.response.startz1Received multiple "http.response.start" messages.r   r   rX   TtrailersFzhttp.response.bodyz<Received "http.response.body" without "http.response.start".z7Received "http.response.body" after response completed.z3Received "http.response.body" after body completed.r   r-   r   HEADr   r   r   z=Received "http.response.trailers" without declaring trailers.z8Received "http.response.trailers" before body completed.z;Received "http.response.trailers" after response completed.more_trailersr   info)re   r   r   r   writeseeksetextend)rl   keyvaluer   r   body_complete
debug_info
raw_kwargsr   r   response_startedr   trailers_expecteds        r+   r7   z1_TestClientTransport.handle_request.<locals>.sendB  s     v"77+`-``+,3H,=
=)ZaZeZefoqsZt(uJCQV#**,)G(u
9%#' $+KK
E$B!$88'g)gg',335p7pp5(_*__({{63/#KKU;	>>V+x(..t4 x(--a0$(M,)--/ - !
 $<<(i*ii($`&``},335t7tt5Ir :;{{?E:%))+ ;$99$V_
 :/ )vs   /F(*F"EF(z(TestClient did not receive any response.i  )r   rX   r   r   r   r   templatecontextr   r   rA   )(urlr   raw_hostr   r   r   queryportrX   netlocmulti_itemslowerr   re   splitstripr   r   r   r   copyrM   r*   rS   rJ   r   ioBytesIOrb   rs   EventBaseExceptionr   httpx
ByteStreamr   Responser   r   r   )r2   r   r   r   r   r   r   default_portr   rX   r   r   rW   r   r5   rL   r6   r7   r]   excresponser   r   r   r   r   r   r   r   s    `                   @@@@@@@@r+   handle_requestz#_TestClientTransport.handle_request   s   ##{{##**G*<{{;;''!!(('(: ""s3GO{{<D W__$13G!3!345G 	W__MhMhMjkzsESYY['')5<<>:kk ]"!//--.FMK".0;F;L;LS;QR%RR#$NN43A6!^^  %"++, ,,,.8"=E +488UD<O<OPG7## !nnDM tQ/2!LLNkkTl24PRS^^((*
  ! !.0&.

%=
,0
	@8	- 	-@	$$& <&$*KK$<!DHHeWd;< ''#O%OO#!"**,J  %//
80D0I0I0KL
8>>@J@@<DH 89!9CH 56Z'$.z$:!J&#-i#8 Y l  SP< <  	++	 ,	s<   8O:O"O3 %>O'#O3 'O0,O3 3	P<PPN)Tr   )r*   r   rS   r   r   boolr   rD   r   tuple[str, int]r   rF   r;   r<   )r   zhttpx.Requestr;   httpx.Response)r=   r>   r?   r3   r	  rA   r-   r+   r   r      sY    
 )- + "&	
    " 
"_r-   r   c                      e Zd ZU dZded<   dZded<   	 	 	 	 	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d fdZej                  dd       Z	ddddddde
j                  j                  e
j                  j                  e
j                  j                  dd		 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d fd
Z	 d	 	 	 	 	 	 	 d fdZddZddZddZddZddZ xZS )
TestClientFzFuture[None]taskNz'anyio.from_thread.BlockingPortal | Noner]   c                R   t        ||xs i       | _        t        |      r|}nt        t        |      }t        |      }|| _        i | _        t        | j                  | j                  ||| j                  |
      }|i }|j                  dd       t        | 1  ||||	|       y )N)rE   rG   )rS   r   r   r   r   z
user-agent
testclient)base_urlrX   	transportfollow_redirectscookies)rC   async_backendr,   r   r:   r/   r*   r   r   _portal_factory
setdefaultsuperr3   )r2   r*   r  r   r   rE   rG   r  rX   r  r   asgi_appr  	__class__s                r+   r3   zTestClient.__init__  s     +7OLa_abS>Hx%C!#H)+(HH//$;nn
	 ?G<6- 	 	
r-   c              #     K   | j                   | j                    y t        j                  j                  di | j                  5 }| d d d        y # 1 sw Y   y xY ww)NrA   )r]   rs   from_threadstart_blocking_portalr  )r2   r]   s     r+   r  zTestClient._portal_factory  sS     ;;"++""88N4;M;MN RX  s   AA!A	A!AA!r   r   filesr   paramsrX   r  authr  timeoutr   c                   |t         j                  urt        j                  dt        d       | j                  |      }t        |   |||||||||	|
|||      S )NzYou should not use the 'timeout' argument with the TestClient. See https://github.com/Kludex/starlette/issues/1108 for more information.r!   r"   r  )r  USE_CLIENT_DEFAULTwarningswarnr   
_merge_urlr  r   )r2   r   r   r   r   r   r   r!  rX   r  r"  r  r#  r   r  s                 r+   r   zTestClient.request  sx    " %222MM\+	 ooc"w-!  
 	
r-   c                |   t        d|      }|j                  di       }|j                  dd       |j                  dd       |j                  dd       |!|j                  d	d
j                  |             ||d<   	 t	        |   d|fi | t        d      # t        $ r}|j                  }Y d }~|S d }~ww xY w)Nzws://testserverrX   
connectionupgradezsec-websocket-keyztestserver==zsec-websocket-version13r   z, GETzExpected WebSocket upgrade)	r   re   r  r   r  r   RuntimeErrorrJ   rL   )r2   r   r   kwargsrX   r  rL   r  s          r+   websocket_connectzTestClient.websocket_connect  s     '-**Y+<3.?2D9#7<9PQ#y	=GOE31&1 ;<<  	"kkG 	"s   ?B 	B;$B66B;c                    t        j                         5 }|j                  t        j                  j
                  di  j                        x _        |j                  d fd       }t        j                  t        d z     t        j                        }t        j                  t           t        j                        }g ||D ]  }|j                  |j                          t        |  _        t        |  _        j#                   j$                         _        j)                   j*                         |j                  d fd       }|j-                          _        d d d         S # 1 sw Y    S xY w)Nc                     d  _         y r1   )r]   r   s   r+   reset_portalz*TestClient.__enter__.<locals>.reset_portal  s
    "r-   c                 <     j                  j                         y r1   )rb   wait_shutdown)r]   r2   s   r+   r5  z+TestClient.__enter__.<locals>.wait_shutdown  s    D../r-   rA   r;   r<   )rZ   r[   r\   rs   r  r  r  r]   r`   rt   r   ru   rv   rf   r   stream_sendstream_receivestart_task_soonlifespanr  rb   wait_startuprg   rh   )r2   ri   r3  r7   r6   channelr5  r]   s   `      @r+   rm   zTestClient.__enter__  s?   !!# 	.u#(#6#6u7H7H7^7^7taeasas7t#uuDK&^^# # 44Wt^DTXXND77@JG,T,G, .w}}-.2D9D"5w"?D..t}}=DIKK))*^^0 0 $mmoDO)	., -	., s   EE44E>c                8    | j                   j                          y r1   )rh   rf   rp   s     r+   ro   zTestClient.__exit__  s    r-   c                R  K   d| j                   d}	 | j                  || j                  j                  | j                  j
                         d {    | j                  j                  d        d {    y 7 (7 # | j                  j                  d        d {  7   w xY ww)Nr:  )rV   r   )r   r*   r8  r6   r7  r7   )r2   r5   s     r+   r:  zTestClient.lifespan  s     #dnn=	.((5$"5"5"="=t?O?O?T?TUUU""''--- V-$""''---sL   B'>A> A:A> B'4A<5B':A> <B'>B$B B$$B'c                    K    j                   j                  ddi       d {    d fd} |        d {   }|d   dv sJ |d   dk(  r |        d {    y y 7 ;7 (7 
w)NrV   zlifespan.startupc                    K   j                   j                          d {   } | j                  j                          | S 7 "wr1   r7  r6   r  ra   rl   r2   s    r+   r6   z(TestClient.wait_startup.<locals>.receive  =      ,,4466G		  "N 7   AA#A)zlifespan.startup.completelifespan.startup.failedrE  r;   r   r8  r7   r2   r6   rl   s   `  r+   r;  zTestClient.wait_startup  s     !!&&0B'CDDD	  	/v #
 
 	
 
 6?77)OO 8 	E " s1   !A&A A&A"A&A$A&"A&$A&c                    K   d fd} j                   j                  ddi       d {     |        d {   }|d   dv sJ |d   dk(  r |        d {    y y 7 57 (7 
w)Nc                    K   j                   j                          d {   } | j                  j                          | S 7 "wr1   rA  rB  s    r+   r6   z)TestClient.wait_shutdown.<locals>.receive+  rC  rD  rV   zlifespan.shutdown)zlifespan.shutdown.completelifespan.shutdown.failedrK  rF  rG  rH  s   `  r+   r5  zTestClient.wait_shutdown*  s     	 !!&&0C'DEEE	/v #
 
 	
 
 6?88)OO 9 	F! s1   'A&A A&A"A&A$A&"A&$A&)	zhttp://testserverTr   asyncioNNNT)r  iP  )r*   r   r  rD   r   r
  r   rD   rE   zLiteral['asyncio', 'trio']rG   dict[str, Any] | Noner  httpx._types.CookieTypes | NonerX   zdict[str, str] | Noner  r
  r   r  r;   r<   )r;   z7Generator[anyio.from_thread.BlockingPortal, None, None])r   rD   r   zhttpx._types.URLTypesr   z"httpx._types.RequestContent | Noner   z_RequestData | Noner   z httpx._types.RequestFiles | Noner   r   r!  z#httpx._types.QueryParamTypes | NonerX   zhttpx._types.HeaderTypes | Noner  rN  r"  z7httpx._types.AuthTypes | httpx._client.UseClientDefaultr  z%bool | httpx._client.UseClientDefaultr#  z:httpx._types.TimeoutTypes | httpx._client.UseClientDefaultr   rM  r;   r  r1   )r   rD   r   zSequence[str] | Noner/  r   r;   rM   r   )rq   r   r;   r<   r6  )r=   r>   r?   __test__rH   r]   r3   rZ   contextmanagerr  r  _clientr%  r   r0  rm   ro   r:  r;  r5  __classcell__)r  s   @r+   r  r    s   H
6:F3:
 ,(,.71537)-!%"7&
&
 &
 "&	&

 &
 ,&
 /&
 1&
 '&
 &
  &
 
&
P   7;$(266:3737HMHhHhBG--BbBbNSmmNnNn,0'
'
 #'

 4'
 "'
 0'
 '
 4'
 1'
 1'
 F'
 @'
 L'
 *'
  
!'
X .2 + 	
 
.2 ."r-   r  )r*   zASGI2App | ASGI3Appr;   zTypeGuard[ASGI3App])M
__future__r   rZ   r&   r   r   ru   sysr&  collections.abcr   r   r   r   r   r	   concurrent.futuresr
   r   typesr   typingr   r   r   r   r   r   urllib.parser   r   rs   	anyio.abcanyio.from_threadanyio.streams.stapledr   starlette._utilsr   starlette.exceptionsr   starlette.typesr   r   r   r   r   starlette.websocketsr   version_infor    typing_extensionshttpx2r  ModuleNotFoundErrorr'  r.  r  BlockingPortalr   ASGIInstancer:   r   rD   r   _RequestDatar,   r/   rC   	ExceptionrJ   r  rO   rM   BaseTransportr   Clientr  rA   r-   r+   <module>rk     s   "   	   
  W W % -  J J )    5 . < B B 4w&" b"89J9J9Y9Y"ZZ[ $489UG\)*UGT*IdO;< sC(3-/%778"
& 
&$I $
y 
	NNd  d Nq5.. qhw wy
  	 HMMd+ # 	- 		s*   3E5 5F*;F?F*F$$F*)F*