Ë
    "ïàju ã                   óÜ   — d Z ddlmZ ddlmZmZ ddlmZmZ ddl	m
Z
mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ ddlmZm Z  dZ! ejD                  e#«      Z$dZ% G d	„ d
«      Z&y)z:
WSGI application that handles one single WebDAV request.
é    )Úcontextmanager)ÚunquoteÚurlparse)ÚutilÚ	xml_tools)ÚHTTP_BAD_GATEWAYÚHTTP_BAD_REQUESTÚHTTP_CONFLICTÚHTTP_CREATEDÚHTTP_FAILED_DEPENDENCYÚHTTP_FORBIDDENÚHTTP_INTERNAL_ERRORÚHTTP_MEDIATYPE_NOT_SUPPORTEDÚHTTP_METHOD_NOT_ALLOWEDÚHTTP_NO_CONTENTÚHTTP_NOT_FOUNDÚHTTP_NOT_IMPLEMENTEDÚHTTP_OKÚHTTP_PRECONDITION_FAILEDÚHTTP_RANGE_NOT_SATISFIABLEÚDAVErrorÚ#PRECONDITION_CODE_LockTokenMismatchÚ%PRECONDITION_CODE_PropfindFiniteDepthÚas_DAVErrorÚget_http_status_string)Úchecked_etagÚetreeÚreStructuredTexti    c                   ó²   — e Zd Zd„ Zd„ Zdddddœd„Zd„ Zd„ Zed	„ «       Z	d
„ Z
d„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zddœd„Zy)ÚRequestServerc                 ó.  — || _         d| _        d| _        t        | _        g d¢| _        | j                   j                  «       sR| j
                  j                  g d¢«       | j                   j                  �| j
                  j                  ddg«       y y y )NTé   )ÚOPTIONSÚHEADÚGETÚPROPFIND)ÚPUTÚDELETEÚCOPYÚMOVEÚMKCOLÚ	PROPPATCHÚPOSTÚLOCKÚUNLOCK)	Ú_davProviderÚallow_propfind_infiniteÚ_verboseÚDEFAULT_BLOCK_SIZEÚ
block_sizeÚ_possible_methodsÚis_readonlyÚextendÚlock_manager)ÚselfÚdav_providers     úE/srv/dav/.venv/lib/python3.12/site-packages/wsgidav/request_server.pyÚ__init__zRequestServer.__init__0   s�   € Ø(ˆÔØ'+ˆÔ$ØˆŒÜ,ˆŒò "HˆÔð × Ñ ×,Ñ,Ô.Ø×"Ñ"×)Ñ)òô
ð × Ñ ×-Ñ-Ð9Ø×&Ñ&×-Ñ-¨v°xÐ.@ÕAð :ð /ó    c              #   óè  K  — d|v sJ ‚| j                   }d|vrt        j                  d«       |j                  dd«      |d<   |d   }|d   j                  dt        «      | _        |j                  d	«      �|d	   j                  «       |d	<   |j                  d
«      �|d
   j                  «       |d
<   d|v r	 d }|| j                  v rd|› �}t        | |d «      }|s-t        j                  d|›�«       | j                  t        «       |j                  d«      r	 |j                  d«      rdddlm}  |«       }|j                  |j                   |||«      }	|j#                  d¬«       |	E d {  –—†  t%        |	d«      r|	j'                  «        y |j!                  |||«      }
	 |
E d {  –—†  t%        |
d«      r|
j'                  «        y 7 Œ\7 Œ## t%        |
d«      r|
j'                  «        w w xY w­w)Nzwsgidav.verbosezwsgidav.auth.user_namez+Missing 'wsgidav.auth.user_name' in environÚ	anonymousúwsgidav.user_nameÚREQUEST_METHODúwsgidav.configr4   Ú
HTTP_DEPTHÚHTTP_OVERWRITEÚHTTP_EXPECTÚdo_zInvalid HTTP method úwsgidav.debug_breakzwsgidav.debug_profiler   )ÚProfileé   )ÚsortÚclose)r0   Ú_loggerÚwarningÚgetr3   r4   ÚlowerÚupperr5   ÚgetattrÚerrorÚ_failr   ÚcProfilerH   ÚruncallÚcustom_request_handlerÚprint_statsÚhasattrrK   )r9   ÚenvironÚstart_responseÚproviderÚrequestmethodÚmethodÚmethod_namerH   ÚprofileÚresÚapp_iters              r;   Ú__call__zRequestServer.__call__O   s  è ø€ Ø  GÑ+Ð+Ð+Ø×$Ñ$ˆð $¨7Ñ2Ü�O‰OÐIÔJà'.§{¡{Ø$ kó(
ˆÐ#Ñ$ð  Ð 0Ñ1ˆà!Ð"2Ñ3×7Ñ7ØÔ,ó
ˆŒð
 �;‰;�|Ó$Ð0Ø$+¨LÑ$9×$?Ñ$?Ó$AˆG�LÑ!Ø�;‰;Ð'Ó(Ð4Ø(/Ð0@Ñ(A×(GÑ(GÓ(IˆGÐ$Ñ%à˜GÑ#Øð ˆØ˜D×2Ñ2Ñ2Ø ˜Ð/ˆKÜ˜T ;°Ó5ˆFÙÜ�M‰MÐ0°Ð0AÐBÔCØ�J‰JÔ.Ô/à�;‰;Ð,Ô-Øà�;‰;Ð.Ô/Ý(á“iˆGØ—/‘/Ø×/Ñ/°¸.È&óˆCð ×Ñ QÐÔ'Ø�NˆNÜ�s˜GÔ$Ø—	‘	”Øð ×2Ñ2°7¸NÈFÓSˆð	!à×Ðô �x Ô)à—‘Ô Øð3 øð  ùô �x Ô)à—‘Õ ð *üs<   ‚E-G2Å/GÅ04G2Æ%G Æ*GÆ+G Æ/G2ÇG ÇG/Ç/G2NF)Úcontext_infoÚsrc_exceptionÚerr_conditionÚis_head_methodc                ó:   — t        j                  ||||| ¬«       y)z$Wrapper to raise (and log) DAVError.)rd   re   Úadd_bodyN)r   Úfail)r9   Úvaluerc   rd   re   rf   s         r;   rS   zRequestServer._failš   s"   € ô 	�	‰	ØØØ'Ø'Ø'Ð'ö	
r=   c                 óJ  — |t         t        t        fv sJ ‚|st        j                  |||«      S t        |«      dk(  r6|d   d   |j                  «       k(  rt        j                  |||d   d   «      S t        j                  «       }|D ]‚  \  }}|j                  d«      sJ ‚t        |t        «      sJ ‚t        j                  |d«      }	|t        j                  |	d«      _        dt        |«      › �t        j                  |	d«      _        Œ„ t        j                   |||«      S )ac  Send WSGI response (single or multistatus).

        - If error_list is None or [], then <success_code> is send as response.
        - If error_list contains a single error with a URL that matches root_res,
          then this error is returned.
        - If error_list contains more than one error, then '207 Multi-Status' is
          returned.
        é   r   ú/z{DAV:}responsez
{DAV:}hrefz	HTTP/1.1 z{DAV:}status)r   r   r   r   Úsend_status_responseÚlenÚget_hrefr   Úmake_multistatus_elÚ
startswithÚ
isinstancer   r   Ú
SubElementÚtextr   Úsend_multi_status_response)
r9   rY   rZ   Úroot_resÚsuccess_codeÚ
error_listÚmultistatusELÚrefurlÚeÚ
responseELs
             r;   Ú_send_responsezRequestServer._send_response¬   s'  € ð ¤¬o¼wÐGÑGÐGÐGÙä×,Ñ,¨W°nÀlÓSÐSÜˆz‹?˜aÒ J¨q¡M°!Ñ$4¸×8IÑ8IÓ8KÒ$Kä×,Ñ,¨W°nÀjÐQRÁmÐTUÑFVÓWÐWô "×5Ñ5Ó7ˆà#ò 	=‰IˆF�Aà×$Ñ$ SÔ)Ð)Ð)Ü˜a¤Ô*Ð*Ð*Ü×)Ñ)¨-Ð9IÓJˆJØ>DŒE×Ñ˜Z¨Ó6Ô;ð !Ô!7¸Ó!:Ð ;Ð<ô ×ÑØ˜Nóåð	=ô ×.Ñ.¨w¸ÈÓVÐVr=   c                 óÂ   — | j                   j                  }|�|€y|j                  «       }d|vrt        j                  |«       |j                  |||d   |d   ¬«       y)z…Raise DAVError(HTTP_LOCKED), if res is locked.

        If depth=='infinity', we also raise when child resources are locked.
        NTúwsgidav.conditions.ifúwsgidav.ifLockTokenListr@   )ÚurlÚdepthÚ
token_listÚ	principal)r0   r8   Úget_ref_urlr   Úparse_if_header_dictÚcheck_write_permission)r9   r`   rƒ   rY   Úlock_manÚref_urls         r;   Ú_check_write_permissionz%RequestServer._check_write_permissionÎ   sq   € ð
 ×$Ñ$×1Ñ1ˆØÐ˜s˜{Øà—/‘/Ó#ˆà"¨'Ñ1Ü×%Ñ% gÔ.ð 	×'Ñ'ØØØÐ8Ñ9ØÐ1Ñ2ð	 	(õ 	
r=   c              #   ó  K  — | j                   j                  }|�|€d–— y|j                  «       }d|vrt        j                  |«       |j                  ||d   |d   ¬«      5  d–— ddd«       y# 1 sw Y   yxY w­w)a  Atomically check write permission for the enclosed write.

        The transaction must bracket the whole read-body-and-write sequence,
        so a lock cannot be acquired by another principal while the request
        body is being received (TOCTOU, CWE-367).
        Nr€   r�   r@   )r‚   r„   r…   )r0   r8   r†   r   r‡   Úwrite_transaction)r9   r`   rY   r‰   rŠ   s        r;   Ú_write_transactionz RequestServer._write_transactionä   sŒ   è ø€ ð ×$Ñ$×1Ñ1ˆØÐ˜s˜{ÛØà—/‘/Ó#ˆà"¨'Ñ1Ü×%Ñ% gÔ.à×'Ñ'ØØÐ8Ñ9ØÐ1Ñ2ð (ó 
ñ 	ó
 ÷	÷ 	ñ 	üs   ‚A#A?Á%A3Á*	A?Á3A<Á8A?c                 óJ  — d|vrt        j                  |«       |€y|d   }d}|j                  «       �t        |j                  «       «      }t	        |j                  «       d¬«      }|€d}d|v sd|v sd	|v sd
|v rt        j                  ||||«       d|vry|j                  «       }| j                  j                  }g }|r1|j                  ||d   ¬«      }	|	D ]  }
|j                  |
d   «       Œ t        j                  |||||«      s| j                  t        d¬«       y)aú  Apply HTTP headers on <path>, raising DAVError if conditions fail.

        Add environ['wsgidav.conditions.if'] and environ['wsgidav.ifLockTokenList'].
        Handle these headers:

          - If-Match, If-Modified-Since, If-None-Match, If-Unmodified-Since:
            Raising HTTP_PRECONDITION_FAILED or HTTP_NOT_MODIFIED
          - If:
            Raising HTTP_PRECONDITION_FAILED

        @see http://www.webdav.org/specs/rfc4918.html#HEADER_If
        @see util.evaluate_http_conditionals
        r€   NéÿÿÿÿT©Ú
allow_noneú[]ÚHTTP_IF_MODIFIED_SINCEÚHTTP_IF_UNMODIFIED_SINCEÚHTTP_IF_MATCHÚHTTP_IF_NONE_MATCHÚHTTP_IFr@   )r…   Útokenz'If' header condition failed.©rc   )r   r‡   Úget_last_modifiedÚintr   Úget_etagÚevaluate_http_conditionalsr†   r0   r8   Úget_indirect_url_lock_listÚappendÚtest_if_header_dictrS   r   )r9   r`   rY   Úif_dictÚlast_modifiedÚetagrŠ   r‰   Úlocktoken_listÚlockListÚlocks              r;   Ú_evaluate_if_headersz"RequestServer._evaluate_if_headersý   sS  € ð #¨'Ñ1Ü×%Ñ% gÔ.ð ˆ;ØàÐ1Ñ2ˆð ˆØ× Ñ Ó"Ð.Ü × 5Ñ 5Ó 7Ó8ˆMä˜CŸL™L›N°tÔ<ˆØˆ<ØˆDð %¨Ñ/Ø)¨WÑ4Ø 'Ñ)Ø# wÑ.ä×+Ñ+¨C°ÀÀgÔNà˜GÑ#Øð —/‘/Ó#ˆØ×$Ñ$×1Ñ1ˆØˆÙØ×:Ñ:Ø 7Ð+>Ñ#?ð ;ó ˆHð !ò 5�Ø×%Ñ% d¨7¡mÕ4ð5ô ×'Ñ'¨¨W°g¸~ÈtÔTØ�J‰JÜ(Ð7Vð ô ð 	r=   c                 óV  — |d   }| j                   j                  ||«      }|j                  dd«       |d   dvr)| j                  t        dj                  |d   «      ¬«       |d   dk(  r(| j                  s| j                  t        dt        ¬«       |€| j                  t        |¬«       |j                  d
«      r	 | j                  ||«       t        j                  |d¬«      }|€t        j                  d«      }|j                   dk7  r| j                  t        «       g }d	}|D ]¡  }|j                   dk(  r|r| j                  t        «       d}Œ,|j                   dk(  r|r| j                  t        «       d}ŒU|j                   dk(  sŒe|dvr| j                  t        «       d}|D ]  }	|j#                  |	j                   «       Œ Œ£ |j%                  |d   d¬«      }
t'        j(                  «       }g }|
D ]j  }|dk(  r|j+                  d«      }n*|dk(  r|j+                  d«      }n|j+                  d|¬«      }|j-                  «       }t        j.                  |||«       Œl |r*dj1                  |«      t        j2                  |d«      _        t        j6                  |||«      S )zŒ
        TODO: does not yet support If and If HTTP Conditions
        @see http://www.webdav.org/specs/rfc4918.html#METHOD_PROPFIND
        Ú	PATH_INFOrC   Úinfinity)Ú0Ú1r«   zInvalid Depth header: {!r}.rš   z6PROPFIND 'infinite' was disabled for security reasons.©rc   re   NrG   T©Úallow_emptyz4<D:propfind xmlns:D='DAV:'><D:allprop/></D:propfind>z{DAV:}propfindz{DAV:}allpropÚallpropz
{DAV:}nameÚnameú
{DAV:}prop)NÚnamedr´   )rƒ   Úadd_self)Ú	name_listú
ú{DAV:}responsedescription)r0   Úget_resource_instÚ
setdefaultrS   r	   Úformatr1   r   r   r   rN   r¨   r   Úparse_xml_bodyr   ÚXMLÚtagr    Úget_descendantsr   rq   Úget_propertiesrp   Úadd_property_responseÚjoinrt   ru   rv   )r9   rY   rZ   Úpathr`   Ú	requestELÚpropNameListÚpropFindModeÚpfnodeÚpfpnodeÚreslistrz   ÚresponsedescriptionÚchildÚpropListÚhrefs                   r;   Údo_PROPFINDzRequestServer.do_PROPFIND@  s­  € ð
 �{Ñ#ˆØ×Ñ×1Ñ1°$¸Ó@ˆð 	×Ñ˜<¨Ô4Ø�<Ñ Ð(>Ñ>Ø�J‰JÜ Ø:×AÑAØ˜LÑ)óð ô ð �<Ñ  JÒ.°t×7SÒ7SØ�J‰JÜØUÜCð ô ð ˆ;Ø�J‰J”~°DˆJÔ9à�;‰;Ð,Ô-Øà×!Ñ! # wÔ/ô ×'Ñ'¨¸TÔBˆ	ØÐô Ÿ	™	ØFóˆIð �=‰=Ð,Ò,Ø�J‰JÔ'Ô(àˆØˆØò 	5ˆFØ�z‰z˜_Ò,Ùà—J‘JÔ/Ô0Ø(‘ð —‘˜|Ò+ÙØ—J‘JÔ/Ô0Ø%‘Ø—‘˜|Ó+à Ñ6Ø—J‘JÔ/Ô0Ø&�Ø%ò 5�GØ ×'Ñ'¨¯©Õ4ñ5ð-	5ð6 ×%Ñ%¨G°LÑ,AÈDÐ%ÓQˆô "×5Ñ5Ó7ˆØ Ðàò 		FˆEØ˜yÒ(Ø ×/Ñ/°	Ó:‘Ø Ò'Ø ×/Ñ/°Ó7‘à ×/Ñ/°À<Ð/ÓP�à—>‘>Ó#ˆDÜ×&Ñ& }°d¸HÕEð		Fñ ð —Y‘YÐ2Ó3ô ×ÑØÐ:óää×.Ñ.¨w¸ÈÓVÐVr=   c                 ó  — |d   }| j                   j                  ||«      }|j                  dd«       |d   dk7  r| j                  t        d¬«       |€| j                  t
        |¬«       | j                  ||«       | j                  |d|«       | j                  ||«      5  t        j                  |«      }|j                  dk7  r| j                  t        «       g }|D ]Á  }d}|j                  dk(  rd	}n)|j                  d
k(  rd}n| j                  t        d¬«       |D ]}  }	|	j                  dk7  r| j                  t        d¬«       |	D ]P  }
d}|d	k(  r(d}t        |
«      dkD  r| j                  t        d¬«       n|
}|j                  |
j                  |f«       ŒR Œ ŒÃ d}g }|D ]8  \  }}	 |j                  ||d¬«       d}|j                  ||f«       |xr |dk(  }Œ: 	 ddd«       g }g }sbD ]\  \  }}|dk(  rt#        t$        «      }n/t'        |t"        «      r|j                  |j)                  «       «       |j                  ||f«       Œ^ n2D ]-  \  }}	 |j                  ||d¬«       |j                  |df«       Œ/ t+        j,                  «       }|j/                  «       }t        j0                  |||«       |r*dj3                  |«      t5        j6                  |d«      _        t        j:                  |||«      S # t        $ r}t!        |«      }Y d}~�ŒYd}~ww xY w# 1 sw Y   �ŒDxY w# t        $ rH}t!        |«      }|j                  ||f«       |j                  |j)                  «       «       Y d}~�Œ)d}~ww xY w)z†Handle PROPPATCH request to set or remove a property.

        @see http://www.webdav.org/specs/rfc4918.html#METHOD_PROPPATCH
        rª   rC   r¬   úDepth must be '0'.rš   Nz{DAV:}propertyupdatez{DAV:}removeÚremovez	{DAV:}setÚsetz)Unknown tag (expected 'set' or 'remove').r³   zUnknown tag (expected 'prop').r   z(prop element must be empty for 'remove'.T©Údry_runú200 OKFr·   r¸   )r0   r¹   rº   rS   r	   r   r¨   r‹   rŽ   r   r¼   r¾   ro   r    Úset_property_valueÚ	Exceptionr   r   r   rs   Úget_user_infor   rq   rp   rÁ   rÂ   r   rt   ru   rv   )r9   rY   rZ   rÃ   r`   rÄ   ÚpropupdatelistÚppnodeÚpropupdatemethodÚpropnodeÚpropertynodeÚ	propvalueÚsuccessflagÚwriteresultlistr²   Úwriteresultr|   ÚpropResponseListrÊ   Úresultrz   rÍ   s                         r;   Údo_PROPPATCHzRequestServer.do_PROPPATCH¤  sÆ  € ð
 �{Ñ#ˆØ×Ñ×1Ñ1°$¸Ó@ˆð 	×Ñ˜<¨Ô-Ø�<Ñ  CÒ'Ø�J‰JÔ'Ð6JˆJÔKàˆ;Ø�J‰J”~°DˆJÔ9à×!Ñ! # wÔ/Ø×$Ñ$ S¨#¨wÔ7ð ×$Ñ$ S¨'Ó2ñ ;	Fä×+Ñ+¨GÓ4ˆIà�}‰}Ð 6Ò6Ø—
‘
Ô+Ô,ð  ˆNà#ò "M�Ø#'Ð Ø—:‘: Ò/Ø'/Ñ$Ø—Z‘Z ;Ò.Ø',Ñ$à—J‘JÜ(Ø%Pð ô ð
 !'ò M�HØ—|‘| |Ò3ØŸ
™
Ü,Ø)Ið #ô ð
 )1ò M˜Ø$(˜	Ø+¨xÒ7Ø(,˜IÜ" <Ó0°1Ò4ð !%§
¡
Ü$4Ø1[ð !+õ !"ð
 )5˜Ià&×-Ñ-¨|×/?Ñ/?ÀÐ.KÕLñMñMð"MðL ˆKØ ˆOà#1ò F‘��ið+Ø×*Ñ*¨4°ÀDÐ*ÔIð #+�KØ×&Ñ&¨¨kÐ':Ô;Ø)ÒE¨k¸XÑ.E‘ñF÷g;	Fð@ ÐØ Ðáà /ò 8‘��fØ˜XÒ%Ü%Ô&<Ó=‘FÜ ¬Ô1Ø'×.Ñ.¨v×/CÑ/CÓ/EÔFØ ×'Ñ'¨¨v¨Õ7ñ8ð $2ò B‘��iðBØ×*Ñ*¨4°ÀEÐ*ÔJà$×+Ñ+¨T°4¨LÕ9ð	Bô "×5Ñ5Ó7ˆØ�|‰|‹~ˆÜ×"Ñ" =°$Ð8HÔIÙð —Y‘YÐ2Ó3ô ×ÑØÐ:óäô ×.Ñ.¨w¸ÈÓVÐVøô] !ò 1Ü"-¨a£.–Kûð1ú÷m;	Fñ ;	Fûôj !ò BÜ# A›�AØ$×+Ñ+¨T°1¨IÔ6Ø'×.Ñ.¨q¯©Ó/@×AÒAûðBúsO   Â#DL)Æ2LÇ L)É 'L6Ì	L&ÌL!ÌL)Ì!L&Ì&L)Ì)L3Ì6	NÌ?=NÎNc                 óŽ  — |d   }| j                   }d}t        j                  |«      dk7  r| j                  t        d¬«       |j                  dd«      dk7  r| j                  t        d¬«       |j                  ||«      r| j                  t        d	¬«       |d
   j                  dd«      du rJ|j                  dd«      }|�6|j                  «       st        j                  t        d«       nt        |«      }|j                  t        j                  |«      |«      }|r|j                  s| j                  t         d¬«       | j#                  |d|«       |j%                  t        j&                  |«      «       |�0|j                  ||«      }|j)                  |j*                  |d¬«       t        j,                  ||t.        «      S )z}Handle MKCOL request to create a new collection.

        @see http://www.webdav.org/specs/rfc4918.html#METHOD_MKCOL
        rª   Nr   ú,The server does not handle any body content.rš   rC   r¬   rÐ   z.MKCOL can only be executed on an unmapped URL.rB   Úhonor_mtime_headerFTÚHTTP_X_OC_MTIMEúInvalid X-OC-Mtime header.z&Parent must be an existing collection.rÓ   )r0   r   Úget_content_lengthrS   r   rº   r	   Úexistsr   rN   Úisdigitri   rœ   r¹   Úget_uri_parentÚis_collectionr
   r‹   Úcreate_collectionÚget_uri_nameÚset_last_modifiedrÃ   rn   r   )	r9   rY   rZ   rÃ   r[   ÚmtimeÚmtime_headerÚ	parentResÚ
createdRess	            r;   Údo_MKCOLzRequestServer.do_MKCOL!  s¥  € ð
 �{Ñ#ˆØ×$Ñ$ˆØˆô ×"Ñ" 7Ó+¨qÒ0Ø�J‰JÜ,ØKð ô ð ×Ñ˜l¨CÓ0°CÒ7Ø�J‰JÔ'Ð6JˆJÔKà�?‰?˜4 Ô)Ø�J‰JÜ'ØMð ô ð Ð#Ñ$×(Ñ(Ð)=¸uÓEÈÑMØ"Ÿ;™;Ð'8¸$Ó?ˆLØÐ'Ø#×+Ñ+Ô-Ü—I‘IÔ.Ð0LÕMä Ó-�Eà×.Ñ.¬t×/BÑ/BÀ4Ó/HÈ'ÓRˆ	Ù 	× 7Ò 7Ø�J‰JÜÐ,Tð ô ð 	×$Ñ$ Y°°WÔ=à×#Ñ#¤D×$5Ñ$5°dÓ$;Ô<ØÐØ!×3Ñ3°D¸'ÓBˆJØ×(Ñ(¨¯©¸%ÈÐ(ÔOä×(Ñ(¨°.Ä,ÓOÐOr=   c                 ó.   — | j                  t        «       y)z‚
        @see http://www.webdav.org/specs/rfc4918.html#METHOD_POST
        @see http://stackoverflow.com/a/22606899/19166
        N)rS   r   ©r9   rY   rZ   s      r;   Údo_POSTzRequestServer.do_POSTW  s   € ð
 	�
‰
Ô*Õ+r=   c                 óœ  — |d   }| j                   }|j                  ||«      }t        j                  |«      dk7  r| j	                  t
        d¬«       |€| j	                  t        |¬«       |j                  r-|j                  dd«      dk7  rC| j	                  t        d¬«       n+|j                  dd	«      d
vr| j	                  t        d¬«       | j                  ||«       |j                  t        j                  |«      |«      }|r| j                  |d	|«       n| j                  |d	|«       g }	 |j                  «       }|dv st        |«      t        u sJ ‚t        |«      t        u r|}d}|r| j'                  |||t(        |«      S |j+                  d|d   d¬«      }
|j                  rk|j-                  «       r[d}|
D ](  }	 | j                  ||«       | j                  |d	|«       Œ* |s*	 |j/                  «       }| j'                  |||t(        |«      S i }|
D ]¸  }|j0                  |v rFt2        j5                  d|j0                  › d�«       d|t        j                  |j0                  «      <   ŒW	 | j                  ||«       | j                  |d	|«       |j/                  «        |j7                  |j0                  |«      rt9        t:        d«      ‚Œº | j'                  |||t(        |«      S # t         $ r)}	|j#                  «       t%        |	«      fg}d}Y d}	~	�Œ®d}	~	ww xY w# t         $ r d}Y  �ŒHw xY w# t         $ r'}	|j#                  «       t%        |	«      fg}Y d}	~	�Œdd}	~	ww xY w# t8        $ rW}	|j=                  |j#                  «       t%        |	«      f«       d|t        j                  |j0                  «      <   Y d}	~	�Œªd}	~	ww xY w)zN
        @see: http://www.webdav.org/specs/rfc4918.html#METHOD_DELETE
        rª   r   ræ   rš   NrC   r«   z2Only Depth: infinity is supported for collections.r¬   ©r¬   r«   z<Only Depth: 0 or infinity are supported for non-collections.©TFT)Údepth_firstrƒ   rµ   Fz	Skipping z (contains error child)Ú zResource could not be deleted.)r0   r¹   r   rê   rS   r   r   rî   rº   r	   r¨   rí   r‹   Úhandle_deleteÚtypeÚlistr×   rp   r   r~   r   r¿   Úsupport_recursive_deleteÚdeleterÃ   rL   Údebugrë   r   r   r    )r9   rY   rZ   rÃ   r[   r`   rô   ry   Úhandledr|   Úreverse_child_istÚhas_conflictsÚ	child_resÚignore_dicts                 r;   Ú	do_DELETEzRequestServer.do_DELETE^  sÝ  € ð �{Ñ#ˆØ×$Ñ$ˆØ×(Ñ(¨¨wÓ7ˆô ×"Ñ" 7Ó+¨qÒ0Ø�J‰JÜ,ØKð ô ð ˆ;Ø�J‰J”~°DˆJÔ9à×Òð ×!Ñ! ,°
Ó;¸zÒIØ—
‘
Ü$Ø!Uð õ ð
 ×!Ñ! ,°Ó4Ð<MÑMØ—
‘
Ü$Ø!_ð ô ð
 	×!Ñ! # wÔ/ð ×.Ñ.¬t×/BÑ/BÀ4Ó/HÈ'ÓRˆ	Ùà×(Ñ(¨°C¸ÕAð ×(Ñ(¨¨c°7Ô;ð
 ˆ
ð	Ø×'Ñ'Ó)ˆGØ˜mÑ+¬t°G«}ÄÑ/DÐDÐDÜ�G‹}¤Ñ$Ø$�
Ø�ñ Ø×&Ñ&Ø˜¨¬o¸zóð ð  ×/Ñ/Ø G¨LÑ$9ÀDð 0ó 
Ðð ×Ò ×!=Ñ!=Ô!?Ø!ˆMØ.ò �	ðØ×-Ñ-¨i¸ÔAØ×0Ñ0°¸CÀÕIðñ !ðDØ!$§¡£�Jð ×*Ñ*Ø˜^¨S´/À:óð ð ˆØ*ò 	HˆIØ�~‰~ Ñ,Ü—‘ 	¨)¯.©.Ð)9Ð9PÐQÔRØCE�œD×/Ñ/°	·±Ó?Ñ@ØðHð ×)Ñ)¨)°WÔ=Ø×,Ñ,¨Y¸¸WÔEØ× Ñ Ô"à—?‘? 9§>¡>°7Ô;Ü"Ü+Ð-Móð ð <ð	Hð. ×"Ñ"Ø�^ S¬/¸:ó
ð 	
øô} ò 	ØŸ<™<›>¬;°q«>Ð:Ð;ˆJØŽGûð	ûô, !ò Ø$(�MÛðûô !ò DØ#&§<¡<£>´;¸q³>Ð"BÐ!C–JûðDûô6 ò HØ×!Ñ! 9×#5Ñ#5Ó#7¼ÀQ»Ð"HÔIØCG�œD×/Ñ/°	·±Ó?×@ûðHús\   Ä3<K0 Ç%L%Ç/L8 É4A!M+Ë0	L"Ë9LÌL"Ì%L5Ì4L5Ì8	M(ÍM#Í#M(Í+	OÍ4AOÏOc              #   ó`   K  — 	 |d   j                  |«      }|dk(  rn
d|d<   |–— Œ$d|d<   y­w)zGet the data.ú
wsgi.inputr=   rl   zwsgidav.some_input_readúwsgidav.all_input_readN)Úread)r9   rY   r4   Úbufs       r;   Ú_stream_datazRequestServer._stream_dataÚ  sJ   è ø€ àØ˜,Ñ'×,Ñ,¨ZÓ8ˆCØ�cŠzØØ12ˆGÐ-Ñ.ØŠIð ð -.ˆÐ(Ò)ùs   ‚,.c                 óx  — |d   }| j                   }|j                  ||«      }|j                  t        j                  |«      |«      }|du }d}d|v rt        j                  t
        d«       d|v rt        j                  t        d«       |d   j                  dd	«      d
u rJ|j                  dd«      }	|	�6|	j                  «       st        j                  t        d«       nt        |	«      }|r$|j                  r| j                  t        d¬«       n%|�|j                  s| j                  t        d¬«       | j                  ||«       |r8| j                  |d|«       |j!                  t        j"                  |«      «      }n| j                  |d|«       | j%                  ||«      5  d	}
	 | j'                  || j(                  «      }|j+                  |j                  d«      ¬«      }t-        |dd«      r|j/                  |«       n|D ]  }|j1                  |«       Œ |j3                  «        |j7                  |
¬«       ddd«       d}|j=                  «       r&t?        |jA                  «       d
¬«      }|�	dd|› d�fg}|�|jC                  |jD                  |d	¬«       |rt        jF                  ||tH        |¬«      S t        jF                  ||tJ        |¬«      S # t4        $ rF}|j7                  d
¬«       t8        j;                  d«       t        j                  |«       Y d}~Œød}~ww xY w# 1 sw Y   ŒïxY w)zK
        @see: http://www.webdav.org/specs/rfc4918.html#METHOD_PUT
        rª   NÚHTTP_CONTENT_ENCODINGz)Content-encoding header is not supported.ÚHTTP_CONTENT_RANGEz4Content-range header is not allowed on PUT requests.rB   rç   FTrè   ré   zCannot PUT to a collectionrš   zPUT parent must be a collectionr¬   ÚCONTENT_TYPE)Úcontent_typeÚ
writelines)Úwith_errorszPUT: byte copy failedr‘   ÚETagú"rÓ   )Úadd_headers)&r0   r¹   r   rí   ri   r   r	   rN   rì   rœ   rî   rS   r   r
   r¨   r‹   Úcreate_empty_resourcerð   rŽ   r  r4   Úbegin_writerQ   r  ÚwriterK   r×   Ú	end_writerL   Ú	exceptionÚsupport_etagr   r�   rñ   rÃ   rn   r   r   )r9   rY   rZ   rÃ   r[   r`   rô   Ú	isnewfilerò   ró   Ú	hasErrorsÚdata_streamÚfileobjÚdatar|   Úheadersr¤   s                    r;   Údo_PUTzRequestServer.do_PUTä  s  € ð �{Ñ#ˆØ×$Ñ$ˆØ×(Ñ(¨¨wÓ7ˆØ×.Ñ.¬t×/BÑ/BÀ4Ó/HÈ'ÓRˆ	à˜4�Kˆ	Øˆð # gÑ-Ü�I‰IÔ*Ð,WÔXð   7Ñ*Ü�I‰IÜ Ð"Xôð Ð#Ñ$×(Ñ(Ð)=¸uÓEÈÑMØ"Ÿ;™;Ð'8¸$Ó?ˆLØÐ'Ø#×+Ñ+Ô-Ü—I‘IÔ.Ð0LÕMä Ó-�Eá�3×$Ò$Ø�J‰JÜ'Ð6Rð õ ð Ð Y×%<Ò%<à�J‰J”}Ð3TˆJÔUà×!Ñ! # wÔ/áØ×(Ñ(¨°C¸ÔAØ×1Ñ1´$×2CÑ2CÀDÓ2IÓJ‰Cà×(Ñ(¨¨c°7Ô;ð ×$Ñ$ S¨'Ó2ñ 	1ØˆIðØ"×/Ñ/°¸¿¹ÓI�àŸ/™/°w·{±{À>Ó7R˜/ÓS�ô ˜7 L°$Ô7Ø×&Ñ& {Õ3à +ò ,˜ØŸ™ dÕ+ð,ð —‘”ð �M‰M iˆMÔ0÷5	1ð8 ˆØ×ÑÔÜ §¡£¸4Ô@ˆDØÐØ" a¨ v¨Q KÐ0Ð1�àÐØ×!Ñ! #§(¡(¨E¸5Ð!ÔAáÜ×,Ñ,Ø˜¬À7ôð ô ×(Ñ(Ø�^¤_À'ô
ð 	
øô) ò Ø—‘¨$�Ô/Ü×!Ñ!Ð"9Ô:Ü—	‘	˜!—‘ûðú÷+	1ð 	1ús7   Æ(L0Æ,BKÈ0L0Ë	L-Ë'<L(Ì#L0Ì(L-Ì-L0Ì0L9c                 ó(   — | j                  ||d«      S )NF©Ú_copy_or_moverø   s      r;   Údo_COPYzRequestServer.do_COPYI  s   € Ø×!Ñ! '¨>¸5ÓAÐAr=   c                 ó(   — | j                  ||d«      S )NTr)  rø   s      r;   Údo_MOVEzRequestServer.do_MOVEL  s   € Ø×!Ñ! '¨>¸4Ó@Ð@r=   c                 ó<  ‡ — |d   }|d   }‰ j                   }|j                  ||«      }|j                  t        j                  |«      |«      }ˆ fd„}	|€‰ j	                  t
        |¬«       d|vr‰ j	                  t        d¬«       |j                  dd	«      d
vr‰ j	                  t        d¬«       t        j                  |«      dk7  rH|d   j                  t        j                  |«      «      }
d|d<   t        j                  d|
dd ›d�«       |j                  rR|j                  dd«       |d   dvr‰ j	                  t        d¬«       |rU|d   dk7  rM‰ j	                  t        d¬«       n5|j                  dd«       |d   dvr‰ j	                  t        d¬«       d|d<   t        |d   «      }t        |d¬«      \  }}}}}}|j                  r|j                  d«      dz   }|r|j!                  «       nd}|d   j!                  «       }|j#                  dd«      j!                  «       }|r|j!                  «       nd}|d   j!                  «       }|j#                  d d«      j!                  «       }|r|||fvr‰ j	                  t$        d!¬«       n|r|||fvr‰ j	                  t$        d"¬«       t        j&                  |«      }|j)                  |«      \  }}||ur‰ j	                  t$        d#¬«       |j+                  |j,                  |j.                  z   dz   «      r&|t1        |j,                  |j.                  z   «      d }nw|j,                  rT|j+                  |j,                  dz   «      r6|}|t1        |j,                  «      d }t        j                  d$|› d%|› �«       n‰ j	                  t$        d#¬«       |j+                  d«      sJ ‚|j                  ||«      }|du}|j                  t        j                  |«      |«      }|r|j                  s‰ j	                  t2        d&¬«       ‰ j5                  ||«       ‰ j5                  ||«       |r(‰ j7                  |d|«       |r‰ j7                  |d|«       |s‰ j7                  |d|«       ‰ j7                  |d|«       ||k(  r‰ j	                  t8        d'¬«       n-t        j:                  ||«      r‰ j	                  t8        d(¬«       |r|d   d	k7  r‰ j	                  t<        d)¬«       g }t>        }|rt@        }	 |r|jC                  |«      }n|d   dk(  }|jE                  ||¬*«      }|d+v stG        |«      tH        u sJ ‚tG        |«      tH        u r|}d,}|r‰ jQ                  |||t@        |«      S |jS                  d,¬-«      }!t1        |«      }"t1        |«      }#|ré|s|j                  r|j                  s+t        jU                  d.|›�«       |jW                  «        d}n¤|jS                  d,d¬/«      }$|!D �%cg c]  }%|%jX                  ‘Œ }&}%t        jU                  d0|&› �«       |$D ][  }'t        jU                  d1|'› �«       |'jX                  |#d }(||(z   })|)|&vsŒ4t        jU                  d2|'› �«       |'jW                  «        Œ] |rq|j[                  |«      r`d}*|!D ]  }%	 ‰ j5                  |%|«       Œ |*sB	 t        jU                  d3|› d%|›�«       |j]                  |«      }‰ jQ                  |||||«      S i }+|!D ]»  },d}-|+j_                  «       D ]&  }.t        j:                  |.|,jX                  «      sŒ$d,}- n |-r$t        jU                  d4|,jX                  ›d5�«       Œd	 |,jX                  |"d }(||(z   }/‰ j5                  |,|«       |,ja                  |/|¬6«       |r|,j                  s|,jW                  «        Œ½ |rã|!dd }0|0je                  «        t        jU                  d7|+› �«       |0D ]™  },|,j                  sŒd}1|+j_                  «       D ]&  }.t        j:                  |,jX                  |.«      sŒ$d,}1 n |1r$t        jU                  d8|,jX                  ›d9�«       Œq	 t        jU                  d:|,› �«       |,jW                  «        Œ› t        jU                  d;|› �«       ‰ jQ                  |||||«      S # tJ        $ r1}  |	| «       |jM                  «       tO        | «      fg}d,}Y d} ~ �Œ’d} ~ ww xY wc c}%w # tJ        $ r}  |	| «       d,}*Y d} ~  �Œ\d} ~ ww xY w# tJ        $ r/}  |	| «       |jM                  «       tO        | «      fg}Y d} ~ �Œhd} ~ ww xY w# tJ        $ rL}  |	| «       d,|+|,jX                  <   |jc                  |,jM                  «       tO        | «      f«       Y d} ~ �Œ§d} ~ ww xY w# tJ        $ r=}  |	| «       |jc                  |jM                  «       tO        | «      f«       Y d} ~ �Œd} ~ ww xY w)<z�
        @see: http://www.webdav.org/specs/rfc4918.html#METHOD_COPY
        @see: http://www.webdav.org/specs/rfc4918.html#METHOD_MOVE
        zwsgidav.apprª   c                 ó¸   •— t        | t        «      r%‰j                  dk\  rt        j	                  d«       y‰j                  dk\  rt        j	                  d«       y)zGLog internal exceptions with stacktrace that otherwise would be hidden.é   Ú_debug_exceptionr"   N)rs   r   r2   rL   r  )r|   r9   s    €r;   r1  z5RequestServer._copy_or_move.<locals>._debug_exception\  sM   ø€ ä˜!œXÔ&Ø—=‘= AÒ%Ü×%Ñ%Ð&8Ô9ð ð —=‘= AÒ%Ü×%Ñ%Ð&8Ô9Ør=   Nrš   ÚHTTP_DESTINATIONz$Missing required Destination header.rD   ÚT)r3  ÚFzInvalid Overwrite header.r   r  rl   r  zIgnored copy/move  body: é2   z...rC   r«   rû   zInvalid Depth header.z4Depth header for MOVE collection must be 'infinity'.r¬   F)Úallow_fragmentsrm   rþ   zwsgi.url_schemeÚHTTP_X_FORWARDED_PROTOÚ	HTTP_HOSTÚHTTP_X_FORWARDED_HOSTzÀSource and destination must have the same scheme.
If you are running behind a reverse proxy, you may have to rewrite the 'Destination' header.
(See https://github.com/mar10/wsgidav/issues/183)z4Source and destination must have the same host name.z'Inter-realm copy/move is not supported.zRewrite DESTINATION path z -> z(Destination parent must be a collection.z#Cannot copy/move source onto itselfz$Cannot copy/move source below itselfz8Destination already exists and Overwrite is set to false)Údepth_infinityrü   T)rµ   zRemove dest before move: )rý   rµ   zcheck src_path_list: z"check unmatched dest before copy: z#Remove unmatched dest before copy: zRecursive move: zCopy: skipping z, because of parent error)Úis_movezDelete after move, ignore_dict=zDelete after move: skipping z, because of child errorzRemove collection after move: zErrorList: )3r0   r¹   r   rí   rS   r   r	   rº   rê   r  rL   Úinforî   r   r   ÚrstriprO   rN   r   Únormalize_pathÚresolve_providerrr   Ú
mount_pathÚ
share_pathro   r
   r¨   r‹   r   Úis_equal_or_child_urir   r   r   Úhandle_moveÚhandle_copyr   r  r×   rp   r   r~   r¿   r  r  rÃ   Úsupport_recursive_moveÚmove_recursiveÚkeysÚcopy_move_singler    Úreverse)2r9   rY   rZ   r;  Úwsgidav_appÚsrc_pathr[   Úsrc_resÚsrc_parent_resr1  ÚbodyÚhttp_destinationÚdest_schemeÚdest_netlocÚ	dest_pathÚ_dest_paramsÚ_dest_queryÚ
_dest_fragÚ
url_schemeÚ
fwd_schemeÚurl_hostÚfwd_hostÚ_dest_shareÚdest_providerÚ_prevÚdest_resÚdest_existsÚdest_parent_resry   rx   r  Ú
isInfinityr|   Úsrc_listÚsrc_root_lenÚdest_root_lenÚreverse_dest_listÚsÚsrc_path_listÚdresÚrel_urlÚspr  r	  ÚsresÚparent_errorÚ
ignorePathÚdpathÚreverse_src_listÚchild_errors2   `                                                 r;   r*  zRequestServer._copy_or_moveO  ss
  ø€ ð
 ˜mÑ,ˆØ˜;Ñ'ˆØ×$Ñ$ˆØ×,Ñ,¨X°wÓ?ˆØ!×3Ñ3Ü×Ñ Ó)¨7ó
ˆô	ð ˆ?Ø�J‰J”~°HˆJÔ=Ø WÑ,Ø�J‰JÜ Ð/Uð ô ð ×ÑÐ.°Ó4¸JÑFà�J‰JÔ'Ð6QˆJÔRÜ×"Ñ" 7Ó+¨qÒ0ð
 ˜<Ñ(×-Ñ-¬d×.EÑ.EÀgÓ.NÓOˆDØ01ˆGÐ,Ñ-Ü�L‰LÐ4°T¸#¸2°Y°MÀÐEÔFà× Ò ð
 ×Ñ˜|¨ZÔ8Ø�|Ñ$Ð,=Ñ=Ø—
‘
Ô+Ð:Q�
ÔRÙ˜7 <Ñ0°JÒ>Ø—
‘
Ü$Ø!Wð õ ð ×Ñ˜|¨SÔ1Ø�|Ñ$Ð,=Ñ=Ø—
‘
Ô+Ð:Q�
ÔRØ$'ˆG�LÑ!ô # 7Ð+=Ñ#>Ó?Ðô Ð%°uÔ=ñ	
ØØØØØØð × Ò Ø!×(Ñ(¨Ó-°Ñ3ˆIá-8�k×'Ñ'Ô)¸bˆØÐ.Ñ/×5Ñ5Ó7ˆ
Ø—[‘[Ð!9¸2Ó>×DÑDÓFˆ
ñ .9�k×'Ñ'Ô)¸bˆà˜;Ñ'×-Ñ-Ó/ˆØ—;‘;Ð6¸Ó;×AÑAÓCˆá˜;¨z¸:Ð.FÑFØ�J‰JÜ ðDð õ ñ ˜[°¸8Ð0DÑDà�J‰JÜ ØSð ô ô
 ×'Ñ'¨	Ó2ˆ	Ø%0×%AÑ%AÀ)Ó%LÑ"ˆ�]Ø Ñ(Ø�J‰JÜ Ð/Xð ô ð ×Ñ × 3Ñ 3°h×6IÑ6IÑ IÈCÑ OÔPØ!¤# h×&9Ñ&9¸H×<OÑ<OÑ&OÓ"PÐ"RÐS‰Ið ×"Ò" y×';Ñ';¸H×<OÑ<OÐRUÑ<UÔ'VØ!�Ø%¤c¨(×*=Ñ*=Ó&>Ð&@ÐA�	ä—‘Ð8¸¸¸tÀIÀ;ÐOÕPà—
‘
Ü$Ø!Jð ô ð
 ×#Ñ# CÔ(Ð(Ð(ð ×-Ñ-¨i¸ÓAˆØ dÐ*ˆà"×4Ñ4Ü×Ñ 	Ó*¨Gó
ˆñ  o×&CÒ&CØ�J‰JÜÐ,Vð ô ð 	×!Ñ! '¨7Ô3Ø×!Ñ! (¨GÔ4ñ Ø×(Ñ(¨°*¸gÔFáØ×,Ñ,¨^¸SÀ'ÔJñ Ø×(Ñ(¨¸#¸wÔGà×$Ñ$ X¨z¸7ÔCà�yÒ Ø�J‰JÜÐ-Rð õ ô ×'Ñ'¨°)Ô<Ø�J‰JÜÐ-Sð ô ñ ˜7Ð#3Ñ4¸Ò;Ø�J‰JÜ(ØWð ô ð ˆ
Ü#ˆÙÜ*ˆLð	ÙØ!×-Ñ-¨iÓ8‘à$ \Ñ2°jÑ@�
Ø!×-Ñ-¨iÈ
Ð-ÓS�Ø˜mÑ+¬t°G«}ÄÑ/DÐDÐDÜ�G‹}¤Ñ$Ø$�
Ø�ñ
 Ø×&Ñ&Ø˜¨´/À:óð ð ×*Ñ*°DÐ*Ó9ˆä˜8“}ˆÜ˜I›ˆáÙ˜h×4Ò4¸G×<QÒ<Qô —‘Ð 9¸(¸ÐFÔGØ—‘Ô!Ø‘ð %-×$<Ñ$<Ø $¨uð %=ó %Ð!ð 2:Ö :¨A §£Ð :�Ð :Ü—‘Ð 5°m°_ÐEÔFØ-ò &�DÜ—M‘MÐ$FÀtÀfÐ"MÔNØ"Ÿi™i¨¨Ð7�GØ! GÑ+�BØ Ò.ÜŸ™Ð(KÈDÈ6Ð&RÔSØŸ™�ð&ñ �w×5Ñ5°iÔ@Ø!ˆMØò �ðØ×-Ñ-¨a°Õ9ðñ !ðHÜ—M‘MÐ$4°W°I¸TÀ)ÀÐ"OÔPØ!(×!7Ñ!7¸	Ó!B�Jð
 ×*Ñ*Ø˜^¨W°lÀJóð ð ˆàò %	EˆDà ˆLØ)×.Ñ.Ó0ò �
Ü×-Ñ-¨j¸$¿)¹)ÕDØ#'�LÙðñ Ü—‘ °·	±	¨}Ð<UÐVÔWØðEØŸ)™) L MÐ2�Ø! GÑ+�à×)Ñ)¨$°Ô8ð
 ×%Ñ% e°WÐ%Ô=ñ  4×#5Ò#5Ø—K‘K”Møð9%	EñP Ø'©˜{ÐØ×$Ñ$Ô&Ü�M‰MÐ;¸K¸=ÐIÔJØ(ò L�à×)Ò)Øà#�Ø"-×"2Ñ"2Ó"4ò �JÜ×1Ñ1°$·)±)¸ZÕHØ&*˜Ùðñ Ü—M‘MØ6°t·y±y°mÐC[Ð\ôð ðLÜ—M‘MÐ$BÀ4À&Ð"IÔJØ—K‘K•Mð%Lô. �M‰M˜K¨
 |Ð4Ô5ð ×"Ñ"Ø�^ W¨l¸Jó
ð 	
øô{ ò 	Ù˜QÔØ"×+Ñ+Ó-¬{¸1«~Ð>Ð?ˆJØŽGûð	üòH !;øô( !ò Ù$ QÔ'Ø$(�MÞûðûô !ò HÙ$ QÔ'Ø#*×#3Ñ#3Ó#5´{À1³~Ð"FÐ!G–JûðHûôf ò EÙ  Ô#Ø)-�˜DŸI™IÑ&ð
 ×!Ñ! 4§=¡=£?´KÀ³NÐ"C×DÒDûðEûôB !ò LÙ$ QÔ'Ø×%Ñ% w×'7Ñ'7Ó'9¼;Àq»>Ð&J×KÒKûðLús�   Ô&Ac Ø"dÛ
d Û!,e ÞAe=â(gã	dã'&dädä 	d?ä)
d:ä:d?å	e:å$e5å5e:å=	gæAgçgç	hç2hèhc           
      ó`	  — |d   }| j                   }|j                  ||«      }|j                  }|€| j                  t        d¬«       |r'|j                  «       r| j                  t        d¬«       |j                  dd«      dvr| j                  t        d	¬«       | j                  ||«       t        j                  |j                  d
d«      «      }|d   }t        j                  |d¬«      }	|	�€Ad|d<   |€| j                  t        d¬«       t        |«      dk7  r| j                  t        d¬«       n?|j                  |j!                  «       |d   «      s| j                  t"        dt$        ¬«       |j'                  |d   |¬«      }
|j)                  |
d   «      }|j                  ||«      }t+        j,                  «       }|j/                  d«      }|j1                  |«       t+        j2                  |«      } |dddt5        t        |«      «      fdt        j6                  «       fg«       |gS |	j8                  dk7  r| j                  t        «       d}d}t        j:                  d«      }|j                  dd«      }|	D ]²  }|j8                  dk(  r,|D ]&  }|j8                  dk(  rd }n|j8                  d!k(  rd"} Œ< Œ>|j8                  d#k(  r|D ]  }|j8                  d$k(  rd%} Œe Œg|j8                  d&k(  rt+        j2                  |d'¬(«      }ŒŽ| j                  t        d)|j8                  ›d*�¬«       Œ´ |s| j                  t        d+¬«       |s| j                  t        d,¬«       |j                  d-«      r	 d'}|€p|j                  t        j<                  |«      |«      }|r|j>                  s| j                  t@        d.¬«       |jC                  t        jD                  |«      «      }d}|jG                  |j!                  «       ||||||d/   |¬0«      }
t+        j,                  «       }|j/                  d«      }|j1                  |«       d}|rd1}t+        j2                  |«      }|
d2   } ||ddt5        t        |«      «      fd3d4|› d5�fdt        j6                  «       fg«       |gS )6zL
        @see: http://www.webdav.org/specs/rfc4918.html#METHOD_LOCK
        rª   Nz$This realm does not support locking.rš   z'This resource does not support locking.rC   r«   rû   z"Expected Depth: 'infinity' or '0'.ÚHTTP_TIMEOUTrþ   r�   Tr¯   r¬   z/LOCK refresh must specify an existing resource.rl   zAExpected a lock token (only one lock may be refreshed at a time).r   zLock token does not match URL.r®   )ÚtimeoutÚrootz{DAV:}lockdiscoveryrÕ   )úContent-Typezapplication/xml; charset=utf-8úContent-LengthÚDatez{DAV:}lockinfoz{DAV:}lockscopez{DAV:}exclusiveÚ	exclusivez{DAV:}sharedÚsharedz{DAV:}locktypez{DAV:}writer  z{DAV:}ownerF)ÚprettyzInvalid node ú.zMissing or invalid lockscope.zMissing or invalid locktype.rG   z"LOCK-0 parent must be a collectionr@   )r‚   Ú	lock_typeÚ
lock_scopeÚ
lock_depthÚ
lock_ownerrr  r…   r„   z201 Createdr™   z
Lock-Tokenú<ú>)$r0   r¹   r8   rS   r   Úprevent_lockingr   rº   r	   r¨   r   Úread_timeout_value_headerrN   r¼   ro   Úis_url_locked_by_tokenr†   r   r   ÚrefreshÚref_url_to_pathr   Úmake_prop_elemÚget_property_valuer    Úxml_to_bytesÚstrÚget_rfc1123_timer¾   Úto_bytesrí   rî   r
   r  rð   Úacquire)r9   rY   rZ   rÃ   r[   r`   r‰   Útimeout_secsÚsubmitted_token_listÚlockinfo_elr§   Ú	lock_pathÚlock_resÚprop_elÚlockdiscovery_elÚxmlr{  r|  r~  r}  ÚlinodeÚlsnodeÚltnodeÚcreatedNewResourcerô   ÚrespcodeÚ
lock_tokens                              r;   Údo_LOCKzRequestServer.do_LOCK¼  sä  € ð �{Ñ#ˆØ×$Ñ$ˆØ×(Ñ(¨¨wÓ7ˆØ×(Ñ(ˆàÐà�J‰JÜ$ØCð ô ñ �3×&Ñ&Ô(Ø�J‰JÜÐ-Vð ô ð ×Ñ˜l¨JÓ7Ð?PÑPØ�J‰JÜ Ð/Sð ô ð 	×!Ñ! # wÔ/ä×5Ñ5°g·k±kÀ.ÐRTÓ6UÓVˆØ&Ð'@ÑAÐä×)Ñ)¨'¸tÔDˆð Ñð %(ˆG�LÑ!àˆ{Ø—
‘
Ü$Ø!Rð ô ô Ð'Ó(¨AÒ-Ø—
‘
Ü$Ø!dð õ ð ×4Ñ4Ø—‘Ó!Ð#7¸Ñ#:ôð —
‘
Ü,Ø!AÜ"Eð ô ð ×#Ñ#Ð$8¸Ñ$;À\Ð#ÓRˆDð !×0Ñ0°°f±Ó>ˆIØ×1Ñ1°)¸WÓEˆHä×.Ñ.Ó0ˆGà'×:Ñ:Ð;PÓQÐØ�N‰NÐ+Ô,ô ×(Ñ(¨Ó1ˆCÙØàFØ%¤s¬3¨s«8£}Ð5ØœT×2Ñ2Ó4Ð5ðôð �5ˆLð �?‰?Ð.Ò.Ø�J‰JÔ'Ô(àˆ	Øˆ
Ü—]‘] 2Ó&ˆ
Ø×'Ñ'¨°jÓAˆ
à!ò 	ˆFØ�z‰zÐ.Ò.Ø$ò �FØ—z‘zÐ%6Ò6Ø%0™
ØŸ™ ~Ò5Ø%-˜
Ùñð —‘Ð/Ò/Ø$ò �FØ—z‘z ]Ò2Ø$+˜	Ùñð
 —‘˜}Ò,ä&×3Ñ3°FÀ5ÔI‘
ð —
‘
Ü$°]À6Ç:Á:À.ÐPQÐ3Rð õ ð'	ñ. Ø�J‰JÔ'Ð6UˆJÔVÙØ�J‰JÔ'Ð6TˆJÔUà�;‰;Ð,Ô-Øð #ÐØˆ;Ø ×2Ñ2´4×3FÑ3FÀtÓ3LÈgÓVˆIÙ I×$;Ò$;Ø—
‘
Ü!Ð0Tð ô ð ×1Ñ1´$×2CÑ2CÀDÓ2IÓJˆCØ!%Ðð
 ×ÑØ—‘Ó!ØØ!Ø!Ø!Ø ØÐ1Ñ2Ø+ð  ó 	
ˆô ×*Ñ*Ó,ˆà×1Ñ1Ð2GÓHÐØ�‰Ð'Ô(àˆÙØ$ˆHä×$Ñ$ WÓ-ˆØ˜'‘]ˆ
ÙØàBØ!¤3¤s¨3£x£=Ð1Ø  : ,¨aÐ0Ð1Øœ×.Ñ.Ó0Ð1ð	ô	
ð ˆuˆr=   c                 óê  — |d   }| j                   }| j                   j                  ||«      }|j                  }|€| j                  t        d¬«       net        j                  |«      dk7  r| j                  t        d¬«       n5|€| j                  t        |¬«       nd|vr| j                  t        d¬«       | j                  ||«       |d   j                  d«      }|j                  «       }|j                  ||«      s| j                  t        d	t        ¬
«       |j!                  ||d   «      s| j                  t"        d¬«       |j%                  |«       t        j&                  ||t(        «      S )zN
        @see: http://www.webdav.org/specs/rfc4918.html#METHOD_UNLOCK
        rª   z$This share does not support locking.rš   r   ræ   ÚHTTP_LOCK_TOKENzMissing lock token.z<>z Resource is not locked by token.r®   r@   z"Token was created by another user.)r0   r¹   r8   rS   r   r   rê   r   r   r	   r¨   Ústripr†   rƒ  r
   r   Úis_token_locked_by_userr   Úreleasern   r   )	r9   rY   rZ   rÃ   r[   r`   r‰   rš  rŠ   s	            r;   Ú	do_UNLOCKzRequestServer.do_UNLOCK’  sk  € ð �{Ñ#ˆØ×$Ñ$ˆØ×Ñ×1Ñ1°$¸Ó@ˆà×(Ñ(ˆØÐØ�J‰JÜ$ØCð õ ô ×$Ñ$ WÓ-°Ò2Ø�J‰JÜ,ØKð õ ð ˆ[Ø�J‰J”~°DˆJÕ9Ø gÑ-Ø�J‰JÔ'Ð6KˆJÔLà×!Ñ! # wÔ/àÐ.Ñ/×5Ñ5°dÓ;ˆ
Ø—/‘/Ó#ˆà×.Ñ.¨w¸
ÔCØ�J‰JÜØ?ÜAð ô ð ×/Ñ/Ø˜Ð 3Ñ4ô
ð
 �J‰JÜÐ-Qð ô ð
 	×Ñ˜Ô$ä×(Ñ(¨°.Ä/ÓRÐRr=   c                 ó®  — |d   }| j                   }|d   }t        j                  |dd¬«      }|j                  ||«      }d}|�|j	                  «       s|j
                  €d}dd	d
|fdt        j                  «       fg}	|dk(  }
|dk(  r+|j                  d«      }|rd}
nt        j                  d«       |
r |d|	«       dgS dg}|rc|j                  rW|j                  g d¢«       |j	                  «       �s|j                  g d¢«       |j
                  �í|j                  ddg«       nÙ|rw|j                  g d¢«       |j	                  «       s2|j                  g d¢«       |j
                  �|j                  ddg«       |j                  «       rr|	j                  d«       n`|j                  t        j                  |«      |«      r$|j	                  «       s+|j                  ddg«       n| j                  t         |¬«       |	j                  ddj#                  |«      f«       |d   j                  dd«      r|	j                  d «        |d|	«       dgS )!zJ
        @see http://www.webdav.org/specs/rfc4918.html#HEADER_DAV
        rª   rB   ÚhotfixesT)Úas_dictz1,2r­   )rt  ztext/html; charset=utf-8)ru  r¬   ÚDAVrv  Ú*rm   Útreat_root_options_as_asteriskzGot OPTIONS '/' requestrÕ   r=   r#   )r$   r%   r&   )r(   r)   r*   r,   r.   r/   )r'   r(   r)   r*   r,   ©zAccept-RangesÚbytesr'   r+   rš   ÚAllowz, Úadd_header_MS_Author_ViaF)zMS-Author-Viar¥  )r0   r   Úget_dict_valuer¹   r6   r8   rŠ  rN   rL   r<  rî   r7   Úsupport_rangesr    rí   rS   r   rÂ   )r9   rY   rZ   rÃ   r[   Úconfigr£  r`   Údav_compliance_levelr&  Úis_asterisk_optionsÚtreat_as_asteriskÚallows                r;   Ú
do_OPTIONSzRequestServer.do_OPTIONSÄ  sA  € ð �{Ñ#ˆØ×$Ñ$ˆØÐ)Ñ*ˆÜ×&Ñ& v¨zÀ4ÔHˆà×(Ñ(¨¨wÓ7ˆà$ÐØÐ˜x×3Ñ3Ô5¸×9NÑ9NÐ9VØ#&Ð ð 9Ø#ØÐ(Ð)Ø”T×*Ñ*Ó,Ð-ð	
ˆð # c™kÐØ�3Š;à (§¡Ð-MÓ NÐÙ Ø&*Ñ#ä—‘Ð6Ô7áñ ˜8 WÔ-Ø�5ˆLð �ˆÙ�3×$Ò$à�L‰LÒ4Ô5ð ×'Ñ'Õ)Ø—‘ÒDÔEð ×(Ñ(Ð4Ø—L‘L &¨(Ð!3Õ4Ùà�L‰LÒ4Ô5ð ×'Ñ'Ô)Ø—‘ÒKÔLð ×(Ñ(Ð4Ø—L‘L &¨(Ð!3Ô4Ø×!Ñ!Ô#Ø—‘Ð9Õ:Ø×#Ñ#¤D×$7Ñ$7¸Ó$=¸wÔGð ×'Ñ'Ô)Ø—‘˜e WÐ-Õ.à�J‰J”~°DˆJÔ9à�‰˜ §¡¨5Ó!1Ð2Ô3àÐ#Ñ$×(Ñ(Ð)CÀUÔKØ�N‰NÐ3Ô4á�x Ô)Øˆuˆr=   c                 ó&   — | j                  ||«      S )N©Ú_send_resourcerø   s      r;   Údo_GETzRequestServer.do_GET  s   € Ø×"Ñ" 7¨NÓ;Ð;r=   c                 ó*   — | j                  ||d¬«      S )NT©rf   rµ  rø   s      r;   Údo_HEADzRequestServer.do_HEAD  s   € Ø×"Ñ" 7¨NÈ4Ð"ÓPÐPr=   r¹  c          	   #   ó^  K  — |d   }| j                   j                  ||«      }t        j                  |«      dk7  r| j	                  t
        d|¬«       nm|j                  dd«      dk7  r| j	                  t        d|¬«       n?|€| j	                  t        ||¬«       n$|j                  r| j	                  t        d	|¬«       | j                  ||«       |j                  «       }|€d
}|j                  «       }|€d
}t        |j                  «       d¬«      }|€d}|j                  «        xs |j!                  «        xs |dk(  }	d|v rMd|v rI|	sG|d   }
t        j"                  |
«      }|rt%        |«      |k7  rd}	n|
j'                  d«      }
|�|
|k7  rd}	d}d|v rP|	sNd}t        j(                  |d   |«      \  }}t+        |«      dk(  r| j	                  t,        d|¬«       |d   \  }}}n	d|dz
  |}}}|j/                  «       }g }|j                  «       r|j1                  dt3        |«      f«       |j5                  «       r&|j1                  dt        j6                  |«      f«       |j1                  d|f«       |j1                  dt        j6                  «       f«       |j9                  «       r|j1                  dd|› d�f«       |j!                  «       r|j1                  d«       d|d   v r%|d   d   }|D ]  \  }}|j1                  ||f«       Œ |j;                  ||«       |r&|j1                  dd|› d|› d |› �f«        |d!|«       n	 |d"|«       |rd#–— y|j=                  «       }|	s|j?                  |«       |}	 	 |dk  s|| j@                  kD  r|jC                  | j@                  «      }n|jC                  |«      }t        jD                  |«      sJ ‚|–— |t+        |«      z  }t+        |«      dk(  s|dk(  rnŒ	 |jG                  «        y# |jG                  «        w xY w­w)$a&  
        If-Range
            If the entity is unchanged, send me the part(s) that I am missing;
            otherwise, send me the entire new entity
            If-Range: "737060cd8c284d8af7ad3082f209582d"

        @see: http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.27
        rª   r   ræ   )rc   rf   rC   r¬   zOnly Depth: 0 supported.Nz�Directory browsing is not enabled.(to enable it add WsgiDavDirBrowser to the middleware_stack option and set dir_browser.enabled = True option.)r�   Tr‘   r“   Ú
HTTP_RANGEÚHTTP_IF_RANGEz" FzNo valid ranges presentrl   ru  zLast-Modifiedrt  rv  r  r  r¨  Úresponse_headersrB   zContent-Rangezbytes ú-rm   z206 Partial ContentrÕ   r=   )$r0   r¹   r   rê   rS   r   rº   r	   r   rî   r   r¨   r›   r   r�   Úsupport_content_lengthr­  Úparse_time_stringrœ   rž  Úobtain_content_rangesro   r   Úget_content_typer    r‰  Úsupport_modifiedrŠ  r   Úfinalize_headersÚget_contentÚseekr4   r  Úis_bytesrK   )r9   rY   rZ   rf   rÃ   r`   Úfilesizer£   r¤   Údo_ignore_rangesÚif_rangeÚsecstimeÚis_partial_rangesÚlist_rangesÚ_totallengthÚrange_startÚ	range_endÚrange_lengthÚmimetyper¾  Úcustom_headersÚheaderrj   r$  ÚcontentlengthremainingÚ
readbuffers                             r;   r¶  zRequestServer._send_resource!  s“  è ø€ ð �{Ñ#ˆØ×Ñ×1Ñ1°$¸Ó@ˆä×"Ñ" 7Ó+¨qÒ0Ø�J‰JÜ,ØKØ-ð õ ð
 ×Ñ ¨cÓ2°cÒ9Ø�J‰JÜ Ø7Ø-ð õ ð
 ˆ[Ø�J‰J”~°DÈˆJÕXØ×ÒØ�J‰JÜðEð  .ð ô ð 	×!Ñ! # wÔ/à×)Ñ)Ó+ˆØÐØˆHà×-Ñ-Ó/ˆØÐ ØˆMä˜CŸL™L›N°tÔ<ˆØˆ<ØˆDð ×*Ñ*Ó,Ð,ò Ø×%Ñ%Ó'Ð'òà˜1‰}ð 	ð ˜GÑ#Ø 7Ñ*Ù$à˜Ñ/ˆHä×-Ñ-¨hÓ7ˆHÙä�}Ó%¨Ò1Ø'+Ñ$ð $Ÿ>™>¨$Ó/�Ø�< 8¨tÒ#3Ø'+Ð$à!ÐØ˜7Ñ"Ñ+;Ø $ÐÜ(,×(BÑ(BØ˜Ñ% xó)Ñ%ˆK˜ô �;Ó 1Ò$à—
‘
Ü.Ø!:Ø#1ð ô ð 6AÀ±^Ñ2ˆ[˜)¡\à67¸ÀA¹Àx \˜)ˆ[ð ×'Ñ'Ó)ˆàÐØ×%Ñ%Ô'à×#Ñ#Ð%5´s¸<Ó7HÐ$IÔJØ×ÑÔ!Ø×#Ñ#à#Ü×)Ñ)¨-Ó8ðôð 	×Ñ °Ð :Ô;Ø×Ñ ¬×)>Ñ)>Ó)@Ð AÔBØ×ÑÔØ×#Ñ# V¨q°°°a¨[Ð$9Ô:à×ÑÔØ×#Ñ#Ð$>Ô?à Ð)9Ñ!:Ñ:Ø$Ð%5Ñ6Ð7IÑJˆNØ!/ò 9‘�˜Ø ×'Ñ'¨°¨Õ8ð9ð 	×Ñ˜WÐ&6Ô7áØ×#Ñ#à#Ø˜[˜M¨¨9¨+°Q°x°jÐAðôñ Ð0Ð2BÕCá˜8Ð%5Ô6ñ ØŠIØà—/‘/Ó#ˆáØ�L‰L˜Ô%à!-Ðð	Øà*¨QÒ.Ø-°·±Ò?à!(§¡¨d¯o©oÓ!>‘Jà!(§¡Ð.DÓ!E�JÜ—}‘} ZÔ0Ð0Ð0Ø Ò Ø&¬#¨j«/Ñ9Ð&Ü�z“? aÒ'Ð+AÀQÒ+FØð ð ð �M‰MŒOØøð �M‰M�Oüs   ‚NP-ÎB P ÐP-ÐP*Ð*P-)Ú__name__Ú
__module__Ú__qualname__r<   rb   rS   r~   r‹   r   rŽ   r¨   rÎ   rä   rö   rù   r
  r  r'  r+  r-  r*  r›  r¡  r³  r·  rº  r¶  © r=   r;   r    r    /   s¸   „ òBò>Ið^ ØØØô
ò$ WòD
ð, ñó ðò0AòFbWòH{Wòz4Pòl,òz
òx.òc
òJBòAòk
òZoòl0SòdUòn<òQð INõ dr=   r    N)'Ú__doc__Ú
contextlibr   Úurllib.parser   r   Úwsgidavr   r   Úwsgidav.dav_errorr   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Úwsgidav.utilr   r   Ú__docformat__Úget_module_loggerrØ  rL   r3   r    rÛ  r=   r;   ú<module>rä     sa   ðñ
õ &ß *ç #÷÷ ÷ ÷ ÷ ó ÷, -à"€à
 ˆ$×
 Ñ
  Ó
*€àÐ ÷Vò Vr=   