o ]LbE@s(ddlmZddlZddlZddlZddlmZddlmZm Z m Z m Z m Z m Z ddlm ZddlmZmZe jZe jZe jZdZd Zd Zd Ze jZd d Zee jGdddeZddZ ddZ!ddZ"ddZ#ddZ$ddZ%ddZ&ee jGdddeZ'd d!Z(Gd"d#d#eZ)dS)$)absolute_importN)_)encodingerrorpycompatutilwireprototypeswireprotov1server)r) compression stringutilsapplication/mercurial-0.1sapplication/mercurial-0.2sapplication/hg-errorcCsLg}d} |jd||f}|durn |t||d7}qd|S)zjDecode a long value from multiple HTTP request headers. Returns the value as a bytes, not a str. rTs%s-%dN)headersgetappendrbytesurljoin)req headerprefixchunksivr;/usr/lib/python3/dist-packages/mercurial/wireprotoserver.pydecodevaluefromheaders*s rc@sfeZdZddZeddZddZddZd d Zd d Z e j d dZ ddZ ddZddZdS)httpv1protocolhandlercCs||_||_||_d|_dSN)_req_ui _checkperm _protocaps)selfrui checkpermrrr__init__=s zhttpv1protocolhandler.__init__cCsdS)Nshttp-v1rr"rrrnameCszhttpv1protocolhandler.namecs|}i|}|D],}|dkr0i}|D]}|dkr*||vr*||d||<q|d<q ||d|<q fdd|DS)N*cmdrcg|]}|qSrr.0kdatarr Tz1httpv1protocolhandler.getargs..)_argssplitkeys)r"args knownargsr4r-starkeyrr.rgetargsGs  zhttpv1protocolhandler.getargscCsj|jj}t|jjdd}|r#|tj|jj |dd|St |jd}|tj|dd|S)N X-HgArgs-PostrT)keep_blank_valuessX-HgArg) rqsparams asdictoflistsintrrupdateurlreqparseqsbodyfhreadr)r"r5postlenargvaluerrrr2Vs  zhttpv1protocolhandler._argscCs,|jdurt|jd}t|d|_|jS)Ns X-HgProto )r!rrsetr3)r"valuerrr getprotocapses  z"httpv1protocolhandler.getprotocapscCs:t|jjd}|t|jjdd8}tj|jj|dS)NsContent-Lengthr:r)limit)r>rrrr filechunkiterrB)r"lengthrrr getpayloadksz httpv1protocolhandler.getpayloadccsZ|jj}|jj}t}z||j_||j_|VW||j_||j_dS||j_||j_wr)rfoutferrrstringio)r"oldoutolderroutrrrmayberedirectstdiots  z(httpv1protocolhandler.mayberedirectstdiocCs.d|jjt|jjp dt|jjpdfS)Nsremote:%s:%s:%sr)r urlschemer@quote remotehost remoteuserr&rrrclients zhttpv1protocolhandler.clientcCs~|d|d|jdd|jddr|d|dt|jtj}|r=dd d |D}|d ||S) Nbatchs httpheader=%dserversmaxhttpheaderlens experimentals httppostargsshttpmediatype=0.1rx,0.1tx,0.2tx,css |] }t|jVqdSr)r@rVwireprotosupportr')r,errr s z8httpv1protocolhandler.addcapabilities..scompression=%s) rr# configint configboolr supportedcompenginesr SERVERROLEr)r"repocaps compengines comptypesrrraddcapabilitiess    z%httpv1protocolhandler.addcapabilitiescCs ||Sr)r r"permrrrr$ zhttpv1protocolhandler.checkpermN)__name__ __module__ __qualname__r%propertyr'r9r2rIrM contextlibcontextmanagerrTrYrhr$rrrrr;s   rcCs |tjvSr)r commands)cmdrrriscmdrkrtc sddlm}j}djvrdSjd}t|sdSjr2|d|_t|j d<| ddd St |j fd d }z t ||||Wd S|jy}z)|j D] \} } | |j | <qV||jt||_| dt|WYd }~d Sd }~ww) aPossibly 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. rcommonr)Fi Content-Type0 %s s Not FoundTcs |Srr)rjr$rctxrrrs z#handlewsgirequest..N)hgwebrvrdr<rt dispatchpath statusmessagestatusHGTYPEr setbodybytesrr# _callhttp ErrorResponsecoder forcebytestr) rzrresr$ hgwebcommonrdrsprotor^r-rrryrhandlewsgirequests8         rcCsd|vr@|rttifSt|}t|tjD]$}| j |vr?i}| dd| }|dur8||d<t||fSqd| ddi}t t jd|fS)zDetermine the appropriate response type and compression settings. Returns a tuple of (mediatype, compengine, engineopts). s0.2r[s%slevelNslevels zliblevelszlib)rIHGTYPE2r _noopenginer clientcompressionsupportr rbrcr]r'r`rrrf)r#rprefer_uncompressed compformatsengineoptslevelrrr_httpresponsetypes  rc sddlmdd}dfdd }tj||s#|tttddS|tj|j t |||}t |t rA|tt |ddSt |tjrQ|tt |jddSt |tjra|tt |jd dSt |tjr|j}t|j||j\} } } | || }| tkr||| | }|t| |d dSt |tjrd |j|jf}|tt |ddSt |tjrd |j}d _|tt |ddSt |tjr|tt|jddSt !d |)NrrucssX|j}dt|krdksJJtdt|V|V|D]}|Vq$dS)NrB)r]r'lenstructpack)genr engineoptsr'chunkrrr genversion2s  z_callhttp..genversion2csR|tkrd_n|_|jd<|dur||dur'|dSdS)Ns200 Script output followsrw)HTTP_OKrr~rr setbodygen)r contenttype bodybytesbodygenrrrr setresponse's   z_callhttp..setresponses:requested wire protocol command is not available over HTTP)r)rs%d %srxTshgweb.protocol internal failure)NN)"r|rvr rrcommandavailabler HGERRTYPErr$ permissiondispatch isinstancebytesrr bytesresponser/streamreslegacyr streamresrr#rcompressstreamrpushresroutputpusherrdrainooberrormessagerProgrammingError) rdrrrrsrrrspr mediatyperrrrrrsN               rcCs(|dt||||dS)z-Send a bytes response for protocol version 1.s%d N)writerflush)rNrHrrr_sshv1respondbytesds  rcCs&|j}|jD]}||q|dSr)rrr)rNsourcerrrrr_sshv1respondstreamks   rcCs,|d|||d|dS)Ns%s -  )rr)rNrOrrrr_sshv1respondooberrorrs  rc@sbeZdZdZddZeddZddZdd Zd d Z e j d d Z ddZ ddZddZdS)sshv1protocolhandlerz.) r3rxrangerrreadlinerAbortrr>rC) r"r5r4narglinearglr7r-valrr.rr9s$     zsshv1protocolhandler.getargscCs|jSr)r!r&rrrrIsz!sshv1protocolhandler.getprotocapsccsHt|jdt|j}|r"|j|Vt|j}|sdSdS)Nr)rrr>rrrC)r"countrrrrMs  zsshv1protocolhandler.getpayloadccs dVdSrrr&rrrrTs z'sshv1protocolhandler.mayberedirectstdiocCs"tjddddd}d|S)Ns SSH_CLIENTrrFrrs remote:ssh:)renvironrr3)r"rYrrrrYszsshv1protocolhandler.clientcCs$|jtjkr |d|d|S)Ns protocapsrZ)r'r rr)r"rdrerrrrhs   z$sshv1protocolhandler.addcapabilitiescCsdSrrrirrrr$szsshv1protocolhandler.checkpermN)rlrmrn__doc__r%ror'r9rIrMrprqrTrYrhr$rrrrrys   rc Csvd}t|||}|s|dkr|dd}|sd}qtj||}|s,t|dqt|||} |jj |jj t | t rJt|| nit | tjrWt|| jn\t | tjrct|| nPt | tjrot|| nDt | tjrt|dt|d| jn0t | tjrt|| jn#t | tjrt||j | jntd| |dkrdStd||r dSdS)Nsprotov1-servingrsshutdownrs%ds6unhandled response type from wire protocol command: %ssunhandled ssh server state: %s)ris_setrr rrrrrr#rNrrOrrr rr/rrrrrrrrrrr) r#rdrrNevstaterrequest availablerrrr _runsshserversV               rc@s&eZdZdddZddZddZdS) sshserverNcCsT||_||_|\|_|_|r(tj||jddd|_tj||jddd|_dSdS)NoT)logdatae)r_repo protectfinoutrrrmakeloggingfileobjectrO)r"r#rdlogfhrrrr% s   zsshserver.__init__cCs$|t|j|j|jdSr) serveuntil threadingEventr restorefinoutrrr&rrr serve_foreverszsshserver.serve_forevercCst|j|j|j|j|dS)z%Serve until a threading.Event is set.N)rrrrr)r"rrrrrszsshserver.serveuntilr)rlrmrnr%rrrrrrr s  r)* __future__rrprri18nrrrrrr r interfaces interfaceutilutilsr r rPurlerrr@rrrrrr implementerbaseprotocolhandlerobjectrrtrrrrrrrrrrrrrs<     nF$L GK