
    q&fT                        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mZmZmZmZmZmZ ddlmZ ej*                  Zej,                  Zej.                  Zd Z G d d	      Z	 ddZd Z G d dej8                        Zd Z G d dej>                        Z  G d dejB                        Z"d Z#dejH                  d
fdZ%	 ddZ&y)    N)futures   )_)bundle2errorhttpconnectionpycompatstatichttprepourlutilwireprotov1peer)urlutilc           
      (   t        j                  |      dz   }|t        |dz        z
  t        d      z
  }g }d}t        dt        |       |      D ]?  }|dz  }|j	                  |t        |      z  t        j                  | |||z          f       A |S )ac  Encode a string value into multiple HTTP headers.

    ``value`` will be encoded into 1 or more HTTP headers with the names
    ``header-<N>`` where ``<N>`` is an integer starting at 1. Each header
    name + value will be at most ``limit`` bytes long.

    Returns an iterable of 2-tuples consisting of header names and
    values as native strings.
    z-%s000s   : 
r   r   )r	   strurllenrangeappendstr)valueheaderlimitfmtvaluelenresultnis           4/usr/lib/python3/dist-packages/mercurial/httppeer.pyencodevalueinheadersr   #   s     //&
!F
*C s3;''#i.8HF	A1c%j(+ P	QsSV|X__U1q8|5L%MNOP M    c                   H    e Zd Zd Zed        ZddZej                  fdZ	y)
_multifilec                 r    |D ]$  }t        |d      rt        dt        |      |       || _        d| _        y )NlengthsO   _multifile only supports file objects that have a length but this one does not:r   )hasattr
ValueErrortype	_fileobjs_index)selffileobjsfs      r   __init__z_multifile.__init__A   sG     	A1h' <G	 	 "r    c                 :    t        d | j                  D              S )Nc              3   4   K   | ]  }|j                     y wN)r$   .0r,   s     r   	<genexpr>z$_multifile.length.<locals>.<genexpr>O   s     41884s   )sumr(   r*   s    r   r$   z_multifile.lengthM   s    4T^^444r    Nc                    |dk  r"dj                  d | j                  D              S g }|r| j                  t        | j                        k  r|j	                  | j                  | j                     j                  |             t        |d         }||k  r| xj                  dz  c_        ||z  }|r#| j                  t        | j                        k  rdj                  |      S )Nr   r    c              3   <   K   | ]  }|j                           y wr0   )readr1   s     r   r3   z"_multifile.read.<locals>.<genexpr>S   s     =AFFH=s   r   )joinr(   r)   r   r   r8   )r*   amtpartsgots       r   r8   z_multifile.readQ   s    !888=dnn===dkkC$77LL499#>?eBi.CSyq 3JC dkkC$77 xxr    c                     |t         j                  k7  rt        d      |dk7  rt        d      | j                  D ]  }|j	                  d        d| _        y )NsP   _multifile does not support anything other than os.SEEK_SET for whence on seek()r   sQ   _multifile only supports seeking to start, but that could be fixed if you need it)osSEEK_SETNotImplementedErrorr(   seekr)   )r*   offsetwhencer,   s       r   rB   z_multifile.seek]   sb    R[[ %:  Q;%1   	AFF1I	r    r0   )
__name__
__module____qualname__r-   propertyr$   r8   r?   r@   rB    r    r   r"   r"   @   s.    
 5 5
 #%++ r    r"   Fc                    |dk(  rd|d<   |j                  dd      }|j                  di       }	| j                  d|z         d|fg}
|r|
j                  d       d	}|duxr d
|v }|r|rt        j	                  t        |j                                     }|s|}nht        |t              r't        j                  |      }t        |      |_        |}t        j                  |      }t        |      |_        t        ||      }t        |      |	d<   n|r|dk7  sJ  |d      }|rt        |j                  dd      d	         }|d	kD  rGt        j	                  t        |j                                     }t!        |d|      D ]
  \  }}||	|<    n|
t        |j                               z  }
dt        j	                  |
      z  }d||fz  }d	}t#        |d      r|j                  }n|t        |      }|	d|	vrd|	d<   t%               }t%               }|F |d      }|r+|j'                  d       t%        |j                  d            }|j'                  d       d|v r|j'                  d       d|v r} |d      rut(        j*                  j-                  t(        j.                        D cg c]  }|j1                         j2                   }}|j'                  ddj5                  |      z         |r8t!        dj5                  t        |            d|xs d      }|D ]
  \  }}||	|<    g }|	D ]3  }|j7                         j9                  d       s#|j                  |       5 |rd!j5                  t        |            |	d"<    |t;        j<                  |      ||	      }|)| j                  d#|z         |j?                  d$d%|z         |||fS c c}w )&aW  Make an HTTP request to run a command for a version 1 client.

    ``caps`` is a set of known server capabilities. The value may be
    None if capabilities are not yet known.

    ``capablefn`` is a function to evaluate a capability.

    ``cmd``, ``args``, and ``data`` define the command, its arguments, and
    raw data to pass to it.
    s   pushkeyr    s   dataNs   headerss   sending %s command
s   cmd)zaccess-hidden1r      httppostargszX-HgArgs-Post   capabilitiess
   httpheader   ,r   s   X-HgArgs   ?%ss   %s%sr$   Content-Typeapplication/mercurial-0.1s   httpmediatypes   0.1s   partial-pulls   0.2txs   0.2s   compressions   comp=%s    s	   X-HgProto   zx-hg,Varys   sending %d bytes
zContent-Lengthz%d) popdebugr   urlreq	urlencodesorteditems
isinstancebytesioBytesIOr   r$   r"   intsplitr   r%   setaddr   compenginessupportedwireengines
CLIENTROLEwireprotosupportnamer:   lower
startswithr	   r   add_unredirected_header)uirequestbuildercaps	capablefnrepobaseurlcmdargsremotehiddendataheadersq
headersize
postargsokstrargsr   argsio
httpheaderencoded_argsr   r   qscusizeprotoparams
mediatypesmtecompsprotoheadersvaryheadersreqs                                  r   makev1commandrequestr   m   s   ( jW88GT"Dhhz2&GHH$s*+
#A	'(J T!=o&=J d""6$**,#78D$&JJt$t9ZZ(FLFMfd+D#&w< 	 o%%%}-
Z--dA6q9:J >!++F4::<,@AL!5j*" ( #(( 

%%A	&""1%	%B	K$	$BDtX{{		4yN'9"= %KJ'(OOF#RXXd^,J(::)N"; %%::4??K
  %%
 
 	
TYYu%556+IIf[)*L*:L
 * 	$MFE#GFO	$ K '<<>$$V,v&' ((6+#67
,dG
<C
&-.##$4dTkBB;7
s   *!Oc                    | j                   }| j                  rB| j                  dd      r/d} ||dz  t        j                  |j                               t        j                  |j                               fz         d}t        |j                               D ]c  \  }}t        j                  |      }t        j                  |      }|j                  d      r|d}|t        |      z  }T ||dz  ||fz         e | ||d	z  |z         |j                  }|(t        |d
d      }	|	t        |      }	 ||dz  |	z         t        j                         }
d}	 |j                  |      }	 | j                  rH| j                  dd      r6|r|j$                  nd} |dz  t        j                         
z
  |fz         	 t9        j:                  |       |S # t         j"                  $ r3}|j$                  dk(  rt'        j(                  t+        d             d}~wt,        j.                  $ rV}| j                  dt1        j2                  |j                               z         | j5                          t7        d|      d}~ww xY w# | j                  rI| j                  dd      r6|r|j$                  nd} |dz  t        j                         
z
  |fz         w w w xY w)zDSend a prepared HTTP request.

    Returns the response object.
    s   devels   debug.peer-requests   devel-peer-request: %s
s   %s %sNs   X-hgarg-r   s     %s %ss+     %d bytes of commands arguments in headersr$   s     %d bytes of datai  s   authorization faileds   http error requesting %s
r9   s     finished in %.4f seconds (%d))rV   	debugflag
configboolr	   bytesurl
get_methodget_full_urlrY   header_itemsri   r   rs   getattrr   timeropenurlerr	httperrorcoder   Abortr   httplibHTTPExceptionr   hidepassword	tracebackIOErrorurlmodwrapresponse)rk   openerr   dbgline
hgargssizer   r   rs   r$   startresinstr   s                 r   sendrequestr      s   
 ((C	||h0EF* !!#.."23!!#"2"2"45	
 
#C$4$4$67 	9MFE&&v.F%%e,E  -%!"Jc%j(
D:%78	9 !@A
 xxT8T2F~T,,v56


Ckk# <<BMM(4IJ"388D45::<%'./ J/  99++a 7899   "
)""3#3#3#567	
 	dD!!" <<BMM(4IJ"388D45::<%'./ K<s2   G J	/.HJ	3AJJ		J AK#c                        e Zd Z fdZ xZS )RedirectedRepoErrorc                 :    t         t        |   |       || _        y r0   )superr   r-   respurl)r*   msgr   	__class__s      r   r-   zRedirectedRepoError.__init__;  s    !41#6r    )rE   rF   rG   r-   __classcell__r   s   @r   r   r   :  s     r    r   c                    d}t        j                  |j                               }|j                  |      r|d t	        |        }d}nd}|j                  d      |j                  d      k7  r+d}| j                  s| j                  t        d      |z         	 t        j                  |j                  dd            }	t        j                  |      }
|	j                  d      r#t!        j"                  |j%                               |	j                  d      sp| j'                  d	t        j                  |      z         t        d
      |
|	xs d|j%                  d      fz  }|r|rt)        ||      t!        j*                  |      	 |	j-                  dd      d   }t/        |j-                  d      D cg c]  }t1        |       c}      }|dk(  r%|rt4        j6                  d   j9                  |      }n|dk(  rtt;        j<                  dt5        j>                  |d            d   }t5        j>                  ||      }t4        j6                  jA                  |      }|j9                  |      }n#t!        j*                  t        d      |
|fz        ||	|fS # t        $ r3 t        j                  |j                  j                  dd            }	Y w xY wc c}w # t2        $ r$ t!        j*                  t        d      |
|	fz        w xY w)NFT   /s   real URL is %s
zcontent-type s   application/hg-error   application/mercurial-s   requested URL: '%s'
sI   '%s' does not appear to be an hg repository:
---%%<--- (%s)
%s
---%%<---
s   no content-typerR      -r      .s+   '%s' sent a broken Content-Type header (%s))r   r   s   zlib)r         Br   s   '%s' uses newer protocol %s)!r	   r   geturlendswithr   rstripquietwarnr   	getheaderAttributeErrorrt   getr   r   ri   r   OutOfBandErrorr8   rV   r   	RepoErrorr`   tupler_   r&   r   rc   decompressorreaderstructunpackreadexactlyforwiretype)rk   baseurlrequrlr|   respcompressible
redirectedr   	qsdroppedprotosafeurlr   subtyper   version_infoelenenameengines                     r   parsev1commandresponser   @  s   J.G*SWH%		~~dw~~d33
xxGGA)*W45H!!$.."DE ""7+G/0""499;// 56
)G,@,@,HHI/
 e11499T?CD )%c733//#&&
++dA&q)gmmD.ABc!fBC v##G,??ED		 }}T4#3#3D!#<=a@  t,!!--e4((.oo,-'0BB
 	
 E4g  H!!$,,"2"2>2"FGH4 C 
oo<=%@PP
 	

s0   %J 
-K 7K	K 8KKK -Lc                   r     e Zd Z	 d fd	Zd Zd Zd Zd Zd Zd Z	d Z
dd	Zd
 Zd Zd Zd Zd Z xZS )httppeerc                     t         |   |||       || _        || _        |d uxr d|v| _        || _        || _        || _        y )N)pathrr   rL   )r   r-   _url_capslimitedarguments
_urlopener_requestbuilder_remotehidden)	r*   rk   r   r   r   rl   rm   rr   r   s	           r   r-   zhttppeer.__init__  sU     	$\B	
 $D 0 P_D5P -)r    c                     | j                   j                  D ]%  }|j                           t        |dd               ' y )N	close_allc                       y r0   rI   rI   r    r   <lambda>z"httppeer.__del__.<locals>.<lambda>  s    r    )r   handlerscloser   )r*   hs     r   __del__zhttppeer.__del__  s5    )) 	4AGGI1GA{L13	4r    c                 .    | j                   j                  S r0   )r   locr5   s    r   r   zhttppeer.url  s    yy}}r    c                      y r0   rI   r5   s    r   localzhttppeer.local      r    c                      y)NTrI   r5   s    r   canpushzhttppeer.canpush  r   r    c                     	 | j                   j                  | j                   j                  | j                   j                  }}}| j
                  j                  t        d      |||fz         y # t        $ r Y y w xY w)NsE   (sent %d HTTP requests and %d bytes; received %d bytes in responses)
)r   requestscountsentbytescountreceivedbytescountr   rk   noter   )r*   reqssentrecvs       r   r   zhttppeer.close  s{    	--..22 $D 	5 T4 	!	
  		s   AA/ /	A;:A;c                     | j                   S r0   )r   r5   s    r   capabilitieszhttppeer.capabilities  s    zzr    c                     |j                  d      }|r/| j                  t        j                  t	        d      |             y y )Nr      unexpected response:)r8   _abortr   ResponseErrorr   )r*   streamchunks      r   _finish_inline_clone_bundlez$httppeer._finish_inline_clone_bundle  s8     AKK++A.E,FNO r    c           
      p   t        j                  |      }t        | j                  | j                  | j
                  | j                  | j                  ||| j                        \  }}}t        | j                  | j                  |      }t        | j                  | j                  ||||      \  | _        }}|S r0   )r	   byteskwargsr   rk   r   r   capabler   r   r   r   r   )	r*   rp   _compressiblerq   r   r}   r|   r   cts	            r   _callstreamzhttppeer._callstream  s    ##D)*GG  JJLLII	
R 477DOOS94GGTYYBm
	2t r    c                      | j                   |fi |}	 |j                         |j                          S # |j                          w xY wr0   )r  r8   r   )r*   rp   rq   fps       r   _callzhttppeer._call  s<    Tc*T*	779 HHJBHHJs	   5 Ac                    | j                  d      }	 |j                  d      }|D ]  }|t        j                  v s|} n t        j
                  | j                  |d       }t        j                  | j                  |d      }ddi}		  | j                  |f||	d|}
|
j                  dd	      }t        |      d
k  rt        j                  t        d      |
      ||j                          t        j                   |       S # t        $ r dg}Y w xY w# t"        j$                  $ r  t&        j                  $ r}|j(                  d   t*        j,                  t*        j.                  fv r.t        j0                  t        d      |j(                  d	   z        t        j0                  |j(                  d	         d }~ww xY w# |j                          t        j                   |       w xY w)Ns   unbundlerN   r       rbrO   rP   rs   rt      
r   r   r   r   s   push failed: %s)r   r`   r   r   bundletypeswritebundlerk   r   httpsendfiler  r   r   r   r   r   r?   unlinkr   r   socketrq   errno
ECONNRESETEPIPEr   )r*   rp   cgrq   typesxr'   tempnamer  rt   rvalserrs                r   	_callpushzhttppeer._callpush  s    [)	KK%E  	AG'''	
 &&twwD$?(((EB!#>?	 

3ARADAA775!$D4y1}))!,C*DaHH HHJIIh?  	 EE		(  	 || 	+xx{u//==kk!$6"7#((1+"EFF++chhqk**	+
 HHJIIhs7   D 	AD DD&G=A?F<<GG 'G+c                 B   d }	 t        j                  dd      \  }}t        j                  |d      5 }|j	                  d      }|r%|j                  |       |j	                  d      }|r%d d d        t        j                  | j                  |d      5 }ddi}	 | j                  |f||	d	|cd d d        |t        j                  |       S S # 1 sw Y   fxY w# 1 sw Y   nxY w	 |t        j                  |       y y # |t        j                  |       w w xY w)
Ns
   hg-bundle-s   .hg)prefixsuffixwbi   r  rO   rP   r	  )r	   mkstempr?   fdopenr8   writer   r  rk   r  r  )
r*   rp   r  rq   filenamefdfhdfp_rt   s
             r   _calltwowaystreamzhttppeer._calltwowaystream
  s$   	$#++=PLB2t$ &GGDMHHQKA &  ,,TWWhF P#)+FG't''O#wO$OP P #		(# $& &P P P #		(# $x#		(# $s:   0D 8C-)D C0	D CD C'#D Dc                 ,     | j                   |fddi|S )Nr  T)r  )r*   rp   rq   s      r   _callcompressablezhttppeer._callcompressable  s    t@4@4@@r    c                     |r0   rI   )r*   	exceptions     r   r   zhttppeer._abort  s    r    F)rE   rF   rG   r-   r   r   r   r   r   r   r   r  r  r  r'  r)  r   r   r   s   @r   r   r     sO    HM	*4
*P,& P$$Ar    r   c                       e Zd ZdZddZy)queuedcommandfuturez@Wraps result() on command futures to trigger submission on call.Nc                     | j                         r t        j                  j                  | |      S | j                  j                          | j                  |      S r0   )doner   Futurer   _peerexecutorsendcommands)r*   timeouts     r   r   zqueuedcommandfuture.result&  sE    99;>>((w77'') {{7##r    r0   )rE   rF   rG   __doc__r   rI   r    r   r.  r.  #  s
    J$r    r.  c           
      *   d }d }i }t        | ||||d|      \  }}}	t        | ||      }
	 t        | |||	|
d      \  }}}
	 |
j                         }|
j                          |j                  d      st        j                  d|z        dt        |j                               i}||fS # t        $ rK}t        | ||||j                  d|      \  }}}	t        | ||      }
t        | |||	|
d      \  }}}
Y d }~d }~ww xY w# |
j                          w xY w)Nc                 ,    t        j                  d      )Ns   should not be called)r   ProgrammingError)r  s    r   r   z!performhandshake.<locals>.capable6  s    $$%<==r    rM   F)r   r   s   unexpected content-type: %s   v1capabilities)r   r   r   r   r   r8   r   ri   r   r8  ra   r`   )rk   r   r   rl   rm   r   rq   r   r   r|   r   r   r  r   rawdatainfos                   r   performhandshaker<  1  s2    D> D*
ND'3OC r63'D
2VRE
T))+

==23$$%Cb%HIIs7==?34DD='  
.gqyy/4
VR 2vs+2VRE
T
 	

s$   B) D  )	C=2AC88C= Dc           	         |j                   j                  s|j                   j                  rQt        d      }||j                   j                  xs |j                   j                  z  }t	        j
                  |      |j                   j                         \  }}| j                  d|z         |xs t        j                  | |      }t        | |||      \  }}	t        | |||||	d   |      S )a-  Construct an appropriate HTTP peer instance.

    ``opener`` is an ``url.opener`` that should be used to establish
    connections, perform HTTP requests.

    ``requestbuilder`` is the type used for constructing HTTP requests.
    It exists as an argument so extensions can override the default.
    s   unsupported URL component: "%s"s	   using %s
r9  rr   )r   queryfragmentr   r   r   authinforV   r   r   r<  r   )
rk   r   r   rl   rr   r   r   rA  r   r;  s
             r   
_make_peerrB  f  s     xx~~**23txx~~2!2!22kk# HH%%'MCHH]S !2v}}R2F$RfnEMGT
! r    c                 
   |rt        j                  t        d            	 |j                  j                  dk(  r.t
        j                  st        j                  t        d            t        | ||      }|S # t         j                  $ rv}	 |j                  d|j                  z         }t        j                  | ||      }| j                  t        d             |cY d }~S # t         j                  $ r |w xY wd }~ww xY w)Ns!   cannot create new http repositorys   httpss1   Python support for SSL and HTTPS is not installedr>  s   static-)new_raw_locations   (falling back to static-http)
)r   r   r   r   schemer   	has_httpsrB  r   copyrawlocr
   	make_peerr   )	rk   r   createintents
createoptsrr   r   httpexceptionr  s	            r   rI  rI    s     kk!@ABB 88??h&v/?/?++FG  "d>??  	 99j4;;.F9GD((T6:AGGA89:H 	 	  s+   AA9 9DAC$D$C::C==Dr,  )NNF)'r  r]   r?   r  r   
concurrentr   i18nr   r   r   r   r   r	   r
   r   r   r   r   utilsr   r   r   rW   r   r"   r   r   r   r   r   wirepeerr   r1  r.  r<  requestrB  rI  rI   r    r   <module>rS     s     	 	    	 	 	 
,,		:* *j BJEP%// D NY'' Yx$'.. $2l &..u H CH r    