X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=public-inbox-cgi;h=3ad45613a9068099190c5709f01da870ad7c07b8;hb=aca047222a47e8d5277466d2dcc0618f12bdf8de;hp=ccfaae3789d1f0322c86f24b3aaf25d44f07c7be;hpb=7c69497a0126cd613053d881d63586bead07dd0e;p=public-inbox.git diff --git a/public-inbox-cgi b/public-inbox-cgi index ccfaae37..3ad45613 100755 --- a/public-inbox-cgi +++ b/public-inbox-cgi @@ -13,8 +13,7 @@ use 5.008; use strict; use warnings; use CGI qw(:cgi :escapeHTML -nosticky); # PSGI/FastCGI/mod_perl compat -use CGI::Util qw(unescape); -use Encode; +use Encode qw(decode_utf8); use PublicInbox::Config; our $LISTNAME_RE = qr!\A/([\w\.\-]+)!; our $pi_config; @@ -26,14 +25,33 @@ BEGIN { } } +binmode STDOUT, ':utf8'; + +my $ret = main(); + +my ($status, $headers, $body) = @$ret; +if (@ARGV && $ARGV[0] eq 'static') { + print $body; +} else { # CGI + print "Status: $status\r\n"; + while (my ($k, $v) = each %$headers) { + print "$k: $v\r\n"; + } + print "\r\n", $body; +} + +# TODO: plack support + +# private functions below + sub main { my $cgi = CGI->new; if ($cgi->request_method !~ /\AGET|HEAD\z/) { - return r($cgi, "405 Method Not Allowed"); + return r("405 Method Not Allowed"); } my $path_info = decode_utf8($ENV{PATH_INFO}); if ($path_info eq "/") { - r($cgi, "404 Not Found"); + r("404 Not Found"); } elsif ($path_info =~ m!$LISTNAME_RE/?\z!o) { get_list_log($cgi, $1); } elsif ($path_info =~ m!$LISTNAME_RE/all\z!o) { @@ -49,52 +67,46 @@ sub main { } elsif ($path_info =~ m!$LISTNAME_RE/mid/(\S+)\z!o) { redirect_mid_html($cgi, $1, $2); } else { - r($cgi, "404 Not Found"); + r("404 Not Found"); } } -binmode STDOUT, ':utf8'; -main(); - # simple response for errors -sub r { - print $_[0]->header(-type => "text/plain", - -status => $_[1], - -charset => 'utf-8'); -} +sub r { [ $_[0], { 'Content-Type' => 'text/plain' }, '' ] } # /$LISTNAME/all.atom.xml -> Atom feed, includes replies sub get_atom_all { my ($cgi, $listname) = @_; my $git_dir = $pi_config->get($listname, "mainrepo"); - defined $git_dir or return r($cgi, "404 Not Found"); + defined $git_dir or return r("404 Not Found"); require PublicInbox::Feed; - print $cgi->header(-type => "application/xml", -charset => 'us-ascii', - -status => '200 OK'); - - print PublicInbox::Feed->generate({ - git_dir => $git_dir, - pi_config => $pi_config, - listname => $listname, - cgi => $cgi - }); + [ '200 OK', + { 'Content-Type' => 'application/xml; charset=us-ascii' }, + PublicInbox::Feed->generate({ + git_dir => $git_dir, + pi_config => $pi_config, + listname => $listname, + cgi => $cgi + }) + ]; } # /$LISTNAME/index.atom.xml -> Atom feed sub get_atom_index { my ($cgi, $listname) = @_; my $git_dir = $pi_config->get($listname, "mainrepo"); - defined $git_dir or return r($cgi, "404 Not Found"); + defined $git_dir or return r("404 Not Found"); require PublicInbox::Feed; - print $cgi->header(-type => "application/xml", -charset => 'us-ascii', - -status => '200 OK'); - print PublicInbox::Feed->generate({ - git_dir => $git_dir, - pi_config => $pi_config, - listname => $listname, - cgi => $cgi, - top => 1 - }); + [ '200 OK', + { 'Content-Type' => 'application/xml; charset=us-ascii' }, + PublicInbox::Feed->generate({ + git_dir => $git_dir, + pi_config => $pi_config, + listname => $listname, + cgi => $cgi, + top => 1 + }) + ]; }