package HTTP::DAVServer::Respond; our $VERSION=0.1; use strict; use warnings; =head1 NAME HTTP::DAVServer::Respond - Produces all response codes, headers and sends output to client =cut # 0 flags does not have content # 1 flags must have content # -1 flags may have content my $methods = { 'OPTIONS' => 0, 'GET' => 0, 'HEAD' => 0, 'POST' => 1, 'DELETE' => 0, 'PROPFIND' => 1, 'PROPPATCH' => 1, 'COPY' => 0, 'MOVE' => 0, 'PUT' => 1, 'MKCOL' => 0, }; sub handles { if ($_[1]) { return exists $methods->{$_[1]}; } return $methods; } sub hasContent { exists $methods->{$_[1]} && return $methods->{$_[1]}; warn "hasContent called with no valid method name ($_[1])\n" if $HTTP::DAVServer::WARN; return 0; } sub ok { my ($self, $r) = @_; warn "OK @_\n" if $HTTP::DAVServer::TRACE; print $r->header( -status => "200 OK", $self->headers, -Content_Length => 0, -Content_Type => "text/html; charset=UTF-8", ); exit 0; } sub created { my ($self, $r) = @_; warn "CREATED @_\n" if $HTTP::DAVServer::TRACE; print $r->header( -status => "201 Created", $self->headers, -Content_Length => 0, -Content_Type => "text/html; charset=UTF-8", ); exit 0; } sub multiStatus { warn "MULTISTATUS @_\n" if $HTTP::DAVServer::TRACE; my ($self, $r, $xml) = @_; my $message = qq(\n\n$xml\n); warn "RESPOND XML:\n$message\n" if $HTTP::DAVServer::TRACE; print $r->header( -status => "207 Multi-Status", $self->headers, -Content_Length => length $message, -Content_Type => "text/xml; charset=UTF-8", ); print $message; exit 0; } sub badRequest { warn "BADREQUEST @_\n" if $HTTP::DAVServer::TRACE; my ($self, $r, $flag, $detail) = @_; my $message = "

400 Bad Request

\n$flag $detail\n"; print $r->header( -status => "400 Bad Request", $self->headers, -Content_Length => length $message, -Content_Type => "text/html; charset=UTF-8", ); print $message; exit 0; } sub challenge { warn "CHALLENGE @_\n" if $HTTP::DAVServer::TRACE; my ($self, $r) = @_; print $r->header( -status => "401 Unauthorized", $self->headers, -Content_Length => 0, -Content_Type => "text/html; charset=UTF-8", -WWW_Authenticate => qq(Digest realm="mymac", stale=false, nonce="c847ab2bf1b3661a9bf2a6bef87a9ef1", qop="auth", algorithm="MD5"), ); exit 0; } sub forbidden { warn "FORBIDDEN @_\n" if $HTTP::DAVServer::TRACE; my ($self, $r) = @_; print $r->header( -status => "403 Forbidden", $self->headers, -Content_Length => 0, -Content_Type => "text/html; charset=UTF-8", ); exit 0; } sub notFound { warn "NOTFOUND @_\n" if $HTTP::DAVServer::TRACE; my ($self, $r) = @_; print $r->header( -status => "404 Not Found", $self->headers, -Content_Length => 0, -Content_Type => "text/html; charset=UTF-8", ); exit 0; } sub notAllowed { warn "NOTALLOWED @_\n" if $HTTP::DAVServer::TRACE; my ($self, $r) = @_; print $r->header( -status => "405 Method Not Allowed", $self->headers, -Content_Length => 0, -Content_Type => "text/html; charset=UTF-8", ); exit 0; } sub conflict { warn "CONFLICT @_\n" if $HTTP::DAVServer::TRACE; my ($self, $r) = @_; print $r->header( -status => "409 Conflict", $self->headers, -Content_Length => 0, -Content_Type => "text/html; charset=UTF-8", ); exit 0; } sub unsupported { warn "UNSUPPORTED @_\n" if $HTTP::DAVServer::TRACE; my ($self, $r) = @_; print $r->header( -status => "415 Unsupported Media Type", $self->headers, -Content_Length => 0, -Content_Type => "text/html; charset=UTF-8", ); exit 0; } sub serverError { warn "SERVERERROR @_\n" if $HTTP::DAVServer::TRACE; my ($self, $r) = @_; print $r->header( -status => "500 Server Error", $self->headers, -Content_Length => 0, -Content_Type => "text/html; charset=UTF-8", ); exit 0; } sub notImplemented { warn "SERVERERROR @_\n" if $HTTP::DAVServer::TRACE; my ($self, $r) = @_; print $r->header( -status => "501 Not Implemented", $self->headers, -Content_Length => 0, -Content_Type => "text/html; charset=UTF-8", ); exit 0; } sub diskFull { warn "DISKFULL @_\n" if $HTTP::DAVServer::TRACE; my ($self, $r) = @_; print $r->header( -status => "507 Insufficient Storage", $self->headers, -Content_Length => 0, -Content_Type => "text/html; charset=UTF-8", ); exit 0; } sub Server { return "Jay's DAV server"; } sub DAV { return "1"; } sub headers { my $self=shift; return ( -nph => 1, -Server => $self->Server, -DAV => $self->DAV, ) } =head1 SUPPORT For technical support please email to jlawrenc@cpan.org ... for faster service please include "HTTP::DAVServer" and "help" in your subject line. =head1 AUTHOR Jay J. Lawrence - jlawrenc@cpan.org Infonium Inc., Canada http://www.infonium.ca/ =head1 COPYRIGHT Copyright (c) 2003 Jay J. Lawrence, Infonium Inc. All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. The full text of the license can be found in the LICENSE file included with this module. =head1 ACKNOWLEDGEMENTS Thank you to the authors of my prequisite modules. With out your help this code would be much more difficult to write! XML::Simple - Grant McLean XML::SAX - Matt Sergeant DateTime - Dave Rolsky Also the authors of litmus, a very helpful tool indeed! =head1 SEE ALSO HTTP::DAV, HTTP::Webdav, http://www.webdav.org/, RFC 2518 =cut 1;