aboutsummaryrefslogtreecommitdiff
path: root/IkiWiki/Plugin/404.pm
diff options
context:
space:
mode:
authorJoey Hess <joey@gnu.kitenet.net>2009-01-31 19:26:36 -0500
committerJoey Hess <joey@gnu.kitenet.net>2009-01-31 19:26:36 -0500
commit3b83e520182a83e4ae6c61ab7b360b0eb939469f (patch)
tree540e62579bb246a411d25fac866968605ee496f7 /IkiWiki/Plugin/404.pm
parente5c8bc6222712fe9f465d4ac36350fd4ea729787 (diff)
downloadikiwiki-3b83e520182a83e4ae6c61ab7b360b0eb939469f.tar
ikiwiki-3b83e520182a83e4ae6c61ab7b360b0eb939469f.tar.gz
rename apache404 -> 404
This may already work with other web servers that have copied apache's interface, and it should be easy to add support to it for web servers that use some other interface. So, make the name more general.
Diffstat (limited to 'IkiWiki/Plugin/404.pm')
-rw-r--r--IkiWiki/Plugin/404.pm77
1 files changed, 77 insertions, 0 deletions
diff --git a/IkiWiki/Plugin/404.pm b/IkiWiki/Plugin/404.pm
new file mode 100644
index 000000000..5550ea7d1
--- /dev/null
+++ b/IkiWiki/Plugin/404.pm
@@ -0,0 +1,77 @@
+#!/usr/bin/perl
+# Copyright © 2009 Simon McVittie <http://smcv.pseudorandom.co.uk/>
+# Licensed under the GNU GPL, version 2, or any later version published by the
+# Free Software Foundation
+package IkiWiki::Plugin::404;
+
+use warnings;
+use strict;
+use IkiWiki 3.00;
+
+sub import {
+ hook(type => "cgi", id => '404', call => \&cgi);
+ IkiWiki::loadplugin("goto");
+}
+
+sub getsetup () {
+ return
+ plugin => {
+ # not really a matter of safety, but enabling/disabling
+ # through a web interface is useless - it needs web
+ # server admin action too
+ safe => 0,
+ rebuild => 0,
+ }
+}
+
+sub cgi_page_from_404 ($$$) {
+ my $path = shift;
+ my $baseurl = shift;
+ my $usedirs = shift;
+
+ # fail if missing from environment or whatever
+ return undef unless defined $path;
+ return undef unless defined $baseurl;
+
+ # with usedirs on, path is like /~fred/foo/bar/ or /~fred/foo/bar or
+ # /~fred/foo/bar/index.html
+ # with usedirs off, path is like /~fred/foo/bar.html
+ # baseurl is like 'http://people.example.com/~fred'
+
+ # convert baseurl to ~fred
+ unless ($baseurl =~ s{^https?://[^/]+/?}{}) {
+ return undef;
+ }
+
+ # convert path to /~fred/foo/bar
+ if ($usedirs) {
+ $path =~ s/\/*(?:index\.$config{htmlext})?$//;
+ }
+ else {
+ $path =~ s/\.$config{htmlext}$//;
+ }
+
+ # remove /~fred/
+ unless ($path =~ s{^/*\Q$baseurl\E/*}{}) {
+ return undef;
+ }
+
+ # special case for the index
+ unless ($path) {
+ return 'index';
+ }
+
+ return $path;
+}
+
+sub cgi ($) {
+ my $cgi=shift;
+
+ if ($ENV{REDIRECT_STATUS} eq '404') {
+ my $page = cgi_page_from_404($ENV{REDIRECT_URL},
+ $config{url}, $config{usedirs});
+ IkiWiki::Plugin::goto::cgi_goto($cgi, $page);
+ }
+}
+
+1;