Hi Folks Here is the set up (details below): o An fcgid scripts calls... o A module based on CGI::Application::Dispatch, which calls... o My module, which reads country names from Postgres and displays them
This works, so Ivory Coast is displayed as 'CÔte D'ivoire' (ignoring the upper-case O with caret for the moment). But when the first module above is installed as a mod_perl handler, and /that/ calls my module, the output is 'CÔte D'ivoire'. I find this scary, and would love an explanantion. Note: Commenting out CGI::Simple makes no difference, and commenting out 'use locale' makes no difference. Details: (1) OS: Debian (2) Web server: Apache/2.2.9 (Unix) mod_ssl/2.2.9 OpenSSL/0.9.8g mod_apreq2-20051231/2.6.0 mod_perl/2.0.4 Perl/v5.10.0 (3) httpd.conf: # Warning: # PerlOptions -GlobalRequest # won't work with CGI::Application::Dispatch. PerlOptions +GlobalRequest PerlOptions -SetupEnv PerlSetEnv PGCLIENTENCODING LATIN1 PerlSwitches -I/home/ron/perl.modules/Local-Sites/lib PerlSwitches -T PerlPostConfigRequire /home/ron/httpd/prefork/conf/startup.pl #PerlInitHandler Apache2::Reload #PerlSetVar ReloadAll Off #PerlSetVar ReloadModules Local::* <Location /test> SetHandler perl-script PerlResponseHandler Local::Sites::Test::Dispatcher Order deny,allow Deny from all Allow from 127.0.0.1 </Location> <Location /search> SetHandler fcgid-script Options ExecCGI Order deny,allow Deny from all Allow from 127.0.0.1 </Location> (4) startup.pl: # /home/ron/httpd/prefork/conf/startup.pl #use Apache::DBI; #use Apache2::Reload; #use Apache2::RequestRec (); #use Apache2::RequestUtil (); #use Apache2::Response (); use CGI::Application::Dispatch; use CGI::Simple; use HTML::Template; use Local::Sites::Base::DB; use Local::Sites::Config; use Local::Sites::Rose::Countries::Manager; use Local::Sites::Test::Dispatcher; use Local::Sites::Test::Sites; use Log::Dispatch; use Log::Dispatch::DBI; 1; (5) sites.fcgi, working when called as: http://127.0.0.1/search/sites.fcgi #!/usr/bin/perl # Mandatory use lib for FCGID. use lib '/home/ron/perl.modules/Local-Sites/lib'; use strict; use warnings; use CGI::Fast; use FCGI::ProcManager; use Local::Sites::Test::Dispatcher; # ----------------------------------------------- # Mandatory env var for FCGID. The value in httpd.conf is ignored. $ENV{PGCLIENTENCODING} = 'LATIN1'; my($proc_manager) = FCGI::ProcManager -> new({processes => 2}); $proc_manager -> pm_manage(); my($cgi); while ($cgi = CGI::Fast -> new() ) { $proc_manager -> pm_pre_dispatch(); Local::Sites::Test::Dispatcher -> dispatch(); $proc_manager -> pm_post_dispatch(); } (6) Local::Sites::Test::Dispatcher: package Local::Sites::Test::Dispatcher; use base 'CGI::Application::Dispatch'; use strict; use warnings; our $VERSION = '1.00'; # ----------------------------------------------- sub dispatch_args { return { prefix => 'Local::Sites::Test', table => [ '' => {app => 'sites', rm => 'display'}, ':app' => {}, ':app/:rm' => {}, ], }; } # End of dispatch_args. # ----------------------------------------------- 1; (7) mod_perl activity, failing when called as: http://127.0.0.1/test/sites (8) My module: package Local::Sites::Test::Sites; # Author: # Ron Savage <[EMAIL PROTECTED]> use base 'CGI::Application'; use locale; use strict; use warnings FATAL => 'all', NONFATAL => 'redefine'; use CGI::Simple; use DBI; use Local::Sites::Base::DB; use Local::Sites::Config; use Local::Sites::Rose::Countries::Manager; use Log::Dispatch; use Log::Dispatch::DBI; our $VERSION = '1.00'; # ----------------------------------------------- sub cgiapp_get_query { my($self) = @_; return CGI::Simple -> new(); } # End of cgiapp_get_query. # ----------------------------------------------- # Convert, for example, AUSTRALIA to Australia. sub nice_name { my($name) = @_; $name = ucfirst lc $name; $name =~ s/([ .(])([a-z])/$1\U$2/g; $name =~ s/(.+) \(See Also.+/$1/; $name =~ s/Of(\)|$)/of$1/; return $name; } # End of nice_name. # ----------------------------------------------- sub display { my($self) = @_; my($country) = Local::Sites::Rose::Countries::Manager -> get_countries(); my($template) = $self -> load_tmpl('country_state.tmpl'); $template -> param(country_loop => [map{ {name => nice_name($_ -> name() )} } @$country]); $template -> param(encoding => $ENV{'PGCLIENTENCODING'}); for (@$country) { $self -> log($_ -> name() ) if ($_ -> name() =~ /IVOIRE/); } return $template -> output(); } # End of display. # ----------------------------------------------- sub log { my($self, $s) = @_; $$self{'_log'} -> log(level => 'info', message => $s ? "CGIApp: $s" : ''); } # End of log. # ----------------------------------------------- sub setup { my($self) = @_; my($config) = Local::Sites::Config -> new(); my($host) = $$config{'host'}; $$self{'_db'} = Local::Sites::Base::DB -> new(); $$self{'_log'} = Log::Dispatch -> new(); $$self{'_log'} -> add ( Log::Dispatch::DBI -> new ( dbh => $$self{'_db'} -> retain_dbh(), min_level => 'info', name => 'Sites', ) ); $self -> log('-' x 30); $self -> log($self -> query() -> url() ); $self -> param(config => $config); $self -> run_modes({display => 'display'}); $self -> start_mode('display'); $self -> tmpl_path($config -> get_tmpl_path() ); } # End of setup. # ----------------------------------------------- 1; (9) The HTML template: <html> <head> <title>Test Country and State</title> <!-- <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> --> </head> <body> <h3 align="center" style="{color: #80c0ff;}">Test Country and State</h3> <form action="/search/local/sites/<tmpl_var name=run_mode>" name="search"> <table align="center"> <tr> <th>Country (Encoding: <tmpl_var name=encoding>)</th> </tr> <tmpl_loop name=country_loop><tr><th><tmpl_var name=name></th></tr> </tmpl_loop> </table> </body> </html> -- Ron Savage [EMAIL PROTECTED] http://savage.net.au/index.html ##### CGI::Application community mailing list ################ ## ## ## To unsubscribe, or change your message delivery options, ## ## visit: http://www.erlbaum.net/mailman/listinfo/cgiapp ## ## ## ## Web archive: http://www.erlbaum.net/pipermail/cgiapp/ ## ## Wiki: http://cgiapp.erlbaum.net/ ## ## ## ################################################################