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
-~----------~----~----~----~------~----~------~--~---