ZF-6218: Invalid chunk size in Zend_Http_Client_Adapter_Socket problem with strlen

Issue Type: Bug Created: 2009-04-06T00:01:54.000+0000 Last Updated: 2009-11-17T20:43:43.000+0000 Status: Resolved Fix version(s): - 1.9.0 (31/Jul/09)

Reporter: Konstantin Leboev (coldwind) Assignee: Shahar Evron (shahar) Tags: - Zend_Http_Client

Related issues: - ZF-2098

Attachments: - patch.diff


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).

<pre class="highlight">
<                     $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));
<                             $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.


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

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.

Have you found an issue?

See the Overview section for more details.


© 2006-2018 by Zend, a Rogue Wave Company. Made with by awesome contributors.

This website is built using zend-expressive and it runs on PHP 7.