Wow ... I didn't know that about the content-type of the response body.  
Thanks.
 - Dash -

Tom Gregory wrote:
> The value of the X-JSON header and whether the response body is  
> evaluated are separate concerns. If the X-JSON header is present, and  
> evals to a json object, it's passed as the second parameter to  
> onSuccess, et al.
>
> e.x.
> onSuccess (transport, json) {
>    // ...
> }
>
> The eval of the response body is based on the "Content-type" header.   
> If you poke around the code from svn, you'll find these lines in  
> ajax.js:
>
>        var contentType = this.getHeader('Content-type');
>        if (contentType && contentType.strip().
>          match(/^(text|application)\/(x-)?(java|ecma)script(;.*)?$/i))
>            this.evalResponse();
> // ...
>
> // ...
> evalResponse: function() {
>      try {
>        return eval((this.transport.responseText || '').unfilterJSON());
>      } catch (e) {
>        this.dispatchException(e);
>      }
>    }
>
> Does that make things any clearer?
>
>
> TAG
>
> On May 21, 2007, at 12:38 PM, Stephan Ellis wrote:
>
>   
>> Yes, my framework, specifically my view that generates JSON sticks  
>> the X-JSON header in to accommodate prototype.  I guess to rephrase  
>> my question, if I turn on the X-JSON header, is it supposed to  
>> automatically eval the response body?  Sorry if I seem like I have  
>> a thick skull :)  Thanks a bunch...
>> -stephan
>>
>> On 5/21/07, David Dashifen Kees <[EMAIL PROTECTED]> wrote:
>>
>> Yes.  If your JSON is in the response body, you will have to  
>> evaluate it
>> yourself.  It must be the framework you're using which is creating the
>> X-JSON header, perhaps?  For example:
>>
>> new Ajax.Request("some_page.php", {
>>     parameters: {id: 6},
>>     onComplete: function(xhr) {
>>        var json = xhr.responseText.evalJSON(true);
>>        /* ... do something else ... */
>>     }
>> });
>>
>> You're responseText should then be valid JSON.  For more information,
>> see http://prototypejs.org/api/string/evaljson.
>>
>> - Dash -
>>
>> Stephan Ellis wrote:
>>     
>>> Dash,
>>>   Thanks for the reply.  Are you saying that I have to evaluate the
>>> reponseText myself if the JSON is in the response body?  I  
>>>       
>> configured my
>>     
>>> application to not send the X-JSON header, but prototype is still  
>>>       
>> not
>>     
>>> evaluating the response body.
>>>
>>> Thanks,
>>> -stephan
>>>
>>> On 5/21/07, David Dashifen Kees <[EMAIL PROTECTED]> wrote:
>>>
>>>       
>>>> The problem is how you're sending information in the X-JSON header.
>>>> Prototype will try to automatically evaluate anything in the X-JSON
>>>> header assuming that it is a JSON string.  You're X-JSON header  
>>>>         
>> is not a
>>     
>>>> JSON string but rather another call to eval() so the internal  
>>>>         
>> Prototype
>>     
>>>> String.evalJSON() function is probably your failure point.
>>>>
>>>> Instead, either make "var json = transport.responseText.evalJSON 
>>>>         
>> (true)"
>>     
>>>> the first line of your callback function, or make sure that your  
>>>>         
>> X-JSON
>>     
>>>> header is *only* a JSON string.
>>>>
>>>> Also, you should be aware that Prototype 1.5.1 added security  
>>>>         
>> features
>>     
>>>> to help avoid the execution of JSON with invalid code or  
>>>>         
>> malicious code
>>     
>>>> within it.  As a result, JSON created and passed around by  
>>>>         
>> prototype has
>>     
>>>> /*-secure- before your JSON and */ after it.  If you use the
>>>> String.evalJSON() function to parse your information, you might  
>>>>         
>> need to
>>     
>>>> explicitly add these strings before and after your JSON to  
>>>>         
>> evaluate it
>>     
>>>> properly.
>>>>
>>>> - Dash -
>>>>
>>>> smellis wrote:
>>>>
>>>>         
>>>>> Hello Everyone,
>>>>>
>>>>>   I upgraded to 1.5.1 today and I have run into a problem:  
>>>>>           
>> automatic
>>     
>>>>> JSON evaluation has stopped working.  On the server side I use
>>>>> Catalyst, an MVC framework for perl.  I use  
>>>>>           
>> Catalyst::View::JSON to
>>     
>>>>> turn my perl data structures in to JSON.  Here is what my response
>>>>> headers look like:
>>>>>
>>>>> Response Headers
>>>>> Connection    close
>>>>> Date  Mon, 21 May 2007 15:12:54 GMT
>>>>> Content-Length        984
>>>>> Content-Type  application/javascript; charset=utf-8
>>>>> Set-Cookie     
>>>>>           
>> bg2_session=5279b9253f970f84dd032ec4a00ba2a34dcff66c;
>>     
>>>>> path=/; expires=Mon, 21-May-2007 17:12:54 GMT
>>>>> Status        200
>>>>> X-Catalyst    5.7007
>>>>> X-JSON        eval("("+this.transport.responseText+")")
>>>>>
>>>>> The JSON is actually in the response body.  I had to subclassed my
>>>>> JSON view to spit out application/javascript, because the default
>>>>> content-type (application/json) is not listed in the prototype
>>>>> documentation as one that will cause prototype to auto evaluate  
>>>>>           
>> the
>>     
>>>>> reponse.  I have tried turning off the X-JSON header to see if  
>>>>>           
>> that
>>     
>>>>> was a problem, but it still doesn't work.  Any ideas?  Thanks in
>>>>> advance. -stephan
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>           
>>>
>>>       
>
>
> >
>
>   

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups "Ruby 
on Rails: Spinoffs" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/rubyonrails-spinoffs?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to