So what it looks like to me is that the code that sets a content length if one 
is not set by the view is not dealing with unicode correctly.  I have another 
unicode issue I need to look at soonish so I try to see if we can get  a test 
case for this.  -jnap 

    On Wednesday, July 20, 2016 8:18 AM, Kroshka Yenot <trash...@cary.lv> wrote:
 

  >>> Looks like to a bug to me tl;dr   I'm not sure its a Catalyst bug or 
problem. It's may be MY configuration problem or standard violation
  
  Here are my investigation results
  
  I created a test to reproduce this situation 
  # catalyst.pl test # test/script/test_create.pl view HTML TT
  # [editor]      test/lib/test/Controller/Root.pm
  sub index :Path :Args(0)
 {
     my ( $self, $c ) = @_;
 
     my $json_text = '{"id":1, "msg":"В Питере пить"}';
     $c->response->content_type('application/json');
     $c->response->body($json_text);
 }
  
  and found following:
  
   wget -S -O - http://domain.tld:3000
 --2016-07-20 13:56:18--  http://domain.tld:3000/
 Resolving cary.lv (cary.lv)... aaa.bbb.ccc.ddd
 Connecting to domain.tld (domain.tld)|aaa.bbb.ccc.ddd|:3000... connected.
 HTTP request sent, awaiting response...
   HTTP/1.0 200 OK
   Date: Wed, 20 Jul 2016 10:56:18 GMT
   Server: HTTP::Server::PSGI
   Content-Type: application/json
   X-Catalyst: 5.90106
   Content-Length: 42
 Length: 42 [application/json]
 Saving to: 'STDOUT'
  
  content-Length is properly set. I see same using Firefox Dev tools
  but in the log (build-in test server log)
  [debug] Response Code: 200; Content-Type: application/json; Content-Length: 
unknown
  
  Exactly same code, but app works as fastcgi daemon and Apache/2.4.23 
(FreeBSD) serves http requests 
  # wget -S -O - http://domain.tld/
 --2016-07-20 15:02:28--  http://domain.tld/
 Resolving domain.tld (domain.tld)... aaa.bbb.ccc.ddd
 Connecting to domain.tld (domain.tld)|aaa.bbb.ccc.ddd|:80... connected.
 HTTP request sent, awaiting response...
   HTTP/1.1 200 OK
   Date: Wed, 20 Jul 2016 12:02:28 GMT
   Server: Apache
   Set-Cookie: lang=ru; path=/; expires=Thu, 20-Jul-2017 12:02:28 GMT
   Set-Cookie: sid=3b2b88c4106b5e06c0c24a5c3a513ccbcb939299; domain=domain.tld; 
path=/; expires=Wed, 20-Jul-2016 12:52:28 GMT; HttpOnly
   X-Catalyst: 5.90106
   Content-Length: 31
   Keep-Alive: timeout=5, max=100
   Connection: Keep-Alive
   Content-Type: application/json
 Length: 31 [application/json]
  
  Content length here is in chars not in bytes
  A solution by Aristotle Pagaltzis 
   $c->response->body(Encode::encode_utf8 $json_text); gives proper content 
length in this situation
  I'm getting same proper content length if I change content type to 
'text/html' 
  Finally, I've discovered Catalyst::View::JSON and it not only solved this 
problem for me, but also gave me a much more comfortable solution to work with 
json 
  $c->stash->{msg} = "В Питере пить";
 $c->stash->{id} = 1;
 $c->forward('View::JSON');
  Works like a charm
  
  Taking this opportunity, thank you for this lovely framework! I'll be happy 
to provide any additional information if you still consider there is something 
should be fixed
  
  
  
 
 
 
 19.07.2016 19:10, John Napiorkowski пишет:
  
  Looks like to a bug to me, although I'm not personally keen on the auto 
length setting in Catalyst it should be corrected.  I'm happy to get a patch, 
or at the very least give me a broken test case (checkout 
https://github.com/perl-catalyst/catalyst-runtime/blob/master/t/utf_incoming.t  
  and see if you can help me figure it out -jnap 
  (created an issues for this, 
_https://github.com/perl-catalyst/catalyst-runtime/issues/143 
  
  
  
 
      On Friday, July 15, 2016 6:07 AM, Kroshka Yenot <trash...@cary.lv> wrote:
  
 
    Hi! if content type is 'application/json' or 'application/json; 
charset=utf-8' Catalyst sets content length in chars, NOT IN BYTES and I'm  
getting 
  {"id":1, "msg":"В Питере if content type is 'text/html' Catalyst sets content 
length in bytes (properly) and everything works fine
  Is there any workaround to configure this behaviour, except setting content 
length manually everytime ?
  
  my $json_text = '{"id":1, "msg":"В Питере пить"}';
  $c->response->content_type('application/json');
 $c->response->content_length(bytes::length $json_text);
 $c->response->body($json_text);
  Thanks in advance
  
    
 _______________________________________________
 List: Catalyst@lists.scsys.co.uk
 Listinfo: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst
 Searchable archive: http://www.mail-archive.com/catalyst@lists.scsys.co.uk/
 Dev site: http://dev.catalyst.perl.org/
 
 
      
  
 _______________________________________________
List: Catalyst@lists.scsys.co.uk
Listinfo: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst
Searchable archive: http://www.mail-archive.com/catalyst@lists.scsys.co.uk/
Dev site: http://dev.catalyst.perl.org/
 
 
 
_______________________________________________
List: Catalyst@lists.scsys.co.uk
Listinfo: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst
Searchable archive: http://www.mail-archive.com/catalyst@lists.scsys.co.uk/
Dev site: http://dev.catalyst.perl.org/


  
_______________________________________________
List: Catalyst@lists.scsys.co.uk
Listinfo: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst
Searchable archive: http://www.mail-archive.com/catalyst@lists.scsys.co.uk/
Dev site: http://dev.catalyst.perl.org/

Reply via email to