Skip to content
WEBDAV Handler for Rack
Ruby
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.
bin
lib
spec
.gitignore
.travis.yml
CHANGELOG.md
Gemfile
Gemfile.lock
LICENSE
README.md
Rakefile Run RSpec against multiple platforms. Jan 21, 2011
rack_dav.gemspec

README.md


RackDAV - Web Authoring for Rack

RackDAV is Handler for Rack, which allows content authoring over HTTP. RackDAV brings its own file backend, but other backends are possible by subclassing RackDAV::Resource.

Install

Just install the gem from RubyGems:

$ gem install rack_dav

Quickstart

If you just want to share a folder over WebDAV, you can just start a simple server with:

$ rack_dav

This will start a WEBrick server on port 3000, which you can connect to without authentication.

Rack Handler

Using RackDAV inside a rack application is quite easy. A simple rackup script looks like this:

require 'rubygems'
require 'rack_dav'

use Rack::CommonLogger

run RackDAV::Handler.new(:root => '/path/to/docs')

Implementing your own WebDAV resource

RackDAV::Resource is an abstract base class and defines an interface for accessing resources.

Each resource will be initialized with a path, which should be used to find the real resource.

RackDAV::Handler needs to be initialized with the actual resource class:

RackDAV::Handler.new(:resource_class => MyResource)

RackDAV needs some information about the resources, so you have to implement following methods:

  • children: If this is a collection, return the child resources.

  • collection?: Is this resource a collection?

  • exist?: Does this recource exist?

  • creation_date: Return the creation time.

  • last_modified: Return the time of last modification.

  • last_modified=(time): Set the time of last modification.

  • etag: Return an Etag, an unique hash value for this resource.

  • content_type: Return the mime type of this resource.

  • content_length: Return the size in bytes for this resource.

Most importantly you have to implement the actions, which are called to retrieve and change the resources:

  • get(request, response): Write the content of the resource to the response.body.

  • put(request, response): Save the content of the request.body.

  • post(request, response): Usually forbidden.

  • delete: Delete this resource.

  • copy(dest): Copy this resource to given destination resource.

  • move(dest): Move this resource to given destination resource.

  • make_collection: Create this resource as collection.

  • set_custom_property(name, value): Set a custom property on the resource. If the value is nil, delete the custom property.

  • get_custom_property(name): Return the value of the named custom property.

  • lock(locktoken, timeout, lockscope=nil, locktype=nil, owner=nil): Lock this resource. If scope, type and owner are nil, refresh the given lock.

  • unlock(token): Unlock this resource

Note, that it is generally possible, that a resource object is instantiated for a not yet existing resource.

For inspiration you should have a look at the FileResource implementation. Please let me now, if you are going to implement a new type of resource.

RackDAV on GitHub

Download or fork the project on its Github page

Something went wrong with that request. Please try again.