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/                 ##
##                                                            ##
################################################################

Reply via email to