summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon McVittie <smcv@ http://smcv.pseudorandom.co.uk/>2009-01-31 22:32:10 +0000
committerSimon McVittie <smcv@ http://smcv.pseudorandom.co.uk/>2009-01-31 22:32:10 +0000
commit46b880f8390ac82d746add01de38a05155743374 (patch)
tree03e35c9b153e94af2da76dba39157a89da6b4177
parentfb0e3a7dbc7f71f8684c99c20d319671e60354b1 (diff)
Split apache404 into an independent plugin
Also make it ignore the 'do' parameter at Joey's suggestion, to have one less thing to remember when configuring.
-rw-r--r--IkiWiki/CGI.pm49
-rw-r--r--IkiWiki/Plugin/apache404.pm76
-rw-r--r--doc/plugins/apache404.mdwn (renamed from doc/tips/apache_404_handler.mdwn)7
-rwxr-xr-xt/apache404.t (renamed from t/cgi_page_from_404.t)10
4 files changed, 87 insertions, 55 deletions
diff --git a/IkiWiki/CGI.pm b/IkiWiki/CGI.pm
index 8734cdd49..e75ebcd27 100644
--- a/IkiWiki/CGI.pm
+++ b/IkiWiki/CGI.pm
@@ -338,46 +338,6 @@ sub cgi_goto ($;$) {
exit;
}
-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 $q=shift;
my $session=shift;
@@ -409,14 +369,7 @@ sub cgi (;$$) {
# commenter are for compatibility with any saved URLs
if ($do eq 'goto' || $do eq 'recentchanges_link' ||
$do eq 'commenter') {
- my $page = undef;
-
- if ($ENV{REDIRECT_STATUS} eq '404') {
- $page = cgi_page_from_404($ENV{REDIRECT_URL},
- $config{url}, $config{usedirs});
- }
-
- cgi_goto($q, $page);
+ cgi_goto($q);
}
# Need to lock the wiki before getting a session.
diff --git a/IkiWiki/Plugin/apache404.pm b/IkiWiki/Plugin/apache404.pm
new file mode 100644
index 000000000..3ac6b3af5
--- /dev/null
+++ b/IkiWiki/Plugin/apache404.pm
@@ -0,0 +1,76 @@
+#!/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::apache404;
+
+use warnings;
+use strict;
+use IkiWiki 3.00;
+
+sub import {
+ hook(type => "cgi", id => 'apache404', call => \&cgi);
+}
+
+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::cgi_goto($cgi, $page);
+ }
+}
+
+1;
diff --git a/doc/tips/apache_404_handler.mdwn b/doc/plugins/apache404.mdwn
index 0fda759e7..bab8fb59d 100644
--- a/doc/tips/apache_404_handler.mdwn
+++ b/doc/plugins/apache404.mdwn
@@ -1,10 +1,11 @@
-[[!meta title="Apache 404 handler"]]
+[[!template id=plugin name=apache404 author="[[Simon_McVittie|smcv]]"]]
+[[!tag type/useful]]
-Sufficiently recent versions of IkiWiki can be used as an Apache 404 handler,
+This plugin lets you use the IkiWiki CGI script as an Apache 404 handler,
to give the behaviour of various other wiki engines where visiting a
nonexistent page provides you with a link to create it.
To achieve this, put something like this in the wiki's Apache configuration
file:
- ErrorDocument 404 /cgi-bin/ikiwiki.cgi?do=goto
+ ErrorDocument 404 /cgi-bin/ikiwiki.cgi
diff --git a/t/cgi_page_from_404.t b/t/apache404.t
index adbbdf874..00fc35250 100755
--- a/t/cgi_page_from_404.t
+++ b/t/apache404.t
@@ -1,12 +1,14 @@
#!/usr/bin/perl
use warnings;
use strict;
-use Test::More tests => 18;
+use Test::More tests => 17;
-BEGIN { use_ok("IkiWiki"); }
-BEGIN { use_ok("IkiWiki::CGI"); }
+BEGIN { use_ok("IkiWiki::Plugin::apache404"); }
-sub cgi_page_from_404 { return IkiWiki::cgi_page_from_404(shift, shift, shift); }
+sub cgi_page_from_404 {
+ return IkiWiki::Plugin::apache404::cgi_page_from_404(shift, shift,
+ shift);
+}
$IkiWiki::config{htmlext} = 'html';