I. Introduction▲
WebDAV (Web-based Distributed Authoring and Versioning) est une extension du protocole HTTP/1.1. Il permet de gérer des fichiers sur un serveur distant et comprend comme fonction principale : l'écriture, la lecture, le listage et le déplacement des ressources distantes.
Le protocole offre des avantages dans plusieurs aspects.
- Par rapport à un FTP, celui-ci est plus sécurisé. Possibilité d'encapsulation dans un canal sécurisé HTTPS/SSL, cryptage des mots de passe, et authentification Kerberos.
- Par rapport au système de fichiers Windows, le protocole peut gérer des chemins longs de plus de 255 caractères.
- Reposant sur le protocole HTTP, il peut utiliser les numéros de ports classiques ce qui évite toutes reconfigurations des firewalls.
Au cours de cet article, nous illustrerons l'implémentation des principales fonctions du protocole avec des exemples en VBScript sur un serveur WebDAV IIS (Information Internet Service).
On finira avec la problématique du codage HTML dans les URL et l'implémentation à faire.
II. Essentiel sur le protocole WebDAV▲
II-A. Les méthodes HTTP et WebDAV▲
Comme vu en introduction, WebDAV est une extension de HTTP implémentant des méthodes supplémentaires, comme l'écriture (PUT), la copie (COPY).
Vous trouverez ci-dessous la liste des principales méthodes HTTP possibles par un serveur WebDAV.
Méthodes |
Définitions |
OPTIONS |
Définit les options de communications |
GET |
Obtient une ressource |
HEAD |
Obtient uniquement les informations d'entête d'une ressource |
DELETE |
Supprime le fichier distant |
PUT |
Crée ou met à jour un fichier |
POST |
Obtient une ressource et transmet les données dans l'entête de la requête |
COPY |
Copie un fichier distant vers une autre destination côté serveur |
MOVE |
Déplace ou renomme un fichier distant |
MKCOL |
Crée un dossier distant |
PROPFIND |
Récupère les propriétés d'une ressource distante |
PROPPATCH |
Définit les propriétés d'une ressource distante |
LOCK |
Verrouille une ressource distante |
UNLOCK |
Déverrouille une ressource distante |
SEARCH |
Recherche des ressources à l'aide de requête SQL |
En plus de ces méthodes, on trouve aussi BCOPY, BDELETE, BMOVE, BPROPFIND, BPROPPATCH qui permettent les mêmes opérations, mais en travaillant avec plusieurs ressources à la fois.
Pour plus d'information :
http://msdn.microsoft.com/en-us/library/aa142917(EXCHG.65).aspx.
II-B. Les réponses HTTP et WebDAV▲
Comme HTTP, les réponses aux requêtes contiennent un statut se composant d'un code et d'une description. Le code de statut informe de l'état de la requête envoyée et peut être testé afin de prévoir les cas alternatifs comme l'échec de connexion, les redirections et autres (voir liste code retour).
Vous trouverez la liste des codes réponses HTTP et leurs descriptions à l'adresse suivante : http://fr.wikipedia.org/wiki/Liste_des_codes_HTTP.
On peut noter aussi que le protocole WebDAV a des codes de statut qui lui sont propres (voir liste ci-dessous) :
Code statut |
Statut |
Description |
---|---|---|
102 |
Processing |
Traitement WebDAV en cours |
207 |
Multistatus |
Réponse multiple |
210 |
Content Different |
La copie de la ressource cotée client diffère de celle du serveur |
422 |
Unprocessable entity |
L'entité fournie avec la requête est incompréhensible ou incomplète. |
423 |
Locked |
L'opération ne peut avoir lieu, car la ressource est verrouillée. |
424 |
Method failure |
Une méthode de la transaction a échoué |
507 |
Insufficient storage |
Espace insuffisant pour modifier les propriétés ou construire la collection |
Extrait de la référence Wikipédia (détail dans le lien ci-dessus)
II-C. Interprétation des codes HTML▲
Lorsqu'un nom de fichier est converti en URL, les caractères spéciaux ou étendus doivent être convertis en code HTML.
Vous trouverez ci-dessous une liste des codes caractères utilisés par les serveurs WebDAV. Cette liste ne représente qu'une partie de tous les codes internationaux gérés par Unicode.
Table des codes caractères :
Code HTML |
Code ASCII étendu |
Code HTML |
Code ASCII étendu |
Code HTML |
Code ASCII étendu |
%20 |
(espace) |
%C3%A1 |
A |
%C3%8F |
Ï |
%25 |
% |
%C3%AD |
í |
%C3%8C |
Ì |
%C3%87 |
Ç |
%C3%B3 |
ó |
%C2%AF |
¯ |
%C3%BC |
Ü |
%C3%BA |
ú |
%C3%93 |
Ó |
%C3%A9 |
é |
%C3%B1 |
ñ |
%C3%9F |
ß |
%C3%A2 |
â |
%C3%91 |
Ñ |
%C3%94 |
Ô |
%C3%A4 |
ä |
%C2%AA |
ª |
%C3%92 |
Ò |
%C3%A0 |
à |
%C2%BA |
º |
%C3%B5 |
Õ |
%C3%A5 |
å |
%C2%BF |
¿ |
%C3%95 |
Õ |
%C3%A7 |
ç |
%C2%AC |
v |
%C2%B5 |
µ |
%C3%AA |
ê |
%C2%BD |
½ |
%C3%BE |
Þ |
%C3%AB |
ë |
%C2%BC |
¼ |
%C3%9E |
Þ |
%C3%A8 |
è |
%C2%A1 |
¡ |
%C3%9A |
Ú |
%C3%AF |
ï |
%C2%AB |
« |
%C3%9B |
Û |
%C3%AE |
î |
%C2%BB |
» |
%C3%99 |
Ù |
%C3%AC |
ì |
%C3%81 |
Á |
%C3%BD |
Ý |
%C3%84 |
Ä |
%C3%82 |
 |
%C3%9D |
Ý |
%C3%85 |
Å |
%C3%80 |
À |
%C2%B4 |
´ |
%C3%89 |
É |
%C2%A9 |
© |
%C2%B1 |
± |
%C3%A6 |
Æ |
%C2%A2 |
¢ |
%C2%BE |
¾ |
%C3%86 |
Æ |
%C2%A5 |
¥ |
%C2%B6 |
¶ |
%C3%B4 |
Ô |
%C3%A3 |
ã |
%C2%A7 |
§ |
%C3%B6 |
Ö |
%C3%83 |
à |
%C3%B7 |
÷ |
%C3%B2 |
Ò |
%C2%A4 |
¤ |
%C2%B8 |
¸ |
%C3%BB |
Û |
%C3%B0 |
ð |
%C2%B0 |
° |
%C3%B9 |
Ù |
%C3%90 |
Ð |
%C2%A8 |
¨ |
%C3%BF |
? |
%C3%8A |
Ê |
%C2%B7 |
? |
%C3%96 |
Ö |
%C3%8B |
Ë |
%C2%B9 |
¹ |
%C3%9C |
Ü |
%C3%88 |
È |
%C2%B3 |
³ |
%C2%A5 |
¥ |
%C3%8D |
Í |
%C2%B2 |
² |
%C2%A3 |
£ |
%C3%8E |
Î |
%C2%A6 |
¦ |
%C6%92 |
? |
%C5%92 |
? |
%C2%AE |
® |
À présent, implémentons nos fonctions de conversions.
III. l'Implémentation▲
III-A. Conversions des URL HTML▲
Voici deux méthodes pouvant être implémentées. Ce code est montré à titre d'exemple. Dans le traitement d'un grand nombre de chaines URL ou chemin, il est conseillé d'utiliser une expression régulière afin de convertir uniquement les codes présents dans la chaine URL ou Pathx.
'Convertir les chemins URL HTTP en chemin FS
Public
Function
HTTPDecodeToRelativePath
(
Url)
Dim
CvtUrl
CvtUrl =
Replace
(
Url, "/"
, "\"
)
CvtUrl =
Replace
(
CvtUrl, "%C3%A9"
, "é"
)
CvtUrl =
Replace
(
CvtUrl, "%20"
, " "
)
CvtUrl =
Replace
(
CvtUrl, "%25"
, "%"
) ' A convertir en dernier !
HTTPDecodeToRelativePath =
CvtUrl
End
Function
'Convertit les chemins FS vers URL
Public
Function
HTTPEncodeToPath
(
Pathx)
Dim
CvtPath
'% -> %25 doit être fait en premier afin
'de ne pas convertir les % du codage HTML
'Remplace % par son code avant de place des codes %XX
CvtPath =
Replace
(
Pathx, "%"
, "%25"
)
CvtPath =
Replace
(
CvtPath, "é"
, "%C3%A9"
)
CvtPath =
Replace
(
CvtPath, " "
, "%20"
)
CvtPath =
Replace
(
CvtPath, "\"
, "/"
)
HTTPEncodeToPath =
CvtPath
End
Function
III-B. Lecture d'une collection WebDAV parcourir un dossier)▲
Le parcours d'un répertoire distant se fait avec une méthode GET en HTTP au niveau de la requête Web.
III-B-1. Les bibliothèques HTTP▲
Pour ce faire, en VBScript, on utilise l'ActiveX XMLHTTP fourni par Microsoft. On initialise une requête via la classe présente dans « Microsoft.XMLHTTP », puis on crée la requête avec la méthode Open. La requête est envoyée au serveur via la méthode send.
Set
HttpWebRequest =
CreateObject
(
"Microsoft.XMLHTTP"
)
HttpWebRequest.Open
"GET"
, Url, False
HttpWebRequest.send
La méthode Open possède au total cinq arguments :
oXMLHttpRequest.open
(
bstrMethod, bstrUrl, varAsync, bstrUser, bstrPassword)
bstrMethod |
La méthode HTTP utilisée (GET, POST, etc.). |
bstrUrl |
L'URL cible de la ressource |
varAsync (optionnel) |
Active le mode asynchrone via l'événement onreadystatechange. Au cours de cet article, on travaillera en mode synchrone. |
bstrUser (optionnel) |
Renseigne l'utilisateur |
bstrPassword (optionnel) |
Renseigne le mot de passe |
III-B-2. L'authentification▲
Dans le cas d'un serveur sécurisé par authentification, il a renseigné l'identifiant et le mot de passe qui sera contenu dans la requête transmise.
HttpWebRequest.Open "GET", Url, False, sUserName, sPassword
HttpWebRequest.send
III-C. Réponses HTML▲
La requête GET est transmise au serveur qui renvoie ensuite un flux HTML contenant des liens <a href=""> (voir exemple ci-dessous) :
<HTML>
<head>
<meta HTTP-equiv
=
"Content-Type"
content
=
"text/HTML; charset=UTF-8"
>
<title>workflow - /testwebdav/</title>
</head>
<body>
<h1>
workflow - /testwebdav/</h1>
<hr>
<pre>
<a href
=
"/"
>
[Vers le répertoire parent]</a>
<br><br> mercredi 30 juillet 2008 11:17 <
rép>
<a href
=
"/testwebdav/Log/"
>
Log</a>
<br> mardi 29 juillet 2008 17:01 132
<hr>
</body>
</HTML>
III-D. Récupérations des liens avec expressions régulières▲
La récupération des liens peut se faire à l'aide d'une expression régulière qu'on applique sur le flux contenu dans sResponse :
Dim
mainMatches
Dim
linkRegExp
Set
linkRegExp =
New
RegExp
linkRegExp.IgnoreCase
=
True
linkRegExp.MultiLine
=
True
linkRegExp.Global
=
True
linkRegExp.Pattern
=
"<A\b[^>]*>(.*?)</A>"
Set
mainMatches =
linkRegExp.Execute
(
sResponse)
III-E. Parcours du dossier WebDAV▲
Cela donne pour le parcours complet d'un dossier :
Public
Sub
ParcourirLiens
(
CourantHREF, sUserName, sPassword)
Dim
sResponse
Dim
HttpWebRequest
Set
HttpWebRequest =
CreateObject
(
"Microsoft.XMLHTTP"
)
HttpWebRequest.Open
"GET"
, ServerUrl &
CourantHREF, False
, _
sUserName, sPassword 'Se connecte a l'URL avec identifiant et mot de passe
HttpWebRequest.send
'Envoie la requête
sResponse =
HttpWebRequest.ResponseText
' Réponse serveur
'Récupère les liens du flux avec une expression régulière
Dim
mainMatches
Dim
linkRegExp
Set
linkRegExp =
New
RegExp
linkRegExp.IgnoreCase
=
True
linkRegExp.MultiLine
=
True
linkRegExp.Global
=
True
linkRegExp.Pattern
=
"<A\b[^>]*>(.*?)</A>"
Set
mainMatches =
linkRegExp.Execute
(
sResponse)
Dim
linkMatch
'Parcourt les liens
For
Each
linkMatch In
mainMatches
Dim
strLink
strLink =
linkMatch.Value
Next
Set
HttpWebRequest =
Nothing
End
Sub
III-F. Création/mise à jour d'un fichier▲
La mise à jour et la création d'un nouveau fichier se fait grâce à la méthode PUT.
Avant envoi, le fichier à transmettre doit être lu puis stocké dans un tableau d'octets.
Pour ce travail, on va implémenter une méthode getFileBytes pour lire le flux et le retourner.
'Obtient les données d'un fichier en local
'Fichier : Nom du fichier
'retourne un tableau d'octets
Function
getFileBytes
(
Fichier)
Dim
objStream
Set
objStream =
CreateObject
(
"ADODB.Stream"
)
objStream.Type
=
1
' adTypeBinary
objStream.Open
objStream.LoadFromFile
Fichier
getFileBytes =
objStream.Read
objStream.Close
Set
objStream =
Nothing
End
Function
Puis on transmet le tableau de Bytes de la fonction dans le flux de la requête.
Le serveur renvoie le code 200 (OK) lorsque le fichier est mis à jour. Si le fichier n'existe pas alors celui-ci est créé et le serveur renvoie le code 201 (Created).
'Crée ou met à jour un fichier sur le serveur WebDAV
'URL : Cible HTTP
'sUser : Renseigne l'utilisateur (vide si pas d'auth)
'sPassword : Renseigne le mot de passe (vide si pas d'auth)
'Retourne le code status HTTP - 200 pour OK (pour la mise a jour) ou 201 pour Created (répertoire créé)
Public
Function
MettreAJour
(
Fichier, URL, sUser, sPassword)
Dim
xmlhttp
Dim
bSucess
Dim
iStatus
Dim
sStatus
Dim
sResponse
Dim
Data
'Obtient les données du fichier
Data =
getFileBytes
(
Fichier)
Set
xmlhttp =
CreateObject
(
"Microsoft.XMLHTTP"
)
'Se connecte en mode synchrone
If
sUser <>
""
Then
xmlhttp.Open
"PUT"
, URL, False
, sUser, sPassword 'Avec authentification
Else
xmlhttp.Open
"PUT"
, URL, False
'Sans authentification
End
If
xmlhttp.send
Data ' Envoie le flux du fichier
bSucess =
False
iStatus =
xmlhttp.Status
sStatus =
xmlhttp.statusText
If
(
iStatus =
200
) Or
(
iStatus =
201
) Then
wscript.echo
"PUT: OK Results = "
&
iStatus &
": "
&
sStatus
bSucess =
True
ElseIf
iStatus =
401
Then
wscript.echo
"PUT WEBDAV: Vous n'avez pas les permissions requises ! Contactez l'administrateur du système"
Else
wscript.echo
"PUT: Echec Results = "
&
iStatus &
": "
&
sStatus
End
If
Set
xmlhttp =
Nothing
'Retourn le status
MettreAJour =
iStatus
End
Function
III-G. Création d'un répertoire distant▲
La création de répertoires web se fait avec la méthode MKCOL, le nom du répertoire est renseigné directement par l'URL.
Le serveur nous renvoie, en réponse, le code statut 201 (Created) en cas de succès.
'Création d'un répertoire WebDAV
'Url : Cible HTTP
'sUser : Renseigne l'utilisateur (vide si pas d'auth)
'sPassword : Renseigne le mot de passe (vide si pas d'auth)
'Retourne le code status HTTP - 201
Private
Function
CreerDossierWebDAV
(
Url, sUser, sPassword)
Dim
xmlhttp 'As New MSXML2.XMLHTTP30
Dim
bSucess 'As Boolean
Dim
iStatus 'As Integer
Dim
sStatus 'As String
Dim
sResponse 'As String
Dim
sReq
Set
xmlhttp =
CreateObject
(
"Microsoft.XMLHTTP"
)
'Se connecte en mode synchrone
If
sUser <>
""
Then
xmlhttp.Open
"MKCOL"
, Url, False
, sUser, sPassword 'Avec authentification
Else
xmlhttp.Open
"MKCOL"
, Url, False
'Sans authentification
End
If
xmlhttp.send
If
xmlhttp.Status
=
"201"
Then
wscript.echo
(
"Le répertoire a été créé. Status "
&
xmlhttp.statusText
)
Else
' Note: Error 405 can mean permissions problem on item already exists.
wscript.echo
(
"Le répertoire n'a pas été créé. Status "
&
xmlhttp.statusText
)
End
If
CreerDossierWebDAV =
xmlhttp.Status
End
Function
III-H. Lecture des propriétés d'une ressource WebDAV▲
Pour lire les propriétés d'une ressource, on envoie avec la méthode PROPFIND avec comme URL la cible dont les propriétés sont demandées. Dans le corps de message, on peut renseigner les propriétés que l'on désire recevoir.
Exemple de propriétés souhaitées pour un serveur IIS :
<
?xml version=\
"1.0\"
?>
<
d:propfind xmlns:d=
'DAV:'>
<
d:prop>
<
d:displayname/><
d:getcontentlength /><
d: creationdate />
<
d:getlastmodified /><
d:ishidden /><
d:iscollection />
</
d:prop>
</
d:propfind>
Dans le cas d'un autre type de serveur, certaines propriétés ne sont pas implémentées ou ont des noms différents. Pour plus d'information référez-vous à la documentation du protocole WebDAV propre pour ce type de serveur.
Ici on demande les propriétés displayname, getcontentlength, creationdate, getlastmodified, ishidden, et iscollection.
Description des propriétés :
displayname |
Nom affiché |
getcontentlength |
Taille du corps de message |
creationdate |
Date de création |
getlastmodified |
Date de la dernière mise à jour |
Ishidden |
Attribut fichier caché |
iscollection |
Dossier si vrai, sinon fichier |
L'envoi du corps de message permet de filtrer les propriétés à recevoir et réduire ainsi le trafic. Dans le cas d'une requête PROPFIND sans corps de message, toutes les propriétés disponibles sont reçues.
Voyons maintenant l'implémentation de la méthode PROPFIND au niveau de la requête.
Set
HttpWebRequest =
CreateObject
(
"Microsoft.XMLHTTP"
)
HttpWebRequest.Open
"PROPFIND"
, ServerUrl &
href, False
, sUserName, sPassword
HttpWebRequest.send
sResponse =
HttpWebRequest.ResponseText
' Retour le flux
Après réception de la requête HTTP, le serveur IIS nous transmet les propriétés de la ressource sous la forme XML (voir ci-dessous).
<?xml version="1.0"?>
<
a
:
multistatus
xmlns
:
b
=
"urn:uuid:c2f41010-65b3-11d1-a29f-00aa00c14882/"
xmlns
:
c
=
"xml:"
xmlns
:
a
=
"DAV:"
>
<
a
:
response>
<
a
:
href>
https://test.spie.com/sfr/Log-2008729113352.txt</
a
:
href>
<
a
:
propstat>
<
a
:
status>
HTTP/1.1 200 OK</
a
:
status>
<
a
:
prop>
<
a
:
getcontentlength
b
:
dt
=
"int"
>
0</
a
:
getcontentlength>
<
a
:
creationdate
b
:
dt
=
"dateTime.tz"
>
2008-08-20T09:44:04.690Z</
a
:
creationdate>
<
a
:
displayname>
Log-2008729113352.txt</
a
:
displayname>
<
a
:
getlastmodified
b
:
dt
=
"dateTime.rfc1123"
>
Wed, 20 Aug 2008 09:44:04 GMT</
a
:
getlastmodified>
<
a
:
resourcetype/>
<
a
:
supportedlock>
<
a
:
lockentry>
<
a
:
write/>
<
a
:
shared/>
</
a
:
lockentry>
<
a
:
lockentry>
<
a
:
write/>
<
a
:
exclusive/>
</
a
:
lockentry>
</
a
:
supportedlock>
<
a
:
ishidden
b
:
dt
=
"boolean"
>
0</
a
:
ishidden>
<
a
:
iscollection
b
:
dt
=
"boolean"
>
0</
a
:
iscollection>
<
a
:
getcontenttype/>
</
a
:
prop>
</
a
:
propstat>
</
a
:
response>
</
a
:
multistatus>
III-H-1. bibliothèques XML▲
Sous VBScript, la lecture de flux XML peut se faire avec la bibliothèque MSXML fournie par Microsoft et présent sur la plupart des plateformes Windows.
Pour plus d'informations sur comment obtenir la bibliothèque : http://www.microsoft.com/downloads/details.aspx?FamilyID=3144B72B-B4F2-46DA-B4B6-C5D7485F2B42&displaylang=fr
Set
xmlDoc =
CreateObject
(
"MSXML2.DOMDocument.4.0"
)
xmlDoc.validateOnParse
=
True
xmlDoc.async
=
False
xmlDoc.resolveExternals
=
True
xmlDoc.setProperty
"SelectionLanguage"
, "XPath"
xmlDoc.setProperty
"SelectionNamespaces"
, "xmlns:wd='DAV:'"
'lecture du flux xml
xmlDoc.LoadXml
(
sResponse)
Dans tous les cas, on utilise XPath comme langage de sélection de nœuds. Pour la navigation dans les nœuds, on doit spécifier un alias et un namespace de correspondance.
L'alias et le namespace mappé, le requêtage XPath pourra fonctionner.
Dans notre cas l'alias est 'wd' ; les requêtes se feront sous la forme « /wd:NomDuNœudPrincipal/wd:NomDuNœudEnfant ».
Sous VBScript, on définit la propriété avec « SelectionNamespaces » sous la forme xmlns:wd='DAV:'. 'wd' est l'alias et 'DAV:' le namespace à utiliser.
À présent implémentons la fonction de récupération GetProps avec le filtrage des propriétés.
'Récupère les informations essentielles du lien
'href : lien vers la ressource WebDAV
'sUserName : Renseigne l'utilisateur (vide si pas d'auth)
'sPassword : Renseigne le mot de passe (vide si pas d'auth)
Public
Sub
GetProps
(
href, sUserName, sPassword)
Dim
sResponse
Dim
HttpWebRequest
Dim
xmlDoc
Dim
Conf
Dim
defhref
Dim
propConf
Dim
displayName 'Nom du fichier à l'écran
Dim
fileLength 'taille du fichier distant
Dim
creationDate 'Date de création du fichier
Dim
lastmodified 'Date de modification du fichier
Dim
isHidden 'Attribut fichier masqué
Dim
isFolder 'Est un dossier ou fichier?
Dim
strBody
' flux xml avec les propriétés à récupérer
strBody =
"<?xml version=""1.0""?><d:propfind xmlns:d='DAV:'><d:prop>`"
&
_
"<d:displayname/><d:getcontentlength /><d:creationdate />"
&
_
"<d:getlastmodified /><d:ishidden /><d:iscollection /></d:prop></d:propfind>"
Set
HttpWebRequest =
CreateObject
(
"Microsoft.XMLHTTP"
)
'Se connecte en mode synchrone
HttpWebRequest.Open
"PROPFIND"
, href, False
, sUserName, sPassword
HttpWebRequest.SetRequestHeader
"Content-type:"
, "text/xml"
HttpWebRequest.SetRequestHeader
"Depth"
, "1"
HttpWebRequest.send
strBody
'207 pour Multi Status
If
HttpWebRequest.Status
=
"207"
Then
sResponse =
HttpWebRequest.ResponseText
' Retour le flux
Set
xmlDoc =
CreateObject
(
"MSXML2.DOMDocument.4.0"
)
xmlDoc.validateOnParse
=
False
xmlDoc.async
=
False
xmlDoc.resolveExternals
=
True
xmlDoc.setProperty
"SelectionLanguage"
, "XPath"
xmlDoc.setProperty
"SelectionNamespaces"
, "xmlns:wd='DAV:'"
'lecture du flux xml
If
xmlDoc.LoadXml
(
sResponse) Then
'/wd:multistatus/
Set
Conf =
xmlDoc.selectSingleNode
(
"/wd:multistatus/wd:response"
)
defhref =
Conf.selectSingleNode
(
"wd:href"
).Text
'récupération des propriétés du lien
Set
propConf =
Conf.selectSingleNode
(
"wd:propstat/wd:prop"
)
displayName =
propConf.selectSingleNode
(
"wd:displayname"
).Text
fileLength =
propConf.selectSingleNode
(
"wd:getcontentlength"
).Text
creationDate =
propConf.selectSingleNode
(
"wd:creationdate"
).Text
lastmodified =
propConf.selectSingleNode
(
"wd:getlastmodified"
).Text
'Propre à IIS
'isHidden = propConf.selectSingleNode("wd:ishidden").Text
'isFolder = propConf.selectSingleNode("wd:iscollection").Text
wscript.echo
"propriété de "
&
href
wscript.echo
"displayName "
&
displayName
wscript.echo
"fileLength "
&
fileLength
wscript.echo
"creationDate "
&
creationDate
wscript.echo
"lastmodified "
&
lastmodified
'Propre à IIS
'wscript.echo "isHidden " & isHidden
'wscript.echo "iscollection " & isFolder
End
If
Set
xmlDoc =
Nothing
End
If
End
Sub
III-I. La suppression d'une ressource distante▲
La suppression se fait avec la méthode DELETE. La ressource à supprimer est directement spécifiée dans l'URL cible de la requête HTTP. La fonction marche aussi bien avec un dossier ; ex. : « http://site/mondossier/ » qu'un fichier « http://site/mondossier/fichier.txt ».
Le serveur renvoie le code réponse 200 (OK) lorsque le fichier est supprimé.
'Supprime une ressource du serveur WebDAV. La ressource peut être un fichier ou un dossier
'URL : Cible HTTP
'sUser : Renseigne l'utilisateur (vide si pas d'auth)
'sPassword : Renseigne le mot de passe (vide si pas d'auth)
'Retourn le code status HTTP - 200 pour OK ou 204 pour certain serveur autre que IIS
Private
Function
DeleteResourceWebDAV
(
URL, sUser, sPassword)
Dim
xmlhttp
Dim
bSucess
Dim
iStatus
Dim
sStatus
Dim
sResponse
Dim
sReq
Set
xmlhttp =
CreateObject
(
"Microsoft.XMLHTTP"
)
'Se connecte en mode synchrone
If
sUser <>
""
Then
xmlhttp.Open
"DELETE"
, Url, False
, sUser, sPassword 'Avec authentification
Else
xmlhttp.Open
"DELETE"
, Url, False
'Sans authentification
End
If
xmlhttp.send
If
xmlhttp.Status
=
"200"
Or
xmlhttp.Status
=
"204"
Then
wscript.echo
(
"Suppression "
&
URL &
". Status "
&
xmlhttp.statusText
)
Else
' Note: Error 405 can mean permissions problem on item already exists.
wscript.echo
(
"Échec lors de la suppression de "
&
URL &
". Status "
&
xmlhttp.statusText
)
End
If
DeleteResourceWebDAV =
xmlhttp.Status
End
Function
IV. Conclusion▲
Au cours de cet article, nous avons vu comment implémenter des opérations WebDAV dans un langage de script comme le VBScript.
Grâce à ces langages et aux technologies d'accès aux données comme MSXML, et XMLHTTP, on peut piloter le protocole WebDAV simplement. Par rapport à FTP, le protocole WEBDAV est à privilégier pour son niveau de sécurité et son faible coût de mise en place.
Quelques références :
Théorie du protocole : http://opera.inrialpes.fr/CEMT/PlanDAV.html MSDN/
Exchange : http://msdn.microsoft.com/en-us/library/aa486282(EXCHG.65).aspx
Pour aller plus loin :
http://msdn.microsoft.com/en-us/library/ms992620(EXCHG.65).aspx
http://msdn.microsoft.com/en-us/library/ms879462(EXCHG.65).aspx
http://msdn.microsoft.com/en-us/library/ms992870(EXCHG.65).aspx
http://msdn.microsoft.com/en-us/library/aa123587(EXCHG.65).aspx
V. Téléchargements▲
VI. Remerciements▲
Je tiens à remercier Louis-Guillaume MORAND, bbil et toute l'équipe de Developpez.com de m'avoir soutenu et pour toutes les corrections effectuées.