summaryrefslogtreecommitdiffstats
path: root/app.psgi
blob: 9f8957e99770a7e3658f43e4dc0c37d7cd9d3b85 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#!/usr/bin/perl
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.

use 5.14.0;
use strict;
use warnings;

use File::Basename;
use File::Spec;
BEGIN {
    require lib;
    my $dir = dirname(__FILE__);
    lib->import($dir, File::Spec->catdir($dir, "lib"), File::Spec->catdir($dir, qw(local lib perl5)));
}

use Bugzilla::Constants ();

use Plack;
use Plack::Builder;
use Plack::App::URLMap;
use Plack::App::WrapCGI;
use Plack::Response;

use constant STATIC => qw(
    data/assets
    data/webdot
    docs
    extensions/[^/]+/web
    graphs
    images
    js
    skins
);

builder {
    my $static_paths = join('|', STATIC);
    enable 'Static',
        path => qr{^/($static_paths)/},
        root => Bugzilla::Constants::bz_locations->{cgi_path};

    $ENV{BZ_PLACK} = 'Plack/' . Plack->VERSION;

    my $map = Plack::App::URLMap->new;

    my @cgis = glob('*.cgi');
    my $shutdown_app = Plack::App::WrapCGI->new(script => 'shutdown.cgi')->to_app;

    foreach my $cgi_script (@cgis) {
        my $app = eval { Plack::App::WrapCGI->new(script => $cgi_script)->to_app };
        # Some CGI scripts won't compile if not all optional Perl modules are
        # installed. That's expected.
        if ($@) {
            warn "Cannot compile $cgi_script. Skipping!\n";
            next;
        }

        my $wrapper = sub {
            my $ret = Bugzilla::init_page();
            my $res = ($ret eq '-1' && $cgi_script ne 'editparams.cgi') ? $shutdown_app->(@_) : $app->(@_);
            Bugzilla::_cleanup();
            return $res;
        };

        my $base_name = basename($cgi_script);
        $map->map('/' => $wrapper) if $cgi_script eq 'index.cgi';
        $map->map('/rest' => $wrapper) if $cgi_script eq 'rest.cgi';
        $map->map("/$base_name" => $wrapper);
    }
    my $app = $map->to_app;
};