package Plack::App::DAV; use strict; use warnings; use parent 'Plack::Component'; use Plack::Request; use HTTP::Request; use Net::DAV::Server; use Filesys::Virtual::Plain; use Plack::Util::Accessor qw(root dbobj); our $VERSION = '0.03'; sub prepare_app { my $self = shift; my ($classname, $args) = ref($self->dbobj) ? @{$self->dbobj} : $self->dbobj || 'Simple'; my $class = Plack::Util::load_class($classname, 'Net::DAV::LockManager') or die 'could not load LockManager class'; $self->{dav} = Net::DAV::Server->new( -filesys => Filesys::Virtual::Plain->new({root_path => $self->root || '.'}), -dbobj => $class->new($args), ); } sub call { my ($self, $env) = @_; my $req = Plack::Request->new($env); my $res = $self->{dav}->run( HTTP::Request->new( $req->method, $req->uri, $req->headers, $req->content ) ); return $req->new_response( $res->code, $res->headers, $res->content, )->finalize; } 1; __END__ =head1 NAME Plack::App::DAV - simple DAV server for Plack =head1 SYNOPSIS plackup -MPlack::App::DAV -e 'Plack::App::DAV->new->to_app' =head1 DESCRIPTION Plack::App::DAV is simple DAV server for Plack. =head1 CONFIGURATION =over 4 =item root Document root directory. Defaults to the current directory. =item dbobj class specification and instanciate arguments for Net::DAV::LockManager. Defaults to 'Simple', makes Net::DAV::LockManager::Simple instance. my $app = Plack::App::DAV->new->to_app; is identical to the below. my $app = Plack::App::DAV->new(dbobj => 'Simple')->to_app; To make LockManager with sqlite DB, write my $app = Plack::App::DAV->new( dbobj => [DB => 'dbi:sqlite:lockdb.sqlite3'] )->to_app; =back =head1 AUTHOR Nobuo Danjou Enobuo.danjou@gmail.comE =head1 SEE ALSO L =head1 LICENSE This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =cut