提交 921296d3 编写于 作者: J Junio C Hamano

Merge branch 'jn/gitweb-caching-prep'

* jn/gitweb-caching-prep:
  gitweb: Move generating page title to separate subroutine
  gitweb: Add custom error handler using die_error
  gitweb: Use nonlocal jump instead of 'exit' in die_error
  gitweb: href(..., -path_info => 0|1)
  Export more test-related variables when running external tests
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
use warnings; use warnings;
use CGI qw(:standard :escapeHTML -nosticky); use CGI qw(:standard :escapeHTML -nosticky);
use CGI::Util qw(unescape); use CGI::Util qw(unescape);
use CGI::Carp qw(fatalsToBrowser); use CGI::Carp qw(fatalsToBrowser set_message);
use Encode; use Encode;
use Fcntl ':mode'; use Fcntl ':mode';
use File::Find qw(); use File::Find qw();
...@@ -952,6 +952,21 @@ sub evaluate_path_info { ...@@ -952,6 +952,21 @@ sub evaluate_path_info {
$git_avatar = ''; $git_avatar = '';
} }
# custom error handler: 'die <message>' is Internal Server Error
sub handle_errors_html {
my $msg = shift; # it is already HTML escaped
# to avoid infinite loop where error occurs in die_error,
# change handler to default handler, disabling handle_errors_html
set_message("Error occured when inside die_error:\n$msg");
# you cannot jump out of die_error when called as error handler;
# the subroutine set via CGI::Carp::set_message is called _after_
# HTTP headers are already written, so it cannot write them itself
die_error(undef, undef, $msg, -error_handler => 1, -no_http_header => 1);
}
set_message(\&handle_errors_html);
# dispatch # dispatch
if (!defined $action) { if (!defined $action) {
if (defined $hash) { if (defined $hash) {
...@@ -972,11 +987,16 @@ sub evaluate_path_info { ...@@ -972,11 +987,16 @@ sub evaluate_path_info {
die_error(400, "Project needed"); die_error(400, "Project needed");
} }
$actions{$action}->(); $actions{$action}->();
exit; DONE_GITWEB:
1;
## ====================================================================== ## ======================================================================
## action links ## action links
# possible values of extra options
# -full => 0|1 - use absolute/full URL ($my_uri/$my_url as base)
# -replay => 1 - start from a current view (replay with modifications)
# -path_info => 0|1 - don't use/use path_info URL (if possible)
sub href { sub href {
my %params = @_; my %params = @_;
# default is to use -absolute url() i.e. $my_uri # default is to use -absolute url() i.e. $my_uri
...@@ -993,7 +1013,8 @@ sub href { ...@@ -993,7 +1013,8 @@ sub href {
} }
my $use_pathinfo = gitweb_check_feature('pathinfo'); my $use_pathinfo = gitweb_check_feature('pathinfo');
if ($use_pathinfo and defined $params{'project'}) { if (defined $params{'project'} &&
(exists $params{-path_info} ? $params{-path_info} : $use_pathinfo)) {
# try to put as many parameters as possible in PATH_INFO: # try to put as many parameters as possible in PATH_INFO:
# - project name # - project name
# - action # - action
...@@ -3161,23 +3182,30 @@ sub blob_contenttype { ...@@ -3161,23 +3182,30 @@ sub blob_contenttype {
## ====================================================================== ## ======================================================================
## functions printing HTML: header, footer, error page ## functions printing HTML: header, footer, error page
sub git_header_html { sub get_page_title {
my $status = shift || "200 OK"; my $title = to_utf8($site_name);
my $expires = shift;
my $title = "$site_name"; return $title unless (defined $project);
if (defined $project) {
$title .= " - " . to_utf8($project); $title .= " - " . to_utf8($project);
if (defined $action) {
$title .= "/$action"; return $title unless (defined $action);
if (defined $file_name) { $title .= "/$action"; # $action is US-ASCII (7bit ASCII)
return $title unless (defined $file_name);
$title .= " - " . esc_path($file_name); $title .= " - " . esc_path($file_name);
if ($action eq "tree" && $file_name !~ m|/$|) { if ($action eq "tree" && $file_name !~ m|/$|) {
$title .= "/"; $title .= "/";
} }
}
} return $title;
} }
sub git_header_html {
my $status = shift || "200 OK";
my $expires = shift;
my %opts = @_;
my $title = get_page_title();
my $content_type; my $content_type;
# require explicit support from the UA if we are to send the page as # require explicit support from the UA if we are to send the page as
# 'application/xhtml+xml', otherwise send it as plain old 'text/html'. # 'application/xhtml+xml', otherwise send it as plain old 'text/html'.
...@@ -3191,7 +3219,8 @@ sub git_header_html { ...@@ -3191,7 +3219,8 @@ sub git_header_html {
$content_type = 'text/html'; $content_type = 'text/html';
} }
print $cgi->header(-type=>$content_type, -charset => 'utf-8', print $cgi->header(-type=>$content_type, -charset => 'utf-8',
-status=> $status, -expires => $expires); -status=> $status, -expires => $expires)
unless ($opts{'-no_http_headers'});
my $mod_perl_version = $ENV{'MOD_PERL'} ? " $ENV{'MOD_PERL'}" : ''; my $mod_perl_version = $ENV{'MOD_PERL'} ? " $ENV{'MOD_PERL'}" : '';
print <<EOF; print <<EOF;
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
...@@ -3408,6 +3437,7 @@ sub die_error { ...@@ -3408,6 +3437,7 @@ sub die_error {
my $status = shift || 500; my $status = shift || 500;
my $error = esc_html(shift) || "Internal Server Error"; my $error = esc_html(shift) || "Internal Server Error";
my $extra = shift; my $extra = shift;
my %opts = @_;
my %http_responses = ( my %http_responses = (
400 => '400 Bad Request', 400 => '400 Bad Request',
...@@ -3416,7 +3446,7 @@ sub die_error { ...@@ -3416,7 +3446,7 @@ sub die_error {
500 => '500 Internal Server Error', 500 => '500 Internal Server Error',
503 => '503 Service Unavailable', 503 => '503 Service Unavailable',
); );
git_header_html($http_responses{$status}); git_header_html($http_responses{$status}, undef, %opts);
print <<EOF; print <<EOF;
<div class="page_body"> <div class="page_body">
<br /><br /> <br /><br />
...@@ -3430,7 +3460,8 @@ sub die_error { ...@@ -3430,7 +3460,8 @@ sub die_error {
print "</div>\n"; print "</div>\n";
git_footer_html(); git_footer_html();
exit; goto DONE_GITWEB
unless ($opts{'-error_handler'});
} }
## ---------------------------------------------------------------------- ## ----------------------------------------------------------------------
......
...@@ -473,6 +473,9 @@ test_external () { ...@@ -473,6 +473,9 @@ test_external () {
# Announce the script to reduce confusion about the # Announce the script to reduce confusion about the
# test output that follows. # test output that follows.
say_color "" " run $test_count: $descr ($*)" say_color "" " run $test_count: $descr ($*)"
# Export TEST_DIRECTORY, TRASH_DIRECTORY and GIT_TEST_LONG
# to be able to use them in script
export TEST_DIRECTORY TRASH_DIRECTORY GIT_TEST_LONG
# Run command; redirect its stderr to &4 as in # Run command; redirect its stderr to &4 as in
# test_run_, but keep its stdout on our stdout even in # test_run_, but keep its stdout on our stdout even in
# non-verbose mode. # non-verbose mode.
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册