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.
master
Simon McVittie 2009-01-31 22:32:10 +00:00
parent fb0e3a7dbc
commit 46b880f839
4 changed files with 87 additions and 55 deletions

View File

@ -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.

View File

@ -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;

View File

@ -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

View File

@ -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';