Revision: 116 Author: matt Date: 2006-08-24 00:04:48 +0000 (Thu, 24 Aug 2006)
Log Message: ----------- Move redirect code to the fixup stage Modified Paths: -------------- trunk/plugins/aio/uri_to_file trunk/plugins/uri_to_file Modified: trunk/plugins/aio/uri_to_file =================================================================== --- trunk/plugins/aio/uri_to_file 2006-08-24 00:03:58 UTC (rev 115) +++ trunk/plugins/aio/uri_to_file 2006-08-24 00:04:48 UTC (rev 116) @@ -101,9 +101,7 @@ my $config = $self->config; IO::AIO::aio_stat($path, sub { - $self->log(LOGINFO, "aio_stat($path) returned ($_[0])"); - if ($_[0]) { - # error (usually file didn't exist). + if (!-e _) { while ($path =~ /\// && !-f $path) { $path =~ s/(\/[^\/]*)$//; $path_info = $1 . $path_info; @@ -119,13 +117,7 @@ } } elsif (-d _) { - # URI didn't end in a slash - need to redirect - if ($original_uri !~ /\/$/) { - $self->log(LOGINFO, "redirecting to $original_uri/$removed"); - $client->headers_out->header('Location', "$original_uri/$removed"); - $client->notes('uri_to_file_retcode', REDIRECT); - return; - } + $client->notes('is_dir', 1); if (my $dirindex = $config->notes($self->plugin_name . '::dirindex')) { my $filepath = catfile($path, $dirindex); $path = $filepath if -f $filepath; @@ -150,6 +142,24 @@ # This allows us to return REDIRECT above sub hook_uri_translation2 { my $self = shift; - $self->log(LOGDEBUG, "uri_to_file continuation finished"); return $self->client->notes('uri_to_file_retcode'); } + +sub hook_fixup { + my $self = shift; + + return DECLINED unless $self->client->notes('is_dir'); + + my $uri = $self->client->headers_in->request_uri; + + no warnings 'uninitialized'; + + if ($uri =~ s/^([^\?]*)(?<!\/)(\?.*)?$/$1\/$2/) { + # send redirect + $self->log(LOGINFO, "redirect to $uri"); + $self->client->headers_out->header('Location', "$uri"); + return REDIRECT; + } + + return DECLINED; +} Modified: trunk/plugins/uri_to_file =================================================================== --- trunk/plugins/uri_to_file 2006-08-24 00:03:58 UTC (rev 115) +++ trunk/plugins/uri_to_file 2006-08-24 00:04:48 UTC (rev 116) @@ -84,12 +84,7 @@ my $path_info = ''; if (-d $path) { - if ($original_uri !~ /\/$/) { - # send redirect - $self->log(LOGINFO, "redirect to $original_uri/$removed"); - $self->client->headers_out->header('Location', "$original_uri/$removed"); - return REDIRECT; - } + $self->client->notes('is_dir', 1); if (my $dirindex = $self->config->notes($self->plugin_name . '::dirindex')) { my $filepath = catfile($path, $dirindex); $path = $filepath if -f $filepath; @@ -118,3 +113,23 @@ return DECLINED; } + +# fixup directory requests to have a / on the end. +sub hook_fixup { + my $self = shift; + + return DECLINED unless $self->client->notes('is_dir'); + + my $uri = $self->client->headers_in->request_uri; + + no warnings 'uninitialized'; + + if ($uri =~ s/^([^\?]*)(?<!\/)(\?.*)?$/$1\/$2/) { + # send redirect + $self->log(LOGINFO, "redirect to $uri"); + $self->client->headers_out->header('Location', "$uri"); + return REDIRECT; + } + + return DECLINED; +}