Hi all!

Our company has a backoffice project written on C++ ( Qt ) for Linux
by my department. But nessesity appear's to make WEB interface, with all
functions which our C++ program does. Now I have to choose among a lot
of languages and technologies of WEB development.

I have a lot of experience with perl, and we already have an Apache
2 WEB server, so first, I look at mod_perl. Reading documentation and
making some practice with mod_perl, I didn't find ( or understand ) how
to solve some, for my point of view, standart tasks.

1. Reading form parameters ( i.e. POST data of request header ).

I have already read 'perldoc Apache2::RequestRec' about bucket
brigades to get POST data, but I think that it's to difficult for such
simple task, and may be there is another solution ? Here is mine, which
I wrote, before I found "bucket brigades" variant:

======= Part of httpd.conf BEGIN =======

PerlModule Promtelecom::PostDataParser

PerlHeaderParserHandler Promtelecom::PostDataParser


======= Part of httpd.conf END =======

======= PostDataParser.pm BEGIN =======

package Promtelecom::PostDataParser;

use strict;
use Apache2::Const -compile => qw( OK );

my %post_data = ();

sub handler {
my $r = shift;

if( $r->method eq "POST" ) {
my $content = "";
$r->read( $content, $r->headers_in()->get( 'Content-length' ) );

foreach my $pair ( split( /[&;]/, $content ) ) {
my ( $key, $value ) = split( '=', $pair, 2 );
$Promtelecom::PostDataParser:ost_data{ $key } = $value;
}
}

return Apache2::Const::OK;
}

1;

======= PostDataParser.pm END =======

Here I parse POST data into "post_data" hash. So, I can access to
values of this hash from other handlers like this:
$Promtelecom::PostDataParser:ost_data{"key"}

So, the question is: am I right ? This solution works, but I don't
know if its enough right for mod_perl programming style and architecture.

2. Result of first question Sessions.

As I understand, I need session to save ( restore ) user data
between requests. What for ? Now I'll try to explain.

Here is my another try to work with mod_perl Simple
Authentication handle, which takes login user and password and try to
make a Database connection. If connection was established - then
Authentication passed,else - not.


======= PostDataParser.pm BEGIN =======
package Promtelecom::Authentication;

use strict;
use Apache2::Const -compile => qw(OK HTTP_UNAUTHORIZED);

$Apache:BI:EBUG = 1;

my $user = '';
my $password = '';

sub handler {
my $r = shift;

my $status = 0;
( $status, $Promtelecom::Authentication:assword ) =
$r->get_basic_auth_pw;
return $status unless $status == Apache2::Const::OK;

$Promtelecom::Authentication::user = $r->user;

my $dbh = DBI->connect( 'dbi:Pg:dbname=database;host=database',
$Promtelecom::Authentication::user,
$Promtelecom::Authentication:assword, { AutoCommit => 0 } );

return Apache2::Const::OK if defined $dbh;

return Apache2::Const::HTTP_UNAUTHORIZED;
}

1;
======= PostDataParser.pm END =======

So, why I need session's or pnote's for passing data between handlers if
I can make vars like $Promtelecom::Authentication:assword and
$Promtelecom::Authentication::login and access them from other handlers?

3. Database persistant connection.

As I understand, such possibility I can get only using Apache:BI
module. So, here is my httpd.conf:

======= Part of httpd.conf BEGIN =======

PerlModule Apache:BI
PerlModule Promtelecom::Authentication
PerlModule Promtelecom::PostDataParser

PerlAuthenHandler Promtelecom::Authentication
AuthType Basic
AuthName "Promtelecom Network"
Require valid-user
PerlHeaderParserHandler Promtelecom::PostDataParser


PerlModule Promtelecom:ebitor

SetHandler perl-script
PerlHandler Promtelecom:ebitor


======= Part of httpd.conf END =======

You have already seen my Promtelecom::Authentication module ( question 2
), so here is a simple code of Promtelecom:ebitor:

======= PostDataParser.pm BEGIN =======

package Promtelecom:ebitor;

use strict;
use Apache2::Const -compile => qw( OK );


sub handler {
my $r = shift;

my $dbh = DBI->connect( 'dbi:Pg:dbname=database;host=database',
$Promtelecom::Authentication::user,
$Promtelecom::Authentication:assword, { AutoCommit => 0 } );

return Apache2::Const::OK;
}

1;

======= PostDataParser.pm END =======

So, here is what I'm waiting from mod_perl:

1. Client open browser and enter address http://myserver/debitor
2. Apache ( on myserver ) get the request, and call's PerlAuthenHandler
Promtelecom::Authentication
3. Client get then window with login and password line edits.
4. Client enters login and password.
5. Promtelecom::Authentication gets client's login and password and try
to set database connection using these datas.

In /var/log/apache2/error_log I see something like:

11836 Apache:BI new connect to
'dbname=database;host=databaseuserpasswordAutoComm it=0PrintError=1Username=user'

6. If connection established, Apache calls PerlHandler Promtelecom:ebitor
7. Here I think that Apache:BI will see that
Promtelecom::Authentication already established database connection with
same parameters and returns me this connection, but I see new string in
err_log here:

11838 Apache:BI new connect to
'dbname=database;host=databaseuserpasswordAutoComm it=0PrintError=1Username=user'

Where is a mistake ?

Best regards,
Vladimir S. Tikhonjuk