X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=public-inbox.cgi;h=ee9510c1f012757163076cf8b991af64f78ac6d8;hb=65ff86f333a1f8276943248efef7fa2a64afe9e3;hp=4b74a62ae04f59710e32774e611d6e9d3b04cb71;hpb=f564327fd1e694056a4b13ed398cabd8d0d4c173;p=public-inbox.git diff --git a/public-inbox.cgi b/public-inbox.cgi index 4b74a62a..ee9510c1 100755 --- a/public-inbox.cgi +++ b/public-inbox.cgi @@ -1,62 +1,32 @@ #!/usr/bin/perl -w -# Copyright (C) 2014-2015 all contributors -# License: AGPLv3 or later (https://www.gnu.org/licenses/agpl-3.0.txt) +# Copyright (C) 2014-2016 all contributors +# License: AGPL-3.0+ or later # # Enables using PublicInbox::WWW as a CGI script use strict; use warnings; -use IO::Handle; +use Plack::Loader; +use Plack::Builder; +use Plack::Request; +use Plack::Handler::CGI; use PublicInbox::WWW; -use CGI qw/-nosticky/; -our $NO_SCRIPT_NAME; -our %HTTP_CODES; -BEGIN { - $NO_SCRIPT_NAME = 1 if $ENV{NO_SCRIPT_NAME}; - if ($ENV{MOD_PERL}) { - CGI->compile; - PublicInbox::WWW->preload; +BEGIN { PublicInbox::WWW->preload if $ENV{MOD_PERL} } +my $www = PublicInbox::WWW->new; +my $have_deflater = eval { require Plack::Middleware::Deflater; 1 }; +my $app = builder { + if ($have_deflater) { + enable 'Deflater', + content_type => [ 'text/html', 'text/plain', + 'application/atom+xml' ]; } - %HTTP_CODES = ( - 200 => 'OK', - 300 => 'Multiple Choices', - 301 => 'Moved Permanently', - 302 => 'Found', - 404 => 'Not Found', - 405 => 'Method Not Allowed', - 501 => 'Not Implemented', - ); -} + # Enable to ensure redirects and Atom feed URLs are generated + # properly when running behind a reverse proxy server which + # sets X-Forwarded-For and X-Forwarded-Proto request headers. + # See Plack::Middleware::ReverseProxy documentation for details + # enable 'ReverseProxy'; -# some servers (Ruby webrick) include scheme://host[:port] here, -# which confuses CGI.pm when generating self_url. -# RFC 3875 does not mention REQUEST_URI at all, -# so nuke it since CGI.pm functions without it. -delete $ENV{REQUEST_URI}; -$ENV{SCRIPT_NAME} = '' if $NO_SCRIPT_NAME; -my $req = CGI->new; -my $ret = PublicInbox::WWW::run($req, $req->request_method); - -my $out = select; -$out->binmode; - -if (ref($ret) eq 'CODE') { - $ret->(*dump_header); -} else { - my ($status, $headers, $body) = @$ret; - - dump_header([$status, $headers])->write($body->[0]); -} - -sub dump_header { - my ($res) = @_; - my $fh = select; - my ($status, $headers) = @$res; - $fh->write("Status: $status $HTTP_CODES{$status}\r\n"); - my @tmp = @$headers; - while (my ($k, $v) = splice(@tmp, 0, 2)) { - $fh->write("$k: $v\r\n"); - } - $fh->write("\r\n"); - $fh; -} + enable 'Head'; + sub { $www->call(@_) }; +}; +Plack::Handler::CGI->new->run($app);