ZF-6218: Invalid chunk size in Zend_Http_Client_Adapter_Socket problem with strlen
Description
In some cases Zend_Http_Client_Adapter_Socket fails to correctly read chunked answer from server. I figured out this on one server with PHP 5.2.5 (as I can remember). The problem was with strlen function - it returns not actual bytes in string and makes problem with reading chunk. I suggest to use ftell function instead of relying on strlen.
Here is my patch for Zend/Http/Client/Adapter/Socket.php (Zend Framework 1.7.8).
265,267c265,267
< $left_to_read = $chunksize;
< while ($left_to_read > 0) {
< $line = @fread($this->socket, $left_to_read);
---
> $read_to = ftell($this->socket) + $chunksize;
> while ($read_to > ftell($this->socket)) {
> $line = @fread($this->socket, $read_to - ftell($this->socket));
273d272
< $left_to_read -= strlen($line);
P.S. I know that PHP is binary safe but I can't explain error with strlen function (or fread?) on that server (it's not mine and with suhosin patch), but this patch works for me fine.
Comments
Posted by Chris Kings-Lynne (chriskl) on 2009-05-23T03:01:39.000+0000
This is because mbstring.func_overload is in use, and the website contains multibyte characters. I cannot use Zend_Http_Client against any Chinese website, eg. www.google.cn.
Working on another patch...
Posted by Chris Kings-Lynne (chriskl) on 2009-05-23T03:35:33.000+0000
Hmm needs a fix in ->getBody() of the response object too...
Posted by Chris Kings-Lynne (chriskl) on 2009-05-23T03:40:26.000+0000
Patch to fix chunked encoding
Posted by Shahar Evron (shahar) on 2009-07-24T08:41:43.000+0000
To be more accurate, this happens when: - mbstring is loaded - mbstring.func_overload & 2 - mbstring.internal_encoding is a multibyte-encoding
This is pretty hard to reproduce for those who don't have that setup - but I've added some unit tests that catch this (given the right php.ini configuration) and will look into solving this. This is actually a bigger problem, and affects several other places in Zend_Http and Zend_Uri. It was solved for Zend_OpenId by implementing a dedicated strlen() wrapper (see Zend_OpenId::strlen())
Posted by Shahar Evron (shahar) on 2009-07-24T11:26:47.000+0000
Resolved in rev. 17041 along with another related issue in Http_Client.
BTW thanks for the ftell() idea - that worked well although I reduced the number of calls. I used mb_internal_encoding everywhere else, just to avoid the consecutive if() calls.
Posted by Satoru Yoshida (satoruyoshida) on 2009-11-17T20:43:42.000+0000
I set fix version . I find at SVN r17118 in 1.9 branch.