Separate output (writing) of HTTP headers into http_header subroutine, to centralize setting HTTP header for further mod_perl specific tweaks (to be able to run gitweb without PerlOptions +ParseHeaders, which would speed gitweb some), and checking for HEAD request. Always return just after HTTP header is sent when asking only about headers (HTTP request method 'HEAD'); first appeared in git_rss. While at it uniquify style of http_header(...) calls, formerly "print $cgi->header(...)", and remove default HTTP status, '200 OK'. Signed-off-by: Jakub Narebski <jnareb@xxxxxxxxx> --- This one is fairly generic, and if considered worthy, I think can be accepted without much ado. Perhaps the cleanup part of it should be split into separate patch? gitweb/gitweb.perl | 40 +++++++++++++++++++++++++++------------- 1 files changed, 27 insertions(+), 13 deletions(-) diff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl index 65fcdb0..aaee217 100755 --- a/gitweb/gitweb.perl +++ b/gitweb/gitweb.perl @@ -1678,7 +1678,17 @@ sub blob_mimetype { } ## ====================================================================== -## functions printing HTML: header, footer, error page +## functions printing HTTP or HTML: header, footer, error page + +sub http_header { + my @header = @_; + + print $cgi->header(@header); + + # Optimization: skip generating the body if client asks only + # for HTTP header (e.g. cache validation). + return if ($cgi->request_method() eq 'HEAD'); +} sub git_header_html { my $status = shift || "200 OK"; @@ -1709,8 +1719,11 @@ sub git_header_html { } else { $content_type = 'text/html'; } - print $cgi->header(-type=>$content_type, -charset => 'utf-8', - -status=> $status, -expires => $expires); + http_header( + -type => $content_type, + -charset => 'utf-8', + -status => $status, + -expires => $expires); print <<EOF; <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> @@ -2983,7 +2996,7 @@ sub git_forks { sub git_project_index { my @projects = git_get_projects_list($project); - print $cgi->header( + http_header( -type => 'text/plain', -charset => 'utf-8', -content_disposition => 'inline; filename="index.aux"'); @@ -3375,7 +3388,7 @@ sub git_blob_plain { $save_as .= '.txt'; } - print $cgi->header( + http_header( -type => "$type", -expires=>$expires, -content_disposition => 'inline; filename="' . "$save_as" . '"'); @@ -3591,10 +3604,9 @@ sub git_snapshot { my $filename = basename($project) . "-$hash.tar.$suffix"; - print $cgi->header( + http_header( -type => "application/$ctype", - -content_disposition => 'inline; filename="' . "$filename" . '"', - -status => '200 OK'); + -content_disposition => 'inline; filename="' . "$filename" . '"'); my $git = git_cmd_str(); my $name = $project; @@ -3979,7 +3991,7 @@ sub git_blobdiff { } } elsif ($format eq 'plain') { - print $cgi->header( + http_header( -type => 'text/plain', -charset => 'utf-8', -expires => $expires, @@ -4128,7 +4140,7 @@ sub git_commitdiff { my $tagname = git_get_rev_name_tags($hash); my $filename = basename($project) . "-$hash.patch"; - print $cgi->header( + http_header( -type => 'text/plain', -charset => 'utf-8', -expires => $expires, @@ -4465,12 +4477,12 @@ sub git_feed { if (defined($commitlist[0])) { %latest_commit = %{$commitlist[0]}; %latest_date = parse_date($latest_commit{'author_epoch'}); - print $cgi->header( + http_header( -type => $content_type, -charset => 'utf-8', -last_modified => $latest_date{'rfc2822'}); } else { - print $cgi->header( + http_header( -type => $content_type, -charset => 'utf-8'); } @@ -4670,7 +4682,9 @@ sub git_atom { sub git_opml { my @list = git_get_projects_list(); - print $cgi->header(-type => 'text/xml', -charset => 'utf-8'); + http_header( + -type => 'text/xml', + -charset => 'utf-8'); print <<XML; <?xml version="1.0" encoding="utf-8"?> <opml version="1.0"> -- 1.4.4.3 - To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html