
    6hF                    v   S SK Jr  S SKrS SKrS SKrSSKJr  SSKJrJ	r	J
r
JrJrJr  SSKJrJr  \R"                  r\R$                  r\R&                  rSrSrS	rS
r\R0                  rS r " S S\R4                  5      rS rS rS rS rS r S r!S r" " S S\R4                  5      r#SS jr$ " S S5      r%g)    )annotationsN   )_)encodingerrorpycompatutilwireprototypeswireprotov1server)compression
stringutil   s   application/mercurial-0.1s   application/mercurial-0.2s   application/hg-errorc                    / nSn U R                   R                  SX4-  5      nUc  O,UR                  [        R                  " U5      5        US-  nMO  SR                  U5      $ )zbDecode a long value from multiple HTTP request headers.

Returns the value as a bytes, not a str.
r   s   %s-%d    )headersgetappendr   bytesurljoin)reqheaderprefixchunksivs        ;/usr/lib/python3/dist-packages/mercurial/wireprotoserver.pydecodevaluefromheadersr   )   si    
 F	A
KKOOH'8899h''*+	Q  88Fr   c                  |    \ rS rSrS r\SS j5       rS rS rS r	S r
\R                  S 5       rS	 rS
 rS rSrg)httpv1protocolhandler:   c                6    Xl         X l        X0l        S U l        g N)_req_ui
_checkperm
_protocaps)selfr   ui	checkperms       r   __init__httpv1protocolhandler.__init__;   s    	#r   c                    g)Ns   http-v1 r&   s    r   namehttpv1protocolhandler.nameA   s    r   c                   U R                  5       n0 nUR                  5       nU HI  nUS:X  a7  0 nUR                  5        H  nUS:w  d  M  Xt;  d  M  X'   S   Xg'   M     XcS'   M@  X%   S   X5'   MK     U Vs/ s H  oSU   PM	     sn$ s  snf )N   *   cmdr   )_argssplitkeys)r&   args	knownargsdatar5   kstarkeys           r   getargshttpv1protocolhandler.getargsE   s    JJL	zz|ADy$>>+Cf}$-N1$5	 , "T
#,q/  "&&AQ&&&s   6Bc                   U R                   R                  R                  5       n[        U R                   R                  R                  SS5      5      nU(       aH  UR                  [        R                  U R                   R                  R                  U5      SS95        U$ [        U R                   S5      nUR                  [        R                  USS95        U$ )N   X-HgArgs-Postr   T)keep_blank_valuess   X-HgArg)r"   qsparamsasdictoflistsintr   r   updateurlreqparseqsbodyfhreadr   )r&   r6   postlenargvalues       r   r3   httpv1protocolhandler._argsT   s    yy!!//1dii''++,<a@AKKII$$))'2d  
 K)$))Z@FNN8tNDEr   c                    U R                   c5  [        U R                  S5      n[        UR	                  S5      5      U l         U R                   $ )Ns	   X-HgProto    )r%   r   r"   setr4   )r&   values     r   getprotocaps"httpv1protocolhandler.getprotocapsc   s;    ??"*499lCE!%++d"34DOr   c                    [        U R                  R                  S   5      nU[        U R                  R                  R                  SS5      5      -  n[        R
                  " U R                  R                  US9$ )Ns   Content-Lengthr?   r   )limit)rC   r"   r   r   r	   filechunkiterrG   )r&   lengths     r   
getpayload httpv1protocolhandler.getpayloadi   sb    TYY&&'89: 	#dii''++,<a@AA!!$))"2"2&AAr   c              #  b  #    U R                   R                  nU R                   R                  n[        R                  " 5       n X0R                   l        X0R                   l        Uv   XR                   l        X R                   l        g ! XR                   l        X R                   l        f = f7fr!   )r#   foutferrr	   stringio)r&   oldoutolderrouts       r   mayberedirectstdio(httpv1protocolhandler.mayberedirectstdior   sm     mmo	#HHMHHMI"HHM"HHM #HHM"HHMs   AB/$B
 )!B/
"B,,B/c                    SU R                   R                  [        R                  U R                   R                  =(       d    S5      [        R                  U R                   R
                  =(       d    S5      4-  $ )Ns   remote:%s:%s:%sr   )r"   	urlschemerE   quote
remotehost
remoteuserr-   s    r   clienthttpv1protocolhandler.client   sW    !IILL--45LL--45%
 
 	
r   c                   UR                  S5        UR                  SUR                  R                  SS5      -  5        UR                  R                  SS5      (       a  UR                  S5        UR                  S5        [        R
                  " UR                  [        R                  5      nU(       a,  SR                  S	 U 5       5      nUR                  S
U-  5        U$ )N   batchs   httpheader=%d   servers   maxhttpheaderlens   experimentals   httppostargss   httpmediatype=0.1rx,0.1tx,0.2tx   ,c              3  |   #    U  H2  n[         R                  UR                  5       R                  5      v   M4     g 7fr!   )rE   rc   wireprotosupportr.   ).0es     r   	<genexpr>8httpv1protocolhandler.addcapabilities.<locals>.<genexpr>   s.      "ALAQ//16677s   :<s   compression=%s)	r   r'   	configint
configboolr
   supportedcompenginesr   
SERVERROLEr   )r&   repocapscompengines	comptypess        r   addcapabilities%httpv1protocolhandler.addcapabilities   s    Htww00<OPP	
 77o??KK( 	67$99GG[++
 		 "AL" I KK)I56r   c                $    U R                  U5      $ r!   )r$   r&   perms     r   r(   httpv1protocolhandler.checkperm   s    t$$r   )r$   r%   r"   r#   Nreturnbytes)__name__
__module____qualname____firstlineno__r)   propertyr.   r<   r3   rP   rV   
contextlibcontextmanagerr_   rf   rz   r(   __static_attributes__r,   r   r   r   r   :   sY      'B # #
0%r   r   c                (    U [         R                  ;   $ r!   )r   commands)cmds    r   iscmdr      s    #,,,,r   c                  ^ ^^ SSK Jn  T R                  nSTR                  ;  a  gTR                  S   n[	        U5      (       d  gTR
                  (       a>  UR                  S5      Ul        [        UR                  S'   UR                  SS-  5        g	[        TUR                  UU U4S
 j5      n [        UTX'U5        g	! UR                   a  nUR                   H  u  pXR                  U	'   M     UR                  UR                  [         R"                  " U5      5      Ul        UR                  S[         R"                  " U5      -  5         SnAg	SnAff = f)aq  Possibly process a wire protocol request.

If the current request is a wire protocol request, the request is
processed by this function.

``req`` is a ``parsedrequest`` instance.
``res`` is a ``wsgiresponse`` instance.

Returns a bool indicating if the request was serviced. If set, the caller
should stop processing the request, as a response has already been issued.
r   commonr2   Fi     Content-Type   0
%s
s	   Not FoundTc                   > T" TTU 5      $ r!   r,   )r~   r(   rctxr   s    r   <lambda>#handlewsgirequest.<locals>.<lambda>   s    9T3#=r   N)hgwebr   rv   rA   r   dispatchpathstatusmessagestatusHGTYPEr   setbodybytesr   r'   	_callhttpErrorResponsecoder   forcebytestr)r   r   resr(   hgwebcommonrv   r   protoro   r9   r   s   `` `       r   handlewsgirequestr      s1    -99D
 S\\!
,,v
C ::  ..s3
'-O$ 	l23!TWW=E
B$S-  $$ BIIDAKKN  ..FFJ++A.


 	j&=&=a&@@AABs   4C EB EEc                   SUR                  5       ;   a  U(       a  [        [        R                  " 5       0 4$ [        R
                  " U5      n[        R                  " U [        R                  5       HW  nUR                  5       R                  U;   d  M#  0 nU R                  SSUR                  5       -  5      nUb  XeS'   [        XE4s  $    SU R                  SS5      0n[        [        R                  S   U4$ )z{Determine the appropriate response type and compression settings.

Returns a tuple of (mediatype, compengine, engineopts).
s   0.2rj   s   %slevels   levels	   zliblevels   zlib)rP   HGTYPE2r   _noopenginer   clientcompressionsupportr
   rt   ru   rm   r.   rr   r   r	   rx   )r'   r   prefer_uncompressedcompformatsengineoptslevels          r   _httpresponsetyper      s     ##%%K335r99 (@@G$99&&
F &&(--<Y
V[[]0JK$%*N,,
" bll9l;<D4##G,d22r   c                F  ^^ SSK Jm  S nSUU4S jjn[        R                  R	                  XC5      (       d  U" [
        [        [        S5      5        g UR                  [        R                  U   R                  5        TR                  X5      n[        R                  " XXG5      n[        U[        5      (       a  U" [
        [        US9  g [        U[        R                   5      (       a  U" [
        [        UR"                  S9  g [        U[        R$                  5      (       a  U" [
        [        UR&                  S9  g [        U[        R(                  5      (       a_  UR&                  n	[+        U R,                  X8R.                  5      u  pnUR1                  X5      n	U
[2        :X  a	  U" XU5      n	U" [
        XS9  g [        U[        R4                  5      (       a,  SUR6                  UR8                  4-  nU" [
        [        US9  g [        U[        R:                  5      (       a'  S	UR6                  -  nS
Tl        U" [
        [        US9  g [        U[        R>                  5      (       a  U" [
        [        UR@                  S9  g [B        RD                  " SU5      e)Nr   r   c              3     #    UR                  5       R                  nS[        U5      s=:  a  S:  d   e   e[        R                  " S[        U5      5      v   Uv   U  S h  vN   g  N7f)Nr         B)rm   r.   lenstructpack)genr   
engineoptsr.   s       r   genversion2_callhttp.<locals>.genversion2  sY      &&(--3t9"s"""""kk$D	**
s   A!A+#A)$A+c                   > U [         :X  a  STl        OTR                  U 5      Tl        UTR                  S'   Ub  TR	                  U5        Ub  TR                  U5        g g )Ns   200 Script output followsr   )HTTP_OKr   r   r   r   
setbodygen)r   contenttype	bodybytesbodygenr   r   s       r   setresponse_callhttp.<locals>.setresponse$  s\    7?5CJ$2248CJ'2O$ Y'NN7# r   s:   requested wire protocol command is not available over HTTP)r   )r   s   %d
%sr   Ts   hgweb.protocol internal failure)NN)#r   r   r   r   commandavailabler   	HGERRTYPEr   r(   
permissionhashiddenaccessdispatch
isinstancer   r   r
   bytesresponser8   streamreslegacyr   	streamresr   r'   r   compressstreamr   pushresr   outputpusherrdrainooberrormessager   ProgrammingError)rv   r   r   r   r   r   r   accesshiddenrspr   	mediatyper   r   r   s     `          @r   r   r     s   ,$ $ %%66sBB	
 		OO%..s3>>?..t9L

$
$T#
DC#uGVs3	C55	6	6GVsxx8	C77	8	8GVSWW5	C11	2	2gg ):GGU33)
%	: ##C4c:6CGY4	C//	0	0377CJJ//GVs3	C//	0	0377"	GVs3	C00	1	1GY#++>$$%GMMr   c                    U R                  S[        U5      -  5        U R                  U5        U R                  5         g)z-Send a bytes response for protocol version 1.s   %d
N)writer   flush)rY   rO   s     r   _sshv1respondbytesr   b  s,    JJwU#$JJuJJLr   c                r    U R                   nUR                   H  nU" U5        M     U R                  5         g r!   )r   r   r   )rY   sourcer   chunks       r   _sshv1respondstreamr   i  s)    JJEe JJLr   c                    UR                  SU-  5        UR                  5         U R                  S5        U R                  5         g )Ns   %s
-
   
)r   r   )rY   rZ   r   s      r   _sshv1respondooberrorr   p  s1    JJzC JJLJJuJJLr   c                  z    \ rS rSrSrS r\SS j5       rS rS r	S r
\R                  S 5       rS	 rS
 rS rSrg)sshv1protocolhandleriw  z<Handler for requests services via version 1 of SSH protocol.c                F    Xl         X l        X0l        [        5       U l        g r!   )r#   _fin_foutrN   r%   )r&   r'   finrY   s       r   r)   sshv1protocolhandler.__init__z  s    	
%r   c                "    [         R                  $ r!   )r
   SSHV1r-   s    r   r.   sshv1protocolhandler.name  s    ###r   c                   0 nUR                  5       n[        [        U5      5       GH  nU R                  R	                  5       S S nUR                  5       u  pgXc;  a"  [
        R                  " [        S5      U-  5      eUS:X  az  0 n[        [        U5      5       HZ  n	U R                  R	                  5       S S nUR                  5       u  pgU R                  R                  [        U5      5      n
XU'   M\     XS'   M  U R                  R                  [        U5      5      n
XU'   GM     U V	s/ s H  oU	   PM	     sn	$ s  sn	f )Ns   unexpected parameter %rr1   )
r4   ranger   r   readliner   Abortr   rC   rH   )r&   r6   r8   r5   narglinearglr:   r9   vals              r   r<   sshv1protocolhandler.getargs  s   zz|s4y!Aii((*3B/G]]_FCkk!$>"?#"EFFd{s1vA"ii0023B7G$]]_FC))..Q0C #I	 '
 "T
iinnSV,S	 "  "&&AQ&&&s   2Ec                    U R                   $ r!   )r%   r-   s    r   rP   !sshv1protocolhandler.getprotocaps  s    r   c              #     #    [        U R                  S5        [        U R                  R	                  5       5      nU(       aJ  U R                  R                  U5      v   [        U R                  R	                  5       5      nU(       a  MI  g g 7f)Nr   )r   r   rC   r   r   rH   )r&   counts     r   rV   sshv1protocolhandler.getpayload  sb      	4::s+ DII&&()))..''		**,-E es   BBBc              #     #    S v   g 7fr!   r,   r-   s    r   r_   'sshv1protocolhandler.mayberedirectstdio  s
     
s   c                r    [         R                  R                  SS5      R                  SS5      S   nSU-   $ )Ns
   SSH_CLIENTr   rM   r   r   s   remote:ssh:)r   environr   r4   )r&   rf   s     r   rf   sshv1protocolhandler.client  s7    !!%%mS9??aHK&&r   c                    U R                   [        R                  :X  a  UR                  S5        UR                  S5        U$ )Ns	   protocapsri   )r.   r
   r   r   )r&   rv   rw   s      r   rz   $sshv1protocolhandler.addcapabilities  s1    99,,,KK%Hr   c                    g r!   r,   r}   s     r   r(   sshv1protocolhandler.checkperm  s    r   )r   r   r%   r#   Nr   )r   r   r   r   __doc__r)   r   r.   r<   rP   rV   r   r   r_   rf   rz   r(   r   r,   r   r   r   r   w  sV    F  $ $'*.   'r   r   c                .   Sn[        XU5      nUR                  5       (       Gdq  US:X  Ga1  UR                  5       S S nU(       d  SnM;  [        R                  R                  X5      n	U	(       d  [        US5        Mo  [        R                  " XXS9n
UR                  R                  R                  5         UR                  R                  R                  5         [        U
[        5      (       a  [        X:5        GO[        U
[        R                  5      (       a  [        X:R                   5        GOJ[        U
[        R"                  5      (       a  [%        X:5        GO[        U
[        R&                  5      (       a  [%        X:5        O[        U
[        R(                  5      (       a&  [        US5        [        USU
R*                  -  5        O[        U
[        R,                  5      (       a  [        X:R*                  5        Oy[        U
[        R.                  5      (       a!  [1        X0R                  U
R2                  5        O9[4        R6                  " SU
-  5      eUS:X  a  g [4        R6                  " SU-  5      eUR                  5       (       d  GMp  g g )	Ns   protov1-servingr   s   shutdownr   )r   s   %ds6   unhandled response type from wire protocol command: %ss   unhandled ssh server state: %s)r   is_setr   r   r   r   r   r   r'   rY   r   rZ   r   r   r
   r   r8   r   r   r   r   r   r   r   r   r   r   r   )r'   rv   r   rY   evr   stater   request	availabler   s              r   _runsshserverr    s   $ E $/Eiikk&&llnSb)G #)22CCI "4-#,,WC GGLL GGLL #u%%"4-C!=!=>>"42C!9!9::#D.C!?!?@@#D.C!7!788"4-"49C!7!788"41C!8!899%dGGS[[A,,1367 
 k! ((1E9 g iikkr   c                  *    \ rS rSrSS jrS rS rSrg)	sshserveri  Nc                4    Xl         X l        X@l        X0l        g r!   )r#   _repo_accesshidden_logfh)r&   r'   rv   logfhr   s        r   r)   sshserver.__init__  s    
)r   c                L    U R                  [        R                  " 5       5        g r!   )
serveuntil	threadingEventr-   s    r   serve_foreversshserver.serve_forever  s    	)*r   c           	        U R                   R                  5        u  p#U R                  (       ae  [        R                  " U R                  USSS9n[        R                  " U R                  U R                   R
                  SSS9U R                   l        [        U R                   U R                  UUUU R                  5        SSS5        g! , (       d  f       g= f)z%Serve until a threading.Event is set.   oT)logdata   eN)	r#   protectedfinoutr  r	   makeloggingfileobjectrZ   r  r  r  )r&   r  r   rY   s       r   r  sshserver.serveuntil  s    XX%%';C{{11KK 	 !% : :KKHHMM 	! 

"" (''s   B'C
C)r  r  r  r#   )NF)r   r   r   r   r)   r  r  r   r,   r   r   r  r    s    +r   r  )F)&
__future__r   r   r   r  i18nr    r   r   r   r	   r
   r   utilsr   r   r[   urlerrrE   r   r   r   r   r   r   baseprotocolhandlerr   r   r   r   r   r   r   r   r   r  r  r,   r   r   <module>r(     s    #     
 ==		
	%
&#	"g%N>> g%\-CL!3HINXD>== DNJZ" "r   