php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #39034 Calling curl_exec() with return transfer returns bool(true)
Submitted: 2006-10-04 09:06 UTC Modified: 2006-10-10 23:17 UTC
From: james dot gauth at gmail dot com Assigned: iliaa (profile)
Status: Closed Package: cURL related
PHP Version: 4.4.4 OS: Debian
Private report: No CVE-ID: None
View Developer Edit
Welcome! If you don't have a Git account, you can't do anything here.
If you reported this bug, you can edit this bug over here.
(description)
Block user comment
Status: Assign to:
Package:
Bug Type:
Summary:
From: james dot gauth at gmail dot com
New email:
PHP Version: OS:

 

 [2006-10-04 09:06 UTC] james dot gauth at gmail dot com
Description:
------------
When calling curl_exec() with the CURLOPT_RETURNTRANSFER option set to true, a user expects that curl_exec() will return the string value of the request.

When the URL of the request in question points to a zero-byte file, curl_exec() returns bool(true) instead of the expected empty string.

The versions I am using are:
PHP 4.4.4 (cli) (built: Sep 11 2006 10:00:33)
Zend Engine v1.3.0, Copyright (c) 1998-2004 Zend Technologies

CURL Information => libcurl/7.13.2 OpenSSL/0.9.7e zlib/1.2.3 libidn/0.5.13



Reproduce code:
---------------
<?php

	// fictional URL to an existing file with no data in it (ie. 0 byte file)
	$url = 'http://www.example.com/empty_file.txt';

	$curl = curl_init();
	
	curl_setopt($curl, CURLOPT_URL, $url);
	curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
	curl_setopt($curl, CURLOPT_HEADER, false);

	// execute and return string (this should be an empty string '')
	$str = curl_exec($curl);

	curl_close($curl);

	// the value of $str is actually bool(true), not empty string ''
	var_dump($str);

?>

Expected result:
----------------
string(0) ""

Actual result:
--------------
bool(true)

Patches

Pull Requests

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2006-10-05 11:58 UTC] james dot gauth at gmail dot com
The source of this problem is the following:

[ext/curl/interface.c][1664]

	if (ch->handlers->write->method == PHP_CURL_RETURN && ch->handlers->write->buf.len > 0) {
		--ch->uses;
		smart_str_0(&ch->handlers->write->buf);
		RETURN_STRINGL(ch->handlers->write->buf.c, ch->handlers->write->buf.len, 1);
	}
	--ch->uses;
	RETURN_TRUE;
}

If the write buffer has no length, the PHP_CURL_RETURN option is ignored and a value of TRUE is returned. This code has been in CVS since revision 1.1.

Regardless of the write buffer length, setting PHP_CURL_RETURN option on should case curl_exec() to return a string. If this code is not going to be changed I would recommend the PHP manual be changed to warn the user of this behaviour.

One of the issues this problem causes is that if you don't specifically check for the boolean true return value, any normal string comparisons made against curl_exec()'s return value are always true (true == 'string' is true) whereas the expected result would be ('' == 'string' is false).
 [2006-10-06 10:15 UTC] james dot gauth at gmail dot com
I'm setting the category back to cURL related, inconsistent return values are not a feature.
 [2006-10-10 23:17 UTC] iliaa@php.net
This bug has been fixed in CVS.

Snapshots of the sources are packaged every three hours; this change
will be in the next snapshot. You can grab the snapshot at
http://snaps.php.net/.
 
Thank you for the report, and for helping us make PHP better.


 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Tue Dec 03 17:01:29 2024 UTC