You are viewing a plain text version of this content. The canonical link for it is here.
Posted to modperl@perl.apache.org by "Desilets, Alain" <Al...@nrc-cnrc.gc.ca> on 2011/12/01 23:16:22 UTC

CGI::Utils->getSelfRefUrlWithQuery() not working inside mod_perl?

Trying to migrate a complex script from a standard CGI context to a mod_perl context, and am having a hell of a time. The latest problem is that I have a call to GCI::Utils->getSelfRefUrlWithQuery() which causes a crash.

In an attempt to isolate the problem, I wrote this short script which does nothing more than call that method:

--------------
#!perl -w
use strict;
print "Content-type: text/plain\r\n\r\n";
use CGI::Utils;
my $self_url = '';
print "Before calling get_self_ref_url_with_query()\n";
#no strict;
my $cgi_utils = CGI::Utils->new();
$self_url = $cgi_utils->getSelfRefUrlWithQuery();
#$self_url = $cgi_utils->get_self_ref_url_with_query();
#$self_url = CGI::Utils->getSelfRefUrlWithQuery();
#$self_url = CGI::Utils->getSelfRefUrlWithQuery();
#use strict;
---------------

When I run it, I get the following error:

[Thu Dec 01 17:04:21 2011] [error] Can't use string ("HTML::Mason::Commands::m") as a SCALAR ref while "strict refs" in use at C:/Perl/site/lib/CGI/Utils.pm line 203.\n

If I comment out the call to getSelfRefUrlWithQuery(), then the script runs fine.

I have tried calling that method in four different ways (as CGI::Utils-> or $cgi_utils->, with the underscore or hungarian notation variants), with or without 'no strict'. All of those combinations fail.

I tried running this script as a ModPerl::Registry or a ModPerl::PerlRun mode, and neither ones work.

Is getSelfUrlWithQuery() a method that can't be used in a mod_perl context? If so, how can I get the URL fo the current script call?

Thx

Alain Désilets

RE: CGI::Utils->getSelfRefUrlWithQuery() not working inside mod_perl?

Posted by "Desilets, Alain" <Al...@nrc-cnrc.gc.ca>.
Thx André! All your suggestions worked. 

I decided to go with cgi->url(-path_info=>1,-query=>1);

Alain

-----Original Message-----
From: André Warnier [mailto:aw@ice-sa.com] 
Sent: Friday, December 02, 2011 4:24 AM
To: mod_perl list
Subject: Re: CGI::Utils->getSelfRefUrlWithQuery() not working inside mod_perl?

Desilets, Alain wrote:
> Trying to migrate a complex script from a standard CGI context to a mod_perl context, and am having a hell of a time. The latest problem is that I have a call to GCI::Utils->getSelfRefUrlWithQuery() which causes a crash.
> 
> In an attempt to isolate the problem, I wrote this short script which does nothing more than call that method:
> 
> --------------
> #!perl -w
> use strict;
> print "Content-type: text/plain\r\n\r\n";
> use CGI::Utils;
> my $self_url = '';
> print "Before calling get_self_ref_url_with_query()\n";
> #no strict;
> my $cgi_utils = CGI::Utils->new();
> $self_url = $cgi_utils->getSelfRefUrlWithQuery();
> #$self_url = $cgi_utils->get_self_ref_url_with_query();
> #$self_url = CGI::Utils->getSelfRefUrlWithQuery();
> #$self_url = CGI::Utils->getSelfRefUrlWithQuery();
> #use strict;
> ---------------
> 
> When I run it, I get the following error:
> 
> [Thu Dec 01 17:04:21 2011] [error] Can't use string ("HTML::Mason::Commands::m") as a SCALAR ref while "strict refs" in use at C:/Perl/site/lib/CGI/Utils.pm line 203.\n
> 
> If I comment out the call to getSelfRefUrlWithQuery(), then the script runs fine.
> 
> I have tried calling that method in four different ways (as CGI::Utils-> or $cgi_utils->, with the underscore or hungarian notation variants), with or without 'no strict'. All of those combinations fail.
> 
> I tried running this script as a ModPerl::Registry or a ModPerl::PerlRun mode, and neither ones work.
> 
> Is getSelfUrlWithQuery() a method that can't be used in a mod_perl context? If so, how can I get the URL fo the current script call?
> 

I have no idea about the error above, but
staying with CGI::Utils, you may also want to try passing the request object directly to 
CGI::Utils->new, as follows :

my $r = shift;
my $params = { 'apache_request' => $r };
my $cgi_utils = CGI::Utils->new( $params );

and see if that works better.

You may also want to have a look at this, to replace that particular function with the 
equivalent one from CGI.pm :
http://search.cpan.org/~markstos/CGI.pm-3.58/lib/CGI.pm#CREATING_A_SELF-REFERENCING_URL_THAT_PRESERVES_STATE_INFORMATION:
(and the next one). In other words, try this :

#!perl -w
use strict;
print "Content-type: text/plain\r\n\r\n";
use CGI;
my $cgi = CGI->new();
my $self_url = $cgi->url(-path_info=>1,-query=>1);

The CGI.pm module "knows" that it is running under mod_perl, and will automatically 
retrieve the Apache::RequestRec object.


Later, also have a look at this :
http://httpd.apache.org/apreq/docs/libapreq2/
(which is an Apache add-on module which provides much of the functionality of CGI.pm, and 
in a mod_perl context, probably more efficiently).

I do not remember on which platform you are working, but on my Linux Debian platforms, 
installing it is as easy as :
apt-get install libapache2-mod-apreq2


Re: CGI::Utils->getSelfRefUrlWithQuery() not working inside mod_perl?

Posted by André Warnier <aw...@ice-sa.com>.
Desilets, Alain wrote:
> Trying to migrate a complex script from a standard CGI context to a mod_perl context, and am having a hell of a time. The latest problem is that I have a call to GCI::Utils->getSelfRefUrlWithQuery() which causes a crash.
> 
> In an attempt to isolate the problem, I wrote this short script which does nothing more than call that method:
> 
> --------------
> #!perl -w
> use strict;
> print "Content-type: text/plain\r\n\r\n";
> use CGI::Utils;
> my $self_url = '';
> print "Before calling get_self_ref_url_with_query()\n";
> #no strict;
> my $cgi_utils = CGI::Utils->new();
> $self_url = $cgi_utils->getSelfRefUrlWithQuery();
> #$self_url = $cgi_utils->get_self_ref_url_with_query();
> #$self_url = CGI::Utils->getSelfRefUrlWithQuery();
> #$self_url = CGI::Utils->getSelfRefUrlWithQuery();
> #use strict;
> ---------------
> 
> When I run it, I get the following error:
> 
> [Thu Dec 01 17:04:21 2011] [error] Can't use string ("HTML::Mason::Commands::m") as a SCALAR ref while "strict refs" in use at C:/Perl/site/lib/CGI/Utils.pm line 203.\n
> 
> If I comment out the call to getSelfRefUrlWithQuery(), then the script runs fine.
> 
> I have tried calling that method in four different ways (as CGI::Utils-> or $cgi_utils->, with the underscore or hungarian notation variants), with or without 'no strict'. All of those combinations fail.
> 
> I tried running this script as a ModPerl::Registry or a ModPerl::PerlRun mode, and neither ones work.
> 
> Is getSelfUrlWithQuery() a method that can't be used in a mod_perl context? If so, how can I get the URL fo the current script call?
> 

I have no idea about the error above, but
staying with CGI::Utils, you may also want to try passing the request object directly to 
CGI::Utils->new, as follows :

my $r = shift;
my $params = { 'apache_request' => $r };
my $cgi_utils = CGI::Utils->new( $params );

and see if that works better.

You may also want to have a look at this, to replace that particular function with the 
equivalent one from CGI.pm :
http://search.cpan.org/~markstos/CGI.pm-3.58/lib/CGI.pm#CREATING_A_SELF-REFERENCING_URL_THAT_PRESERVES_STATE_INFORMATION:
(and the next one). In other words, try this :

#!perl -w
use strict;
print "Content-type: text/plain\r\n\r\n";
use CGI;
my $cgi = CGI->new();
my $self_url = $cgi->url(-path_info=>1,-query=>1);

The CGI.pm module "knows" that it is running under mod_perl, and will automatically 
retrieve the Apache::RequestRec object.


Later, also have a look at this :
http://httpd.apache.org/apreq/docs/libapreq2/
(which is an Apache add-on module which provides much of the functionality of CGI.pm, and 
in a mod_perl context, probably more efficiently).

I do not remember on which platform you are working, but on my Linux Debian platforms, 
installing it is as easy as :
apt-get install libapache2-mod-apreq2


RE: CGI::Utils->getSelfRefUrlWithQuery() not working inside mod_perl?

Posted by "Desilets, Alain" <Al...@nrc-cnrc.gc.ca>.
BTW, according to the doc for CGI::Utils->new(), the constructor works in mod_perl provided that the Apache request object is passed as argument, or can be retrieved via Apache->request or Apache2::RequestUtil->request.

So, I updated my script to verify that Apache2::RequestUtil->request does indeed return a valid request. When I print the returned instance, it says:

   Apache2::RequestRec=SCALAR(0x485052c)

which indicates that it is indeed a scalar that is blessed into the RequestRec class.


________________________________________
From: Desilets, Alain
Sent: Thursday, December 01, 2011 5:16 PM
To: modperl@perl.apache.org
Subject: CGI::Utils->getSelfRefUrlWithQuery() not working inside mod_perl?

Trying to migrate a complex script from a standard CGI context to a mod_perl context, and am having a hell of a time. The latest problem is that I have a call to GCI::Utils->getSelfRefUrlWithQuery() which causes a crash.

In an attempt to isolate the problem, I wrote this short script which does nothing more than call that method:

--------------
#!perl -w
use strict;
print "Content-type: text/plain\r\n\r\n";
use CGI::Utils;
my $self_url = '';
print "Before calling get_self_ref_url_with_query()\n";
#no strict;
my $cgi_utils = CGI::Utils->new();
$self_url = $cgi_utils->getSelfRefUrlWithQuery();
#$self_url = $cgi_utils->get_self_ref_url_with_query();
#$self_url = CGI::Utils->getSelfRefUrlWithQuery();
#$self_url = CGI::Utils->getSelfRefUrlWithQuery();
#use strict;
---------------

When I run it, I get the following error:

[Thu Dec 01 17:04:21 2011] [error] Can't use string ("HTML::Mason::Commands::m") as a SCALAR ref while "strict refs" in use at C:/Perl/site/lib/CGI/Utils.pm line 203.\n

If I comment out the call to getSelfRefUrlWithQuery(), then the script runs fine.

I have tried calling that method in four different ways (as CGI::Utils-> or $cgi_utils->, with the underscore or hungarian notation variants), with or without 'no strict'. All of those combinations fail.

I tried running this script as a ModPerl::Registry or a ModPerl::PerlRun mode, and neither ones work.

Is getSelfUrlWithQuery() a method that can't be used in a mod_perl context? If so, how can I get the URL fo the current script call?

Thx

Alain Désilets