X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=public-inbox.cgi;h=e73e23ca7663662c907021a695a857fbdd6af4cb;hb=8968889e3ebfa09dd2c80fe8b917b83ac13ff356;hp=63663f32c4972cf040cbdfe890d7bf2841d4cda3;hpb=761323389ca4eeda7803b5d623b37b675d034588;p=public-inbox.git diff --git a/public-inbox.cgi b/public-inbox.cgi index 63663f32..e73e23ca 100755 --- a/public-inbox.cgi +++ b/public-inbox.cgi @@ -1,55 +1,35 @@ #!/usr/bin/perl -w -# Copyright (C) 2014, Eric Wong and 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; -require PublicInbox::WWW; -use CGI qw/-nosticky/; -our $NO_SCRIPT_NAME; -our %HTTP_CODES; -BEGIN { - $NO_SCRIPT_NAME = 1 if $ENV{NO_SCRIPT_NAME}; - CGI->compile if $ENV{MOD_PERL}; +use Plack::Loader; +use Plack::Builder; +use Plack::Request; +use Plack::Handler::CGI; +use PublicInbox::WWW; +BEGIN { PublicInbox::WWW->preload if $ENV{MOD_PERL} } - %HTTP_CODES = ( - 200 => 'OK', - 301 => 'Moved Permanently', - 404 => 'Not Found', - 405 => 'Method Not Allowed', - 501 => 'Not Implemented', - ); -} - -# 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; +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' ]; + } - dump_header([$status, $headers])->write($body->[0]); -} + # 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'; -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"); + enable 'Head'; + sub { + my $req = Plack::Request->new(@_); + PublicInbox::WWW::run($req, $req->method); } - $fh->write("\r\n"); - $fh; -} +}; +Plack::Handler::CGI->new->run($app);