[cgiapp] Problem displaying French, sometimes
Ron Savage
ron at savage.net.au
Fri Sep 5 20:51:14 EDT 2008
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 <ron at savage.net.au>
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
ron at savage.net.au
http://savage.net.au/index.html
More information about the cgiapp
mailing list