diff --git a/src/Curl/Curl.php b/src/Curl/Curl.php index 5f2c211..685022c 100644 --- a/src/Curl/Curl.php +++ b/src/Curl/Curl.php @@ -67,9 +67,9 @@ class Curl public $beforeSendFunction = null; public $downloadCompleteFunction = null; - private $successFunction = null; - private $errorFunction = null; - private $completeFunction = null; + public $successFunction = null; + public $errorFunction = null; + public $completeFunction = null; private $cookies = array(); private $responseCookies = array(); diff --git a/src/Curl/MultiCurl.php b/src/Curl/MultiCurl.php index eeb53f1..d909bc8 100644 --- a/src/Curl/MultiCurl.php +++ b/src/Curl/MultiCurl.php @@ -556,10 +556,6 @@ class MultiCurl if (!($curlm_error_code === CURLM_OK)) { throw new \ErrorException('cURL multi add handle error: ' . curl_multi_strerror($curlm_error_code)); } - $curl->beforeSend($this->beforeSendFunction); - $curl->success($this->successFunction); - $curl->error($this->errorFunction); - $curl->complete($this->completeFunction); $this->curls[] = $curl; $curl->id = $this->nextCurlId++; @@ -576,6 +572,20 @@ class MultiCurl */ private function initHandle($curl) { + // Set callbacks if not already individually set. + if ($curl->beforeSendFunction === null) { + $curl->beforeSend($this->beforeSendFunction); + } + if ($curl->successFunction === null) { + $curl->success($this->successFunction); + } + if ($curl->errorFunction === null) { + $curl->error($this->errorFunction); + } + if ($curl->completeFunction === null) { + $curl->complete($this->completeFunction); + } + foreach ($this->options as $option => $value) { $curl->setOpt($option, $value); } diff --git a/tests/PHPCurlClass/PHPMultiCurlClassTest.php b/tests/PHPCurlClass/PHPMultiCurlClassTest.php index 0a244f6..b66aeee 100644 --- a/tests/PHPCurlClass/PHPMultiCurlClassTest.php +++ b/tests/PHPCurlClass/PHPMultiCurlClassTest.php @@ -1548,6 +1548,203 @@ class MultiCurlTest extends PHPUnit_Framework_TestCase $this->assertTrue($put_complete_called); } + public function testCurlCallbackAddedAfter() + { + $delete_before_send_called = false; + $delete_success_called = false; + $delete_error_called = false; + $delete_complete_called = false; + $multi_curl = new MultiCurl(); + $multi_curl->addDelete(Test::TEST_URL); + $multi_curl->beforeSend(function ($instance) use (&$delete_before_send_called) { + $delete_before_send_called = true; + }); + $multi_curl->success(function ($instance) use (&$delete_success_called) { + $delete_success_called = true; + }); + $multi_curl->error(function ($instance) use (&$delete_error_called) { + $delete_error_called = true; + }); + $multi_curl->complete(function ($instance) use (&$delete_complete_called) { + $delete_complete_called = true; + }); + $multi_curl->start(); + $this->assertTrue($delete_before_send_called); + $this->assertTrue($delete_success_called); + $this->assertFalse($delete_error_called); + $this->assertTrue($delete_complete_called); + + $download_before_send_called = false; + $download_success_called = false; + $download_error_called = false; + $download_complete_called = false; + $download_file_path = tempnam('/tmp', 'php-curl-class.'); + $multi_curl = new MultiCurl(); + $multi_curl->addDownload(Test::TEST_URL, $download_file_path); + $multi_curl->beforeSend(function ($instance) use (&$download_before_send_called) { + $download_before_send_called = true; + }); + $multi_curl->success(function ($instance) use (&$download_success_called) { + $download_success_called = true; + }); + $multi_curl->error(function ($instance) use (&$download_error_called) { + $download_error_called = true; + }); + $multi_curl->complete(function ($instance) use (&$download_complete_called) { + $download_complete_called = true; + }); + $multi_curl->start(); + $this->assertTrue($download_before_send_called); + $this->assertTrue($download_success_called); + $this->assertFalse($download_error_called); + $this->assertTrue($download_complete_called); + $this->assertTrue(unlink($download_file_path)); + + $get_before_send_called = false; + $get_success_called = false; + $get_error_called = false; + $get_complete_called = false; + $multi_curl = new MultiCurl(); + $multi_curl->addGet(Test::TEST_URL); + $multi_curl->beforeSend(function ($instance) use (&$get_before_send_called) { + $get_before_send_called = true; + }); + $multi_curl->success(function ($instance) use (&$get_success_called) { + $get_success_called = true; + }); + $multi_curl->error(function ($instance) use (&$get_error_called) { + $get_error_called = true; + }); + $multi_curl->complete(function ($instance) use (&$get_complete_called) { + $get_complete_called = true; + }); + $multi_curl->start(); + $this->assertTrue($get_before_send_called); + $this->assertTrue($get_success_called); + $this->assertFalse($get_error_called); + $this->assertTrue($get_complete_called); + + $head_before_send_called = false; + $head_success_called = false; + $head_error_called = false; + $head_complete_called = false; + $multi_curl = new MultiCurl(); + $multi_curl->addHead(Test::TEST_URL); + $multi_curl->beforeSend(function ($instance) use (&$head_before_send_called) { + $head_before_send_called = true; + }); + $multi_curl->success(function ($instance) use (&$head_success_called) { + $head_success_called = true; + }); + $multi_curl->error(function ($instance) use (&$head_error_called) { + $head_error_called = true; + }); + $multi_curl->complete(function ($instance) use (&$head_complete_called) { + $head_complete_called = true; + }); + $multi_curl->start(); + $this->assertTrue($head_before_send_called); + $this->assertTrue($head_success_called); + $this->assertFalse($head_error_called); + $this->assertTrue($head_complete_called); + + $options_before_send_called = false; + $options_success_called = false; + $options_error_called = false; + $options_complete_called = false; + $multi_curl = new MultiCurl(); + $multi_curl->addOptions(Test::TEST_URL); + $multi_curl->beforeSend(function ($instance) use (&$options_before_send_called) { + $options_before_send_called = true; + }); + $multi_curl->success(function ($instance) use (&$options_success_called) { + $options_success_called = true; + }); + $multi_curl->error(function ($instance) use (&$options_error_called) { + $options_error_called = true; + }); + $multi_curl->complete(function ($instance) use (&$options_complete_called) { + $options_complete_called = true; + }); + $multi_curl->start(); + $this->assertTrue($options_before_send_called); + $this->assertTrue($options_success_called); + $this->assertFalse($options_error_called); + $this->assertTrue($options_complete_called); + + $patch_before_send_called = false; + $patch_success_called = false; + $patch_error_called = false; + $patch_complete_called = false; + $multi_curl = new MultiCurl(); + $multi_curl->addPatch(Test::TEST_URL); + $multi_curl->beforeSend(function ($instance) use (&$patch_before_send_called) { + $patch_before_send_called = true; + }); + $multi_curl->success(function ($instance) use (&$patch_success_called) { + $patch_success_called = true; + }); + $multi_curl->error(function ($instance) use (&$patch_error_called) { + $patch_error_called = true; + }); + $multi_curl->complete(function ($instance) use (&$patch_complete_called) { + $patch_complete_called = true; + }); + $multi_curl->start(); + $this->assertTrue($patch_before_send_called); + $this->assertTrue($patch_success_called); + $this->assertFalse($patch_error_called); + $this->assertTrue($patch_complete_called); + + $post_before_send_called = false; + $post_success_called = false; + $post_error_called = false; + $post_complete_called = false; + $multi_curl = new MultiCurl(); + $multi_curl->addPost(Test::TEST_URL); + $multi_curl->beforeSend(function ($instance) use (&$post_before_send_called) { + $post_before_send_called = true; + }); + $multi_curl->success(function ($instance) use (&$post_success_called) { + $post_success_called = true; + }); + $multi_curl->error(function ($instance) use (&$post_error_called) { + $post_error_called = true; + }); + $multi_curl->complete(function ($instance) use (&$post_complete_called) { + $post_complete_called = true; + }); + $multi_curl->start(); + $this->assertTrue($post_before_send_called); + $this->assertTrue($post_success_called); + $this->assertFalse($post_error_called); + $this->assertTrue($post_complete_called); + + $put_before_send_called = false; + $put_success_called = false; + $put_error_called = false; + $put_complete_called = false; + $multi_curl = new MultiCurl(); + $multi_curl->addPut(Test::TEST_URL); + $multi_curl->beforeSend(function ($instance) use (&$put_before_send_called) { + $put_before_send_called = true; + }); + $multi_curl->success(function ($instance) use (&$put_success_called) { + $put_success_called = true; + }); + $multi_curl->error(function ($instance) use (&$put_error_called) { + $put_error_called = true; + }); + $multi_curl->complete(function ($instance) use (&$put_complete_called) { + $put_complete_called = true; + }); + $multi_curl->start(); + $this->assertTrue($put_before_send_called); + $this->assertTrue($put_success_called); + $this->assertFalse($put_error_called); + $this->assertTrue($put_complete_called); + } + public function testSetOptAndSetOptOverride() { $multi_curl_user_agent = 'multi curl user agent';