o ]Lb /@sddlmZddlZddlZddlZddlZddlmZddl m Z m Z m Z m Z ddlmZejZejZejZejZejZejZejZe Zee ddd Zdd d Zd d ZddZddZddZdS))absolute_importN)common) exthelperpycompatutilwireprotoserver) blobstoreshandlewsgirequestc s||r dSjjddsdStjjdsdSjs"dSz+jdkr6dtj|WSjdrKt j|fd d WSWdSt j y}z)|j D] \}}||j |<qYt |jt||_|d t|WYd }~dSd }~ww) zWrap wireprotoserver.handlewsgirequest() to possibly process an LFS request if it is left unprocessed by the wrapped method. Ts experimentals lfs.serveFlfslocalblobstores.git/info/lfs/objects/batchpulls.hg/lfs/objectscs |SN)perm checkpermrctxreqr >/usr/lib/python3/dist-packages/hgext/lfs/wireprotolfsserver.py>s z#handlewsgirequest..s0 %s N)repoui configboolr safehasattrsvfs dispatchpath_processbatchrequest startswith_processbasictransfer hgwebcommon ErrorResponseheaders statusmessagecoderbytestrstatus setbodybytes)origrrresrekvr rrhandlewsgirequest%s2    r+cCs(tj||d|_d|jd<|ddS)Nmessagetext/plain; charset=utf-8 Content-Type)rr!r$r r%)r'r"r-r r r _sethttperrorLs r1cCsPtt}|jd}d}|jr||j7}|d|j7}|d||fdS)z=Write information about the current exception to wsgi.errors.s wsgi.errorsr0/s4Exception happened while processing request '%s': %sN)rsysbytes traceback format_excrawenvapppathrwrite)rtberrorlogurir r r _logexceptionRs   r<cCs|jdkr t|tdS|jddkrt|tdS|jddkr(t|tdSt|j }d| ddgvrAt|t ddS| d }t |}|d vrYt|t d |dS|j j}d d t|| dg||D}d|d}tt|_d|jd<|t t|dS)zHandle a request for the Batch API, which is the gateway to granting file access. https://github.com/git-lfs/git-lfs/blob/master/docs/api/batch.md sPOSTTr/sapplication/vnd.git-lfs+jsonsAcceptbasic transferss0Only the basic LFS transfer handler is supported operation)uploaddownloads&Unsupported LFS transfer operation: %scSsg|]}|qSr r ).0pr r r sz(_processbatchrequest..objects)transferrE)methodr1HTTP_METHOD_NOT_ALLOWEDr HTTP_UNSUPPORTED_MEDIA_TYPEHTTP_NOT_ACCEPTABLEr json_loadsbodyfhreadgetHTTP_BAD_REQUESTr#rr _batchresponseobjectsrr!HTTP_OKr$r%jsondumps)rrr'lfsreqr? localstorerErspr r rrasN        rc #sp|D]}|d}|d}||dd}d}d} z||} | r,|dkr,||Wn1ty^} z%| jtjkrRtd| jpDd d |d <|VWYd } ~ qd}WYd } ~ nd } ~ ww|d kr~|spddd |d <|Vq| s}ddd |d <|Vqn| r|Vqt j t j dd} fdd} dt |t djj|f| d| di|d<|Vqd S)a4Yield one dictionary of attributes for the Batch API response for each object in the list. req: The parsedrequest for the Batch API request objects: The list of objects in the Batch API object request list action: 'upload' or 'download' store: The local blob store for servicing requestsoidasciisize)rWrYTFr@izInternal Server Server)r"r-errorNrAizThe object does not existzThe object is corrupt )minutescs2ddi}jdd}|drt||d<|S)NAcceptzapplication/vnd.git-lfss Authorizationr0sBasic Authorization)r rNrrstrurl)hdrauthrr r _buildheaders  z+_batchresponseobjects.._buildheaderz%ss%s%s/.hg/lfs/objects/%sz%Y-%m-%dT%H:%M:%SZ)href expires_atheaderactions)rNencodeverifylinkfromusercacheIOErrorerrnoENOENTr<strerrordatetimenow timedeltarr`baseurlr7strftime) rrEactionstoreobjsoidrWrVexistsverifiesinst expiresatrdr rcrrPsp             rPc CsL|j}|jd}|jj}t|jdkrt|tdS|dkra|d||}tj }z| ||j |j d||r;t nt|_WntjyTt||dd|_Ynwd |j d <|d dS|d kr|d t t |_d|j d <z |||WdStjyt|t dd|_|d YdSwt|td|ddS)apHandle a single file upload (PUT) or download (GET) action for the Basic Transfer Adapter. After determining if the request is for an upload or download, the access must be checked by calling ``checkperm()`` with either 'pull' or 'upload' before accessing the files. https://github.com/git-lfs/git-lfs/blob/master/docs/api/basic-transfers.md TsPUTr@sContent-Lengthr[s corrupt blobr.r/r0sGETr sapplication/octet-streams#Unsupported LFS transfer method: %sr,)rG dispatchpartsrr lenr1HTTP_NOT_FOUNDhasrr!downloadrLr rQ HTTP_CREATEDr$r LfsCorruptionErrorr<r%rMrH) rrr'rrGrWrUexistedr!r r rr*sN         rr ) __future__rrprmrRr4mercurial.hgwebrr mercurialrrrrr rQrrOrrHrJrIeh wrapfunctionr+r1r<rrPrr r r rs.      &R w