Is there a better way to reset CGI object for AJAX POSTDATA?

Is there a better way to reset CGI object for AJAX POSTDATA?

am 22.12.2007 00:10:53 von el.dodgero

Currently I'm doing this:

use CGI();
my $cgi = new CGI;
$cgi = new CGI($cgi->param('POSTDATA'));

.... in order to get the data an XMLHTTPRequest object sends through on
a POST request, because everything goes under the POSTDATA param as a
query string. AND can I just say... Yuck!

Anyway, my solution seems kludgy and I don't like it. It smells funny.

CGI.pm docs mention a class method restore_parameters() that works
like so:
open (IN,"test.in") || die;
restore_parameters(IN);
close IN;
....but there's no other mention of it, and no mention of an object
method. I can't stand using the functional interface for CGI.pm.

Isn't there any way to just reset an existing CGI object directly
without calling the constructor all over again?

--
Sean 'Dodger' Cannon

Re: Is there a better way to reset CGI object for AJAX POSTDATA?

am 22.12.2007 00:27:02 von el.dodgero

On Dec 21, 3:10 pm, Dodger wrote:
> Currently I'm doing this:
>
> use CGI();
> my $cgi = new CGI;
> $cgi = new CGI($cgi->param('POSTDATA'));
>
> ... in order to get the data an XMLHTTPRequest object sends through on
> a POST request, because everything goes under the POSTDATA param as a
> query string. AND can I just say... Yuck!
>
> Anyway, my solution seems kludgy and I don't like it. It smells funny.
>
> CGI.pm docs mention a class method restore_parameters() that works
> like so:
> open (IN,"test.in") || die;
> restore_parameters(IN);
> close IN;
> ...but there's no other mention of it, and no mention of an object
> method. I can't stand using the functional interface for CGI.pm.
>
> Isn't there any way to just reset an existing CGI object directly
> without calling the constructor all over again?
>
> --
> Sean 'Dodger' Cannon

Actually, even that's not working right. Dammit.
According to the docs, I can create a new CGI object with a properly
formatted query string as an argument and *those* params are supposed
to be what it parses.

Quoth the docs:
"or from a properly formatted, URL-escaped query string:

$query = new CGI('dinosaur=barney&color=purple');"

But if I try this, and even if I am VERY careful to make sure it's in
scalar context:

use CGI();
my $cjax = new CGI;
my $POSTDATA = $cjax->param('POSTDATA');
undef $cjax;

my $cgi = new CGI($POSTDATA);

I still get back:
print join ', ', $cgi->param();
prints:
POSTDATA

So WTF??

Re: Is there a better way to reset CGI object for AJAX POSTDATA?

am 22.12.2007 00:29:39 von el.dodgero

On Dec 21, 3:27 pm, Dodger wrote:
> On Dec 21, 3:10 pm, Dodger wrote:
>
>
>
> > Currently I'm doing this:
>
> > use CGI();
> > my $cgi = new CGI;
> > $cgi = new CGI($cgi->param('POSTDATA'));
>
> > ... in order to get the data an XMLHTTPRequest object sends through on
> > a POST request, because everything goes under the POSTDATA param as a
> > query string. AND can I just say... Yuck!
>
> > Anyway, my solution seems kludgy and I don't like it. It smells funny.
>
> > CGI.pm docs mention a class method restore_parameters() that works
> > like so:
> > open (IN,"test.in") || die;
> > restore_parameters(IN);
> > close IN;
> > ...but there's no other mention of it, and no mention of an object
> > method. I can't stand using the functional interface for CGI.pm.
>
> > Isn't there any way to just reset an existing CGI object directly
> > without calling the constructor all over again?
>
> > --
> > Sean 'Dodger' Cannon
>
> Actually, even that's not working right. Dammit.
> According to the docs, I can create a new CGI object with a properly
> formatted query string as an argument and *those* params are supposed
> to be what it parses.
>
> Quoth the docs:
> "or from a properly formatted, URL-escaped query string:
>
> $query = new CGI('dinosaur=barney&color=purple');"
>
> But if I try this, and even if I am VERY careful to make sure it's in
> scalar context:
>
> use CGI();
> my $cjax = new CGI;
> my $POSTDATA = $cjax->param('POSTDATA');
> undef $cjax;
>
> my $cgi = new CGI($POSTDATA);
>
> I still get back:
> print join ', ', $cgi->param();
> prints:
> POSTDATA
>
> So WTF??


BTW -- yes, POSTDATA taken as a param does contain a properly
formatted string, like so:

POSTDATA: pixel=43:62:yellow:8&pixel=43:65:yellow:8&pixel=43:76:yellow :
8&pixel=43:84:yellow:8&pixel=45:94:yellow:8&pixel=45:98:yell ow:
8&pixel=45:102:yellow:8...etc...

So the string is right. I should definitely not need to write this to
a file, and honestly if the docs are being wrong about this part, I
don't expect them to br right about reading from a file, either.

Re: Is there a better way to reset CGI object for AJAX POSTDATA?

am 22.12.2007 12:20:07 von paduille.4061.mumia.w+nospam

On 12/21/2007 05:29 PM, Dodger wrote:
> On Dec 21, 3:27 pm, Dodger wrote:
>> On Dec 21, 3:10 pm, Dodger wrote:
>>
>>
>>
>>> Currently I'm doing this:
>>> use CGI();
>>> my $cgi = new CGI;
>>> $cgi = new CGI($cgi->param('POSTDATA'));
>>> ... in order to get the data an XMLHTTPRequest object sends through on
>>> a POST request, because everything goes under the POSTDATA param as a
>>> query string. AND can I just say... Yuck!
>>> Anyway, my solution seems kludgy and I don't like it. It smells funny.
>>> CGI.pm docs mention a class method restore_parameters() that works
>>> like so:
>>> open (IN,"test.in") || die;
>>> restore_parameters(IN);
>>> close IN;
>>> ...but there's no other mention of it, and no mention of an object
>>> method. I can't stand using the functional interface for CGI.pm.
>>> Isn't there any way to just reset an existing CGI object directly
>>> without calling the constructor all over again?
>>> --
>>> Sean 'Dodger' Cannon
>> Actually, even that's not working right. Dammit.
>> According to the docs, I can create a new CGI object with a properly
>> formatted query string as an argument and *those* params are supposed
>> to be what it parses.
>>
>> Quoth the docs:
>> "or from a properly formatted, URL-escaped query string:
>>
>> $query = new CGI('dinosaur=barney&color=purple');"
>>
>> But if I try this, and even if I am VERY careful to make sure it's in
>> scalar context:
>>
>> use CGI();
>> my $cjax = new CGI;
>> my $POSTDATA = $cjax->param('POSTDATA');
>> undef $cjax;
>>
>> my $cgi = new CGI($POSTDATA);
>>
>> I still get back:
>> print join ', ', $cgi->param();
>> prints:
>> POSTDATA
>>
>> So WTF??
>
>
> BTW -- yes, POSTDATA taken as a param does contain a properly
> formatted string, like so:
>
> POSTDATA: pixel=43:62:yellow:8&pixel=43:65:yellow:8&pixel=43:76:yellow :
> 8&pixel=43:84:yellow:8&pixel=45:94:yellow:8&pixel=45:98:yell ow:
> 8&pixel=45:102:yellow:8...etc...
>
> So the string is right. I should definitely not need to write this to
> a file, and honestly if the docs are being wrong about this part, I
> don't expect them to br right about reading from a file, either.

I have no business trying to answer since I barely know what going on,
but I'll throw caution to the wind and answer anyway.

I see three potential problems: (1) rogue newlines (which were probably
not part of the original data), and (2) CGI.pm likes to concatenate
values for parameters with the same name, and (3) the ->new() method
can set and entire query object, but param() cannot. Also some POSTDATA
reformatting is probably in order:

#!/usr/bin/perl
use strict;
use warnings;
use CGI ();
use Data::Dumper;

my $POSTDATA = do {
local $/;
my $px = 1;
my $pd = ;
$pd =~ s/\s+//g;
$pd =~ s/pixel/'pixel'.($px++)/eg;
$pd;
};
my $cjax = new CGI($POSTDATA);
print Dumper({$cjax->Vars});


__DATA__
pixel=43:62:yellow:8&pixel=43:65:yellow:8&pixel=43:76:yellow :
8&pixel=43:84:yellow:8&pixel=45:94:yellow:8&pixel=45:98:yell ow:
8&pixel=45:102:yellow:8

Note, I used your original postdata as displayed in my
newsreader--newlines and all.

__HTH__

Re: Is there a better way to reset CGI object for AJAX POSTDATA?

am 22.12.2007 12:52:58 von paduille.4061.mumia.w+nospam

On 12/21/2007 05:29 PM, Dodger wrote:
>
> BTW -- yes, POSTDATA taken as a param does contain a properly
> formatted string, like so:
>
> POSTDATA: pixel=43:62:yellow:8&pixel=43:65:yellow:8&pixel=43:76:yellow :
> 8&pixel=43:84:yellow:8&pixel=45:94:yellow:8&pixel=45:98:yell ow:
> 8&pixel=45:102:yellow:8...etc...
>
> So the string is right. I should definitely not need to write this to
> a file, and honestly if the docs are being wrong about this part, I
> don't expect them to br right about reading from a file, either.

I forgot that CGI.pm can handle multiple values for the same parameter
quite nicely:

#!/usr/bin/perl
use strict;
use warnings;
use CGI ();

my $POSTDATA = do {
local $/;
my $pd = ;
$pd =~ s/\s+//g;
$pd;
};
my $cjax = new CGI($POSTDATA);
my @pixels = $cjax->param('pixel');
print $_, "\n" for @pixels;

__DATA__
pixel=43:62:yellow:8&pixel=43:65:yellow:8&pixel=43:76:yellow :
8&pixel=43:84:yellow:8&pixel=45:94:yellow:8&pixel=45:98:yell ow:
8&pixel=45:102:yellow:8