php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #28682 fread appears to drop the buffer
Submitted: 2004-06-07 20:54 UTC Modified: 2004-06-09 16:25 UTC
From: ewade at vlender dot com Assigned:
Status: Not a bug Package: Sockets related
PHP Version: 4.3.7 OS: GNU/Linux
Private report: No CVE-ID: None
Welcome back! If you're the original bug submitter, here's where you can edit the bug or add additional notes.
If this is not your bug, you can add a comment by following this link.
If this is your bug, but you forgot your password, you can retrieve your password here.
Password:
Status:
Package:
Bug Type:
Summary:
From: ewade at vlender dot com
New email:
PHP Version: OS:

 

 [2004-06-07 20:54 UTC] ewade at vlender dot com
Description:
------------
This function works fine with with PHP-4.3.1 but since recently upgrading to 4.3.6 and/or 4.3.7 it strips out the headers as appopriate but returns an empty body.  (I've cut out the host code and the cookie code for obvious security issues.)  

What's weird is if I do not strip out the headers they list the correct Content-Length for the body, but the body is empty.  

At first I thought it might be the cURL library so I downgraded from cURL-7.11.1 to cURL-7.10.3, but that did not resolve the issue.  It will only work with PHP-4.3.1 which seems rather odd.  Any thoughts are greatly appreciated in resolving this issue.

############## ./configure --with apxs=/usr/local/apache/bin/apxs --enable-bcmath --with-curl --with-mysql=/usr/local/mysql --with-mcrypt=/usr/local/lib --with-openssl=/usr/local/ssl --without-pear --disable-cgi --with-gd --with-zlib --with-jpeg-dir=/usr/local/lib --with-pfpro --enable-xml


Reproduce code:
---------------
function send_to_factual_data($post_data)
{
// Open an SSL connection to the server
$fp = fsockopen("ssl://priate.ssl.host", 443, $errno, $errstr);

    // Make sure we're connected
    if (!$fp)
        return "Error Connecting To FactualData.com - $errstr ($errno)";
    else
     {
        // Send the HTTP headers
        fputs($fp, "POST /applet/path/here HTTP/1.0\r\n" .
                   "User-Agent: Mozilla/4.00\r\n" .
                   "Content-Type: text/xml\r\n" .
                   "Content-Length: " . strlen($post_data) . "\r\n" .
                   "Cookie: CERT=*CENSORED*;\r\n\r\n");

        // Send the POST data
        fputs($fp, $post_data);

        // Read the response - limit of 1M bytes should be OK
        $xml = @ fread($fp, 1000000);

        // Length of server response including headers
        $len = strlen($xml);

        // Strip the headers
        $xml = strstr($xml, "\r\n\r\n");

        // Skip the 2 CRLFs if we removed the headers
        if ($len != strlen($xml))
            $xml = substr($xml, 4);

            return $xml;
     }
} // end of function: send_to_factual_data


Expected result:
----------------
When I run the code I expect to have an XML credit report file returned to me.  I expect the code to strip off the HTML headers and leave the body intact for me to parse with my XML parsing scripts.

Instead what happens is I get back the HTML headers that say they have content, but there is no content to be found.


Actual result:
--------------
HTTP/1.1 200 OK
Content-Type:  text/xml
Content-Length: 57717
Connection: close
Date: Mon, 07 Jun 2004 18:51:24 GMT
Server: Apache Tomcat/4.1.27-LE-jdk14 (HTTP/1.1 Connector)


### The Content-Type and Content-Length are correct, but there is no data to be found, just the headers.

Thank you for your time!

Patches

Add a Patch

Pull Requests

Add a Pull Request

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2004-06-09 16:25 UTC] iliaa@php.net
Thank you for taking the time to write to us, but this is not
a bug. Please double-check the documentation available at
http://www.php.net/manual/ and the instructions on how to report
a bug at http://bugs.php.net/how-to-report.php

You should never rely on single fread() to read all 
available data especially when dealing with remote servers. 
Replace your code with: 
 
$xml = ''; 
while (($line = fread($fp, 1000000)))) { 
	$xml .= $line; 
} 
 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Fri Apr 19 07:01:27 2024 UTC