mirror of
https://github.com/php-curl-class/php-curl-class.git
synced 2026-08-31 04:34:27 +00:00
Fix #521: Fix memory leak when class object unset, but not manually closed.
Move closure function outside class to avoid implicit reference to $this and allow __destruct() to be called as expected when a class instance is unset.
This commit is contained in:
+22
-20
@@ -122,7 +122,7 @@ class Curl
|
||||
$header_callback_data->rawResponseHeaders = '';
|
||||
$header_callback_data->responseCookies = array();
|
||||
$this->headerCallbackData = $header_callback_data;
|
||||
$this->setOpt(CURLOPT_HEADERFUNCTION, $this->createHeaderCallback($header_callback_data));
|
||||
$this->setOpt(CURLOPT_HEADERFUNCTION, createHeaderCallback($header_callback_data));
|
||||
|
||||
$this->setOpt(CURLOPT_RETURNTRANSFER, true);
|
||||
$this->headers = new CaseInsensitiveArray();
|
||||
@@ -1302,25 +1302,6 @@ class Curl
|
||||
return $url . $query_string;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create Header Callback
|
||||
*
|
||||
* @access private
|
||||
* @param $header_callback_data
|
||||
*
|
||||
* @return callable
|
||||
*/
|
||||
private function createHeaderCallback($header_callback_data)
|
||||
{
|
||||
return function ($ch, $header) use ($header_callback_data) {
|
||||
if (preg_match('/^Set-Cookie:\s*([^=]+)=([^;]+)/mi', $header, $cookie) === 1) {
|
||||
$header_callback_data->responseCookies[$cookie[1]] = trim($cookie[2], " \n\r\t\0\x0B");
|
||||
}
|
||||
$header_callback_data->rawResponseHeaders .= $header;
|
||||
return strlen($header);
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Download Complete
|
||||
*
|
||||
@@ -1505,3 +1486,24 @@ class Curl
|
||||
$this->cookies[implode('', $name_chars)] = implode('', $value_chars);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Create Header Callback
|
||||
*
|
||||
* Gather headers and parse cookies as response headers are received. Keep this function separate from the class so that
|
||||
* unset($curl) automatically calls __destruct() as expected. Otherwise, manually calling $curl->close() will be
|
||||
* necessary to prevent a memory leak.
|
||||
*
|
||||
* @param $header_callback_data
|
||||
*
|
||||
* @return callable
|
||||
*/
|
||||
function createHeaderCallback($header_callback_data) {
|
||||
return function ($ch, $header) use ($header_callback_data) {
|
||||
if (preg_match('/^Set-Cookie:\s*([^=]+)=([^;]+)/mi', $header, $cookie) === 1) {
|
||||
$header_callback_data->responseCookies[$cookie[1]] = trim($cookie[2], " \n\r\t\0\x0B");
|
||||
}
|
||||
$header_callback_data->rawResponseHeaders .= $header;
|
||||
return strlen($header);
|
||||
};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user