NAME
Dancer::Plugin::FakeCGI - run CGI methods or Perl-files under Dancer
SYNOPSIS
DESCRIPTION
Supports to run CGI perl files on CGI methods under Dancer.
CONFIGURATION
plugins:
FakeCGI:
cgi-dir: 'cgi-dir'
cgi-bin: '/cgi-bin'
cgi-package: 'lib/CGI'
cgi-class: ourCGI
stdout-type: "file"
temp-dir: "tmp"
cgi-dir
- for setting directory where is placed Perl CGI file, standart is 'cgi-dir'. This directory must be in root on Dancer directory.cgi-bin
- web url directory where are Perl CGI files visible. Must be set.cgi-package
- for setting INC library where is CGI packagesa(loaded fromfake_cgi_method
), standart is nothing.cgi-class
- definition child-classes for CGI, it can be defined as ARRAY, standart every 'CGI*::'stdout-type
- where will be saved captured string from STD[OUT|ERR], standart is capture into memory. Change with this options:temp-dir
- temporary directory where will be save all captured files ifstdout-type
is set to file. Best option is usefile
captured andtemp-dir
mount as RAM filesystem
TODO
- Maybe captured string parsed in HTTP::Message->parse
- CGI::Push use infinity loop which not existed than we don't capture any string from STDOUT and doesn't send any data.
- script_name() with referer
- Mod_PERL emulation for version 2
- find better solution for capturing STD[OUT|ERR] under system() call when capture to memory used
- Performance issue : every CGI files are loaded(served) 20-50% slowest then under Mod_PERL(Registry.pm). Difference is capture in memory and to file. In memory is 10-20% faster. One problem finded and there is Cwd::cwd() function which is slowest than getcwd() and take 65ms. CGI::Compile() is similar as Mod_PERL::PerlRun(). Everytime it run eval() on given loaded code. If we want to use behavior as Apache::Registry(), than should on first time evaled of given code to memory as package with function and other every call run this method to omited evaled code into memory.
BUGS
- Not use infinity loop!!! Every CGI script must exited - finished to run properly in Dancer
- Problem with fork|system function under HTTP::Server::Simple. This server make bad opening file descriptor of STDOUT. On this server it will be redirected to STDERR
METHODS
Capture reference to HASH
STDOUT|STDERR
- type of captured string for given output. It is HASH reference to other options.-
string
- if setting enabled capturing to memory this is string contains every characters capturedio_fh
- handler to IO::File if is set to capturing into file, if is set to memory it is handler to IO::Scalarfilename
- filename with path if capturing is to fileheader_len
- this is size of HTTP header. On this position start HTML content. It is only for capturing into filestd_fh
- saved original filehandler into this param if is capturing enabled. If capturing stop than this option not exist
PARAMS for _run_code() as hashref
capture_stderr
- STDERR will be captured similar as STDOUT and wheb eval finished, that will be loged-
d=item
timeout
- in seconds which can timeouted given eval via alaram() function. 0|undefined - disabled it ret_error
- try run given code and return after eval
fake_cgi_bin_url($name[,@other])
Method which return url for given $name
. If set @other
, than this will be append to given URL
fake_cgi_method($package, $method, $params, @args)
Method for runned specified CGI method-function and return values of runned function.
PARAMS
$package
- Package name where is method, which we run. Automatically load this package to memory in first run.$method
- Method name which we run.$params
- Hash ref of params, look of params to_run_code()
@args
- Arguments for given method
fake_cgi_file($file, $params, $test_is_perl)
Method for runned specified Perl CGI file and returned exit value
PARAMS
$file
- CGI filename and first in first run we compiled this file into memory$params
- Hash ref of params, look of params to_run_code()
$test_is_perl
- try first if given file is Perl code, default we use given filename as is Perl script.
fake_cgi_compile(@args)
Load packages into memory or Compiled files into memory
PARAMS is array of HASHREF
- filename => compile Perl filename into memory
- package => load package into memory
- test_is_perl => if
filename
than test if it is Perl CGI file
fake_cgi_is_perl($file, $compile)
Tries to figure out whether the CGI is Perl code or not.
Return 1 if its Perl code otherwise is 0.
PARAMS
$file
- filename of test file$compile
- if true and given tested file is Perl code, than compiled given file into memory
fake_cgi_bin($code, $patterns)
Automatically serve CGI files from cgi-dir
directory
plugins: FakeCGI: cgi-bin_file_pattern: *.cgi
Setting cgi-bin_file_pattern
can be defined as array is pattern of file or files, which will be readed and try to compiled and setted to run as CGI.
PARAMS
$code
- reference for code with this options, if not set, than automatically add servering for given file with this options. If not return true, than serve given CGI files in standart way. This is parametter for given called code.-
- directory
- filename
- url
- is_perl
$paterns
- is scalar or can be array ref. If not set, than will be set from settings, otherwise read everything which kind of file will be readed$test_is_perl
- test if readable file it is Perl CGI file, if not defined, than we use every file as Perl CGI.
EXAMPLES
- Standart definition in setting file:
-
plugins: FakeCGI: cgi-bin_file_pattern: "*.pl"
In yours Dancer package only put
fake_cgi_bin();
and this script try to load every*.pl
files incgi-bin
directory under Dancer directory. - Tested files in own function for every *.pl and *.sh file:
-
sub test_file { my ($cgi_bin, $cgi, $url, $is_perl) = @_;
return 1 if ($cgi =~ /^\./); # skip serving this file return 1 if ($cgi =~ /test.pl/); # skip serving this file if ($cgi eq "index.pl") { # own serving for given file any $url => sub { redirect "/index.sh"; }; return 1; } return 0; # default server }
fake_cgi_bin(\&test_file, ["*.pl", "*.sh"], 1);
fake_cgi_as_string()
Return captured strings from CGI, which will be printed to STDOUT
fake_cgi_capture([$capture_start])
This method every time return actuall settings form capture method.
If argument $capture_start
is defined, can be possible START or STOP capturing.
true|1
- capturing will be initalized or restarted. Every data in restarting will bi appended.false|0
- capturing
RETURN array
- Hash reference for $capture
- IO::Scalar or IO::File of captured STDOUT strings
- actual position of seek() - tell() method
- size of all data captured from STDOUT in bytes
- len of HTTP header. From this position start HTML content
HOOKS
This plugin uses Dancer's hooks support to allow you to register code that should execute at given times.
TYPES
- fake_cgi_before($env,$capture) : hook which will be called before run CGI method or Perl CGI file. Arguments is HASH reference to %ENV and reference to $capture
- fake_cgi_after($capture) : hook which will be called after runned CGI method or Perl CGI file. Arguments is reference to $capture
EXAMPLE
hook 'fake_cgi_before' => sub {
my ($env,$capture) = @_;
};
hook 'fake_cgi_after' => sub {
my ($capture) = @_;
};
AUTHOR
Igor Bujna, <igor.bujna@post.cz>
CONTRIBUTING
ACKNOWLEDGEMENTS
For every developers of this packages, when made good ideas for this code :
Catalyst::Controller::CGIBin
, HTTP::Request::AsCGI
, CGI::PSGI
, CGI::Emulate::PSGI
SUPPORT
LICENSE AND COPYRIGHT
Copyright 2010-2013 Igor Bujna.
This program is free software; you can redistribute it and/or modify it under the terms of either: the GNU General Public License as published by the Free Software Foundation; or the Artistic License.
See http://dev.perl.org/licenses/ for more information.