[jifty-devel] canonicalize_ ajax call not doing the right thing

Shawn M Moore sartak at bestpractical.com
Mon Jan 14 19:20:43 EST 2008


On Wed, Jan 09, 2008 at 12:27:47PM +0100, Peter Mottram wrote:
> Jesse Vincent wrote:
> >Peter Mottram wrote:
> >>I'm seeing some weirdness when using canonicalize_ inside my model as
> >>there is a difference between how the ajax call handles things (badly)
> >>and how the final POST request handles things (correctly).
> >>
> >>Here's an extract of the relevant parts of my model:
> >
> >>So the ajax validator sees an empty value! If I enter somthing nice and
> >>simple like '45th e4' then the result via ajax is correct as it returns
> >>'45THE4'.
> >>
> >>Could someone please point me in the right direction as to where to
> >>start poking around in the Jifty code?
> >
> >I'd definitely start with the firebug XmlHttpRequest logging to see
> >what's being posted to the server. Is the problem on the js side or the
> >perl side?
> 
> Checking with firebug shows a perl problem since the failing canonicalize 
> does not get an 'update' returned to js in the xml.
> 
> >From there, it should be pretty easy to add a model to the
> >jifty TestApp and a small test file which reproduces the problem using
> >Test::WWW:Mechanize. Once you've done that, send a patch to jifty-devel,
> >and make it all our problem ;)
> 
> I have attached a patch which includes a test case which passes and also 
> one that fails. I added the tests to 06-validation.t rather than creating 
> a new test file - hope that is OK.
> 
> Cheers
> PeteM

Hi Pete,

I looked into it, and the problem is specifically the ';' character. CGI
is intepreting that as a delimiter (as per RFC 3986). That's why
the canonicalize_column_1 method is being called with the empty string.
Here's what the action's arguments looks like to Jifty:

$HASH1 = {
           f              => '',
           "J:A-canontest"
                          => 'TestApp::Action::CreateCanonTest',
           "J:A:F-column_1-canontest"
                          => '',
           "J:VALIDATE"   => 1
};

This explains the test failures: the parameter needs to be '%3Bf'
instead of ';f'. Changing that causes the two tests to pass.

However, it doesn't explain the behavior you were seeing. jifty.js does
percent-encode the parameter correctly. Are you running an old version?
Does it fail on standalone?

Shawn


More information about the jifty-devel mailing list