Follow me
RSS feed
My sources
My Viadeo

Creer un serveur WebDAV en 4 puis 11 lignes de code avec Ruby

Greg | 07 Oct 2009

projetsLe problème, quand on travaille sur Mac, c'est que les autres pensent qu'on n'est pas compatible. En fait, ce n'est pas vrai. Mon Pages est tout à fait capable d'ouvrir les saloperies de documents .docx que m'envoient mes collègues, et je lis sans problèmes les immondes documents PowerPoint avec Keynote. Je suis même capable de générer des documents dans ces formats depuis les mêmes logiciels... Bref, je suis compatible ! C'est Microsoft, avec ses logiciels, qui n'est pas compatible, croyant encore et toujours que sa suprématie ne lui impose pas de permettre d'ouvrir des documents étrangers1. Mais allez faire comprendre cela à quelqu'un qui vous parle en numéro de semaine ;) Ces mêmes personnes qui ont l'habitude de s'échanger des fichiers via des répertoires partagés... Là encore, je suis capable d'aller piocher dans un de leurs répertoires (merci samba) mais je peux toujours rêver pour que leur Windows puisse accéder à un de mes répertoires !

Pour régler ce dernier problème, je me suis penché sur WebDAV. Bien entendu, il y a mod_dav sur mon serveur apache. Mais ce n'est pas très souple. Je me suis donc demandé si je ne pouvais pas trouver un serveur WebDAV simple et facile à mettre en place. Et bien c'était sans compter sur Ruby, Rack et surtout rack_dav.

rack_dav permet de monter très facilement un serveur WebDAV. Ce sont les fameuses 4 lignes de code. Par exemple pour partager le contenu de mon répertoire Documents/etudes il suffit de créer le fichier de configuration rackup suivant :

# config.ru
require 'rubygems'
 
require 'rack_dav'
 
use Rack::CommonLogger
 

run RackDAV::Handler.new(:root => '/Users/greg/Documents/etudes')

Après avoir lancé rackup, mon dossier est accessible via l'URL http://mon.server.net:9292/.

Le problème vient quand on veut pouvoir partager plusieurs répertoires. Et c'est à ce moment-là que j'ai eu l'idée d'ajouter un moteur de rendu WebDAV dans Capcode. La mise en place est aussi simple que pour les autres moteurs de rendu, et utilise donc la syntaxe render :webdav => "/path/to/root". Ainsi, si je veux mettre en place la même chose que ce que j'ai fait ci-dessus avec rack, je code ceci :

# file: sample.rb
require 'rubygems'
require 'capcode'
require 'capcode/render/webdav'

module Capcode
  # !!! Render file from /Users/greg/Documents/etudes !!!
  class WebDav < Route '/etudes'
    def get
      render :webdav => "/Users/greg/Documents"
    end
    def method_missing(id, *a, &b)
 get
 end
  end  
end

Il y a deux choses remarquables ici :

  1. Tout d'abord, pour permettre un accès au répertoire /Users/greg/Documents/etudes, j'utilise la route /etudes et le positionne le répertoire racine avec la valeur /Users/greg/Documents. Bien entendu, toutes les combinaisons sont possibles...
  2. En plus de la méthode get je définis une méthode method_missing qui appelle la méthode get. Ceci est dû au fait que le protocole WebDAV définit tout un tas de méthodes HTTP, mais qui, dans le cas présent, peuvent toutes être traité comme le GET.

Voilà... Tout cela se trouvera dans la prochaine version de Capcode ou sur github pour les plus pressés.

1 Il fallait rétablir cette vérité.

Copyright © 2009 - 2011 Grégoire Lejeune.
All documents licensed under the Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License, except ones with specified licence.
Powered by Jekyll.