Catalyst::Controller::CGIBin - Serve CGIs from root/cgi-bin


In your controller:

    package MyApp::Controller::Foo;

    use parent qw/Catalyst::Controller::CGIBin/;

In your .conf:

        cgi_root_path    cgi-bin
        cgi_dir          cgi-bin
        cgi_chain_root   /optional/private/path/to/Chained/root
        cgi_file_pattern *.cgi
        # or regex
        cgi_file_pattern /\.pl\z/
            username_field username # used for REMOTE_USER env var
            pass_env PERL5LIB
            pass_env PATH
            pass_env /^MYAPP_/


Dispatches to CGI files in root/cgi-bin for /cgi-bin/ paths.

Unlike ModPerl::Registry this module does _NOT_ stat and recompile the CGI for every invocation. This may be supported in the future if there's interest.

CGI paths are converted into action names using "cgi_action".

Inherits from Catalyst::Controller::WrapCGI, see the documentation for that module for other configuration information.



The global URI path prefix for CGIs, defaults to cgi-bin.


By default Path actions are created for CGIs, but if you specify this option, the actions will be created as Chained end-points, chaining off the specified private path.

If this option is used, the "cgi_root_path" option is ignored. The root path will be determined by your chain.

The PathPart of the action will be the path to the CGI file.


Path from which to read CGI files. Can be relative to $MYAPP_HOME/root or absolute. Defaults to $MYAPP_HOME/root/cgi-bin.


By default all files in "cgi_dir" will be loaded as CGIs, however, with this option you can specify either a glob or a regex to match the names of files you want to be loaded.

Can be an array of globs/regexes as well.




Takes a path to a CGI from root/cgi-bin such as foo/bar.cgi and returns the action name it is registered as.



Takes a path to a CGI from root/cgi-bin such as foo/bar.cgi and returns the public path it should be registered under.

The default is to prefix with $cgi_root_path/, using the cgi_root_path config setting, above.



Tries to figure out whether the CGI is Perl or not.

If it's Perl, it will be inlined into a sub instead of being forked off, see "wrap_perl_cgi".


$self->wrap_perl_cgi($path, $action_name)

Takes the path to a Perl CGI and returns a coderef suitable for passing to cgi_to_response (from Catalyst::Controller::WrapCGI) using CGI::Compile.

$action_name is the generated name for the action representing the CGI file from cgi_action.

This is similar to how ModPerl::Registry works, but will only work for well-written CGIs. Otherwise, you may have to override this method to do something more involved (see ModPerl::PerlRun.)

Scripts with __DATA__ sections now work too, as well as scripts that call exit().



Returns the package name a Perl CGI is compiled into for a given $action_name.


$self->wrap_nonperl_cgi($path, $action_name)

Takes the path to a non-Perl CGI and returns a coderef for executing it.

$action_name is the generated name for the action representing the CGI file.

By default returns something like:

    sub { system $path }


Catalyst::Controller::WrapCGI, CatalystX::GlobalContext, Catalyst::Controller, CGI, CGI::Compile, Catalyst


Please report any bugs or feature requests to bug-catalyst-controller-wrapcgi at, or through the web interface at I will be notified, and then you'll automatically be notified of progress on your bug as I make changes.


Rafael Kitover <>


Copyright (c) 2008-2015 Rafael Kitover <> and "CONTRIBUTORS" in Catalyst::Controller::WrapCGI.

This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.