[Seaside] Zinc-Seaside: Problem with POSTing UTF-8 JSON
Norbert Hartl
norbert at hartl.name
Fri Jun 28 06:51:59 UTC 2013
Am 27.06.2013 um 00:01 schrieb Sven Van Caekenberghe <sven at stfx.eu>:
> Hi Tomas,
>
> On 26 Jun 2013, at 22:46, Tomas Kukol <tomas.kukol at gmail.com> wrote:
>
>> Unbelievable, this code with Czech characters and MIME type set to text/json works well:
>>
>> GPRestfulHandler(WARestfulHandler)>>czechTestReal
>> <get>
>> <path: 'czechTestReal'>
>> <produces: 'text/json; charset=utf-8'>
>> ^ 'Czech is in Czech čeština.' asJson
>>
>> This code with Czech characters and MIME type set to application/json throws an error.
>>
>> GPRestfulHandler(WARestfulHandler)>>czechTestReal
>> <get>
>> <path: 'czechTestReal'>
>> <produces: 'application/json; charset=utf-8'>
>> ^ 'Czech is in Czech čeština.' asJson
>>
>> There is difference only in produces - text/json vs. application/json, but there are probably different stream - text vs. binary.
>
> Great that you found it !
>
> Indeed, consider:
>
> (WAMimeType fromString: 'text/json') isBinary. false
> (WAMimeType fromString: 'application/json') isBinary. true
>
> (ZnMimeType fromString: 'text/json') isBinary. false
> (ZnMimeType fromString: 'application/json') isBinary. false
>
> I made an explicit exception for application/json in ZnMimeType ;-)
>
Everytime I see text/binary issues when one talks about character encoding it feels like there is something really wrong! I think the concept of text/binary streams is a legacy thing that we need to get rid of.
Norbert
> Sven
>
>> Tomas
>>
>> On Wed, Jun 26, 2013 at 10:35 PM, Tomas Kukol <tomas.kukol at gmail.com> wrote:
>> Hello, guys. Thanks for a great help.
>>
>> I created these methods to check it:
>>
>> GPRestfulHandler(WARestfulHandler)>>executeResult: aRouteResult
>> | result |
>> self requestContext
>> respond: [ :response |
>> result := aRouteResult sendMessageTo: self.
>> response document: result mimeType: aRouteResult seasideMimeType ]
>>
>> 1) First one with simple Czech string:
>>
>> GPRestfulHandler(WARestfulHandler)>>czechTestReal
>> <get>
>> <path: 'czechTestReal'>
>> <produces: 'application/json; charset=utf-8'>
>> ^ 'Czech is in Czech čeština.' asJson
>>
>> 2) Second one with simple ascii string:
>>
>> GPRestfulHandler(WARestfulHandler)>>czechTestReal
>> <get>
>> <path: 'czechTestReal'>
>> <produces: 'application/json; charset=utf-8'>
>> ^ 'Czech is in Czech cestina.' asJson
>>
>> 1) In first case in executeResult: method in result variable is WideString 'Czech is in Czech čeština.'
>>
>> I can see on the screen this error although I have WAException filter set to WAWalbackErrorHandler.
>> Error: Improper store into indexable object
>> 2) In second case in executeResult: method in result variable is ByteString 'Czech is in Czech cestina.'
>> I can see on the screen expected result:
>> "Czech is in Czech cestina."
>> So, there must be somewhere a difference between ByteString and WideString conversion. I located the problem (thrown error) in this method:
>> ZnZincServerAdaptor>>responseFrom: aRequestContext
>>
>>
>>
>> | partialHeaders cookies fullHeaders seasideResponse contents entity contentType |
>>
>>
>>
>> seasideResponse := aRequestContext response.
>>
>>
>>
>> partialHeaders := seasideResponse headers.
>>
>>
>>
>> cookies := seasideResponse cookies.
>>
>>
>>
>> fullHeaders := ZnHeaders defaultResponseHeaders.
>>
>>
>>
>> partialHeaders keysAndValuesDo: [ :key :value |
>>
>>
>>
>> fullHeaders at: key put: value ].
>>
>>
>>
>> cookies do: [ :each |
>> fullHeaders at: 'Set-Cookie' add: each oldNetscapeString.
>> fullHeaders at: 'Set-Cookie2' add: each rfc2965String ].
>> contentType := seasideResponse contentType greaseString.
>> contents := seasideResponse contents. "<------------------------ HERE is the error signalled"
>> entity := (ZnEntity bytes: contents) contentType: contentType; yourself.
>> ^ ZnResponse new
>> statusLine: (ZnStatusLine code: seasideResponse status);
>>
>>
>>
>> headers: fullHeaders;
>> entity: entity;
>> yourself
>>
>>
>>
>>
>> Regards,
>>
>>
>>
>> Tomas
>>
>>
>> On Wed, Jun 26, 2013 at 7:28 PM, Sven Van Caekenberghe <sven at stfx.eu> wrote:
>>
>> On 26 Jun 2013, at 18:47, Philippe Marschall <philippe.marschall at gmail.com> wrote:
>>
>>> On Wed, Jun 26, 2013 at 6:37 PM, Sven Van Caekenberghe <sven at stfx.eu> wrote:
>>>> Tomas,
>>>>
>>>> I am not sure what one is supposed to return from #getUsers.
>>>>
>>>> Naively, I would guess just a [Wide]String with the <produces: 'application/json; charset=utf-8'> telling the Seaside-REST framework to do the right thing, but I just don't know.
>>>
>>> Yes it does/should, see
>>>
>>> WARestfulHandler/Filter >> #executeResult:
>>
>> I see. Tomas, can you trace in there and see what happens in your case ?
>>
>>> Cheers
>>> Philippe
>>> _______________________________________________
>>> seaside mailing list
>>> seaside at lists.squeakfoundation.org
>>> http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside
>>
>> _______________________________________________
>> seaside mailing list
>> seaside at lists.squeakfoundation.org
>> http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside
>>
>>
>> _______________________________________________
>> seaside mailing list
>> seaside at lists.squeakfoundation.org
>> http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside
>
> _______________________________________________
> seaside mailing list
> seaside at lists.squeakfoundation.org
> http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside
More information about the seaside
mailing list