<html><body>Hi,<br>first i want thanks to Sawyer X about his good presentation on YAPC about CGI must DIE! I find only this video http://www.youtube.com/watch?v=tu6_3fZbWYw.<br><br>I have couple of project which use CGI.pm. I thinking about how can i simply rewrite this to any MVC framework. Couple of years ago, ther isn;t exist any usable MVC framework and every of us use CGI or other similar functions for creating HTML pages. How SawyerX said, CGI must die. Because working on big project writed on CGI, than one time you will have to much problem to keep consistence of programs.<br><br>Before couple years ago i must writed one CRM project in Perl and try to find which frameworkt can use for this. I play with CGI::Application, Gantry, Jifty, Mojo, Catalyst. Winner of this was Catalyst, but next i finded newer project - Dancer :) and try to made this project atop Dancer. For me Dancer was and for now is winner as Perl web framework. Because is small, simpliest and made everything what i need. Catalyst is powerfull but bigger. <br><br>Now when i thinking how move my CGI projects to Dancer i finded couple of solutions(<p><code>Catalyst::Controller::CGIBin</code>, <code>HTTP::Request::AsCGI</code>, <code>CGI::PSGI</code>, <code>CGI::Emulate::PSGI)</code></p>&nbsp; but none of this make everything what i need. Than i make Dancer::Plugin::FakeCGI. http://search.cpan.org/~koceasy/Dancer-Plugin-FakeCGI-0.60/lib/Dancer/Plugin/FakeCGI.pm<br><br>This plugin made emulation of Mod_PERL for now in version 1. I choose this, because any of us which use CGI.pm we had to use a mod_perl funcionalities to make better programs runned atop CGI.pm. You look on examples directories and run bin/app.pl from this.<br><br>When you have bigger project writed atop CGI.pm than you have big problem to rewriting this to anythink else. Rewriting use yours time, which can you spend to extended funcionalities. It can look like this:<br><br>Web---&gt;INPUT--&gt;CGI project do something---&gt;HTML contentt<br><br>I try to emulated mod_perl behavior in Dancer::Plugin::FakeCGI. First emulated input parametters under mod-Perl&nbsp; and second is capture everything what CGI project print to STDOUT. If i hade this than can be simple make any changes or funcionalities in this CGI. For this i use mocking and this package http://search.cpan.org/~sukria/Test-TinyMocker-0.03/lib/Test/TinyMocker.pm(I send simply patch to Alexis Sukrieh to extend his package to method mocked, which can return original mocked method, but he dosn't answer on my email)<a href="http://search.cpan.org/%7Esukria/"></a>. Now if i have this functionalities, than i have simplies change fincionalities in CGI project. I can mocked any function and if CGI project run this function than i return what i need, simply example is /test_6 under examples directories or this example:<br><br>sub test_file { <br>&nbsp;&nbsp; my ($cgi_bin, $cgi, $url, $is_perl) = @_;<br>&nbsp;&nbsp; <span class="sh_keyword">return</span> <span class="sh_number">1</span> <span class="sh_keyword">if</span> <span class="sh_symbol">(</span><span class="sh_variable">$cgi</span> <span class="sh_symbol">=~</span> <span class="sh_string">/^\./</span><span class="sh_symbol">);</span>     <span class="sh_comment"># skip serving this file </span>
 <span class="sh_keyword">https://email.seznam.cz/#compose/30576<br>&nbsp;&nbsp; return</span> <span class="sh_number">1</span> <span class="sh_keyword">if</span> <span class="sh_symbol">(</span><span class="sh_variable">$cgi</span> <span class="sh_symbol">=~</span> <span class="sh_string">/test.pl/</span><span class="sh_symbol">);</span> <span class="sh_comment"># skip serving this file  <br>&nbsp;&nbsp; </span><span class="sh_keyword">if</span> <span class="sh_symbol">(</span><span class="sh_variable">$cgi</span> <span class="sh_keyword">eq</span> <span class="sh_string">"index.pl"</span><span class="sh_symbol">)</span> <span class="sh_cbracket">{</span>  <span class="sh_comment"># own serving for given file</span>
    <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; any <span class="sh_variable">$url</span> <span class="sh_symbol">=&gt;</span> <span class="sh_keyword">sub</span> <span class="sh_cbracket">{</span>
        redirect <span class="sh_string">"/index.sh"</span><span class="sh_symbol">;</span>
    <span class="sh_cbracket">}</span><span class="sh_symbol">;<br>&nbsp; &nbsp; &nbsp; &nbsp;</span><span class="sh_keyword">return</span> <span class="sh_number">1</span><span class="sh_symbol">;<br>&nbsp;&nbsp;</span><span class="sh_cbracket"> }</span>

 <br>&nbsp;&nbsp; <span class="sh_keyword">return</span> <span class="sh_number">0</span><span class="sh_symbol">;</span> <span class="sh_comment"># default serving file<br></span>&nbsp;<span class="sh_cbracket">}</span><br><br>fake_cgi_bin(\&amp;test_file, ["*.pl", "*.sh"], 1);&nbsp;
<br># Read every files *.sh or *.pl and try to serve automaticaly if method test_file() return 0;<br><br>There is couple of problem when use this plugin:<br>1) in CGI can't be any infinity loop such us CGI::Push.pm or other, because i use capturing STDOUT and after CGI program exited than i server this captured informations-HTML pages to client<br>2) Problem with fork|system() function under HTTP::Server::Simple - This server make bad openening file descriptor of STDOUT on child pid and open STDOUT as STDERR of parent pid. Solution for this is use plackup<br>3)  better solution for capturing STDOUT under system call when is set capture to memory.<br>4) Don't use dancer under mod_perl in apache. because I emulated mod_perl funcionalities. Solution for this is use Apache as proxy and serving connection to plackup server.<br>5) Serving file is about 20-50% slowest than under Mod_perl when use Registry.pm, because CGI::Compile behaviour is as PerlRun.pm. Now i worked on similar behavior as Registry.pm.<br>6) memory usage us bigger than on mod_perl - solution for this is buy more memory :D <br><br>My reasons is this will be good for simple migration from CGI to Dancer. Now you can simply run any CGI project under Dancer and make simple refactoring of this code.<br>&nbsp;<br>Bye Igor<br></body></html>