Un serveur WebDAV en Python basé sur WSGI, état des lieux (PyWebDAV et WsgiDAV)

1. Le besoin

Dans un certain nombre de projets web, j'ai besoin d'utiliser un serveur WebDAV.
J'ai besoin d'utiliser ce protocole pour permettre "au monde extérieur" d'accéder simplement à mes applications en utilisant des fichiers accessibles directement sur leur sytème de fichier, de la même manière qu'ils accèdent à des fichiers classiques. Ceci est réalisé par des points de montage WebDAV.

Étant donné que ces dévelopements web sont basés sur sur l'interface WSGI (c'est du Python) c'est tout naturellement que je désire utiliser un serveur WebDAV écrit en Python qui s'interface sur WSGI.

Mes contraintes, désires concernant le serveur WebDAV que je recherche :

  • peu de dépendances
  • un code assez compréhensible
  • basé sur WSGI afin de :
    • n'avoir qu'un seul serveur à lancer pour servir les pages web et répondre aux requêtes WebDAV
    • avoir tout sur le même port
    • pouvoir utiliser le serveur WebDAV en middleware WSGI

2. État des lieux

Il y a six mois, j'ai fait une recherche dans ce sens. Voici un peu mes conclusions :

  • il existe un certain nombre de modules DAV basés sur le framework Twisted;
  • il existe zanshin qui est un serveur WebDAV développé pour l'application chandler;
  • il existe plein de choses à propos de WebDAV dans Zope 3;
  • il existe PyWebDAV qui est basé sur BaseHTTPServer.

Une recherche sur Python Package Index vous permet de trouver pas mal de choses. On y trouve à la fois des packages liés à des clients et des serveurs WebDAV.

Il y a six mois je n'ai pas trouvé de serveurs WebDAV basés sur WSGI. À la fois au niveau de mes recherches sur le web, que mes questions sur IRC. Je ne sais plus si j'ai posé la question sur une mailing list… il va falloir que je recherche et si ce n'est pas le cas… c'est mal !

3. Mon choix initial

Au mois de mai dernier, mon choix s'est porté sur PyWebDAV. Pourquoi ?

  • parce que au moment où je l'avais testé avec Nautilus et Apple Finder, il semblait bien fonctionner
  • car il était facile à tester (peu de dépendances…)
  • j'arrive à facilement comprendre le code source de ce projet
  • les développeurs de PyWebDAV sont intéressés pour avoir une version WSGI de leur serveur

4. Après une petite étude, voici ce que je devais améliorer sur PyWebDAV

  • adapter PyWebDAV à WSGI
  • ajouter des tests unitaires et fonctionnels
  • ajouter de la documentation
  • tester les performances

Je pensais aussi utiliser les dépendances suivantes :

5. Ce que j'ai fait

5.1. Prototype rapide de conversion de PyWebDAV en WSGI

Tout d'abord, j'ai commencer à expérimenter si j'allais réussir à convertir PyWebDAV à WSGI.
Pour cela, je me suis basé sur WebOB. Le travail a principalement consisté à convertir les appels à l'API BaseHTTPRequestHandler à WebOB. Globalement je n'ai pas eu de trop grosses difficultés. Cela m'a aussi permit d'approfondir un peu mes connaissances dans le protocole WebDAV.

Les premières expérimentations ont plutôt bien fonctionné. J'effectuais mes tests avec Cadaver.

Par contre je me suis très rapidement rendu compte que PyWebDAV rencontrait des problèmes de performances lors des transferts de gros fichiers.

Ensuite j'ai rencontré de nombreux problèmes avec le client Apple Finder. Je me suis rendu compte que ces problèmes impactaient pas seulement ma transformation de PyWebDAV en WSGI mais aussi la version d'origine de PyWebDAV.

À ce stade, j'ai pu conclure que j'arrivais à convertir PyWebDAV à WSGI et j'ai donc décidé de commencer par corriger un certain nombre de bugs dans la version d'origine de PyWebDAV basé sur BaseHTTPServer.

5.2. Mes changements effectués sur PyWebDAV d'origine

Voici la liste des choses que je désirais corriger et améliorer sur PyWebDAV d'origine :

  • correction d'un certain nombre de petites erreurs que je ne vais pas lister ici (voir le Changes log de PyWebDAV et son bug tracker)
  • corriger les erreurs liées à l'utilisation de Apple Finder
  • utiliser les iterateurs aux niveaux de la lecture et de l'écriture des fichiers afin de régler les problèmes de performances (consommation mémoire) lors des transferts de gros fichiers
  • ajout de tests unitaires et fonctionnels
  • ajout de documentations

Après l'envoie de quelques patchs dans le bug tracker de PyWebDAV, un développeur du projet m'a donné un accès en écriture au repository subversion de PyWebDAV et m'a autorisé d'appliquer directement mes patchs au trunk. Assez sympathique de sa part, depuis c'est ce que j'ai fait.

À noter que parallèlement à cela, j'ai une branche expérimental du projet qui se trouve ici basée sur Mercurial.

Depuis j'ai corrigé un certain nombre de bugs sur la branche principale de PyWebDAV.

À coté de celle-ci, ma branche expérimental :

  • est parfaitement fonctionnelle avec Nautilus, Cadaver et Apple Finder. Je n'ai pas effectué de test sous MS Windows pour le moment.
  • le transfert de gros fichier ne pose plus de problèmes de performances

6. En gros ce qu'il reste à faire

Maintenant que PyWebDAV en mode BaseHTTPServer fonctionne correctement avec différent clients WebDAV, c'est le moment d'effectuer proprement la conversion à WSGI.

Mais avant cela, pour faciliter cette phase de transformation, j'aimerais réaliser un certain nombre de tests fonctionnelles. Ceci facilitera le travaille de conversion à WSGI car je n'aurais qu'à lancer la batterie de tests pour voir si j'ai fait des erreurs ou non.

7. Ce que je découvre le 18 août 2009 !

Hier, peu après mon retour de vacances, en regardant les nouveaux packets sur "Python Package Index" je découvre "wsgidav".

Après avoir un peu regardé "wsgidav", voici quelques remarques :

  • le projet est bien organisé, avec de la doc, le code source semble assez simple à comprendre
  • le projet utilise plusieurs middleware WSGI pour certaine tâches :
    • pour faire du debug
    • pour gérer l'authentification
    • pour activer "un browser web" : explorer les dossiers… en lecture seule dans un navigateur
    • une solution pour configurer plusieurs points de montage
  • lorsque j'ai testé un transfert de gros fichiers (500Mo) il a le même problème de performance qu'avait "PyWebDAV"

8. Et maintenant ? continuer à travailler sur "PyWebDAV" ou travailler sur "WsgiDAV" ?

Pour le moment, je n'ai pas encore pris de décision mais voici comment je vais faire mon choix :

  • je vais tester "WsgiDAV" avec différent clients pour voir son niveau d'implémentation du protocole
  • je vais entrer en communication avec le développeur de "WsgiDAV"
  • je vais informer sur "PyWebDAV" l'existence du projet "WsgiDAV"

En fonction de tout cela, je jugerais si pour atteindre mes objectifs de départ, j'ai plus de travaille à faire avec "PyWebDAV" ou avec "WsgiDAV".

Read and Post Comments

Mes flux :