Skip to content

Commit 1b8ba15

Browse files
committed
Merge pull request php-curl-class#291 from zachborboa/170
Fix php-curl-class#170: Allow setting MultiCurl callbacks after requests are added
2 parents 20646ba + 04d8aab commit 1b8ba15

File tree

3 files changed

+214
-7
lines changed

3 files changed

+214
-7
lines changed

src/Curl/Curl.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -67,9 +67,9 @@ class Curl
6767

6868
public $beforeSendFunction = null;
6969
public $downloadCompleteFunction = null;
70-
private $successFunction = null;
71-
private $errorFunction = null;
72-
private $completeFunction = null;
70+
public $successFunction = null;
71+
public $errorFunction = null;
72+
public $completeFunction = null;
7373

7474
private $cookies = array();
7575
private $responseCookies = array();

src/Curl/MultiCurl.php

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -556,10 +556,6 @@ private function addHandle($curl)
556556
if (!($curlm_error_code === CURLM_OK)) {
557557
throw new \ErrorException('cURL multi add handle error: ' . curl_multi_strerror($curlm_error_code));
558558
}
559-
$curl->beforeSend($this->beforeSendFunction);
560-
$curl->success($this->successFunction);
561-
$curl->error($this->errorFunction);
562-
$curl->complete($this->completeFunction);
563559
$this->curls[] = $curl;
564560
$curl->id = $this->nextCurlId++;
565561

@@ -576,6 +572,20 @@ private function addHandle($curl)
576572
*/
577573
private function initHandle($curl)
578574
{
575+
// Set callbacks if not already individually set.
576+
if ($curl->beforeSendFunction === null) {
577+
$curl->beforeSend($this->beforeSendFunction);
578+
}
579+
if ($curl->successFunction === null) {
580+
$curl->success($this->successFunction);
581+
}
582+
if ($curl->errorFunction === null) {
583+
$curl->error($this->errorFunction);
584+
}
585+
if ($curl->completeFunction === null) {
586+
$curl->complete($this->completeFunction);
587+
}
588+
579589
foreach ($this->options as $option => $value) {
580590
$curl->setOpt($option, $value);
581591
}

tests/PHPCurlClass/PHPMultiCurlClassTest.php

Lines changed: 197 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1548,6 +1548,203 @@ public function testCurlCallbackOverride()
15481548
$this->assertTrue($put_complete_called);
15491549
}
15501550

1551+
public function testCurlCallbackAddedAfter()
1552+
{
1553+
$delete_before_send_called = false;
1554+
$delete_success_called = false;
1555+
$delete_error_called = false;
1556+
$delete_complete_called = false;
1557+
$multi_curl = new MultiCurl();
1558+
$multi_curl->addDelete(Test::TEST_URL);
1559+
$multi_curl->beforeSend(function ($instance) use (&$delete_before_send_called) {
1560+
$delete_before_send_called = true;
1561+
});
1562+
$multi_curl->success(function ($instance) use (&$delete_success_called) {
1563+
$delete_success_called = true;
1564+
});
1565+
$multi_curl->error(function ($instance) use (&$delete_error_called) {
1566+
$delete_error_called = true;
1567+
});
1568+
$multi_curl->complete(function ($instance) use (&$delete_complete_called) {
1569+
$delete_complete_called = true;
1570+
});
1571+
$multi_curl->start();
1572+
$this->assertTrue($delete_before_send_called);
1573+
$this->assertTrue($delete_success_called);
1574+
$this->assertFalse($delete_error_called);
1575+
$this->assertTrue($delete_complete_called);
1576+
1577+
$download_before_send_called = false;
1578+
$download_success_called = false;
1579+
$download_error_called = false;
1580+
$download_complete_called = false;
1581+
$download_file_path = tempnam('/tmp', 'php-curl-class.');
1582+
$multi_curl = new MultiCurl();
1583+
$multi_curl->addDownload(Test::TEST_URL, $download_file_path);
1584+
$multi_curl->beforeSend(function ($instance) use (&$download_before_send_called) {
1585+
$download_before_send_called = true;
1586+
});
1587+
$multi_curl->success(function ($instance) use (&$download_success_called) {
1588+
$download_success_called = true;
1589+
});
1590+
$multi_curl->error(function ($instance) use (&$download_error_called) {
1591+
$download_error_called = true;
1592+
});
1593+
$multi_curl->complete(function ($instance) use (&$download_complete_called) {
1594+
$download_complete_called = true;
1595+
});
1596+
$multi_curl->start();
1597+
$this->assertTrue($download_before_send_called);
1598+
$this->assertTrue($download_success_called);
1599+
$this->assertFalse($download_error_called);
1600+
$this->assertTrue($download_complete_called);
1601+
$this->assertTrue(unlink($download_file_path));
1602+
1603+
$get_before_send_called = false;
1604+
$get_success_called = false;
1605+
$get_error_called = false;
1606+
$get_complete_called = false;
1607+
$multi_curl = new MultiCurl();
1608+
$multi_curl->addGet(Test::TEST_URL);
1609+
$multi_curl->beforeSend(function ($instance) use (&$get_before_send_called) {
1610+
$get_before_send_called = true;
1611+
});
1612+
$multi_curl->success(function ($instance) use (&$get_success_called) {
1613+
$get_success_called = true;
1614+
});
1615+
$multi_curl->error(function ($instance) use (&$get_error_called) {
1616+
$get_error_called = true;
1617+
});
1618+
$multi_curl->complete(function ($instance) use (&$get_complete_called) {
1619+
$get_complete_called = true;
1620+
});
1621+
$multi_curl->start();
1622+
$this->assertTrue($get_before_send_called);
1623+
$this->assertTrue($get_success_called);
1624+
$this->assertFalse($get_error_called);
1625+
$this->assertTrue($get_complete_called);
1626+
1627+
$head_before_send_called = false;
1628+
$head_success_called = false;
1629+
$head_error_called = false;
1630+
$head_complete_called = false;
1631+
$multi_curl = new MultiCurl();
1632+
$multi_curl->addHead(Test::TEST_URL);
1633+
$multi_curl->beforeSend(function ($instance) use (&$head_before_send_called) {
1634+
$head_before_send_called = true;
1635+
});
1636+
$multi_curl->success(function ($instance) use (&$head_success_called) {
1637+
$head_success_called = true;
1638+
});
1639+
$multi_curl->error(function ($instance) use (&$head_error_called) {
1640+
$head_error_called = true;
1641+
});
1642+
$multi_curl->complete(function ($instance) use (&$head_complete_called) {
1643+
$head_complete_called = true;
1644+
});
1645+
$multi_curl->start();
1646+
$this->assertTrue($head_before_send_called);
1647+
$this->assertTrue($head_success_called);
1648+
$this->assertFalse($head_error_called);
1649+
$this->assertTrue($head_complete_called);
1650+
1651+
$options_before_send_called = false;
1652+
$options_success_called = false;
1653+
$options_error_called = false;
1654+
$options_complete_called = false;
1655+
$multi_curl = new MultiCurl();
1656+
$multi_curl->addOptions(Test::TEST_URL);
1657+
$multi_curl->beforeSend(function ($instance) use (&$options_before_send_called) {
1658+
$options_before_send_called = true;
1659+
});
1660+
$multi_curl->success(function ($instance) use (&$options_success_called) {
1661+
$options_success_called = true;
1662+
});
1663+
$multi_curl->error(function ($instance) use (&$options_error_called) {
1664+
$options_error_called = true;
1665+
});
1666+
$multi_curl->complete(function ($instance) use (&$options_complete_called) {
1667+
$options_complete_called = true;
1668+
});
1669+
$multi_curl->start();
1670+
$this->assertTrue($options_before_send_called);
1671+
$this->assertTrue($options_success_called);
1672+
$this->assertFalse($options_error_called);
1673+
$this->assertTrue($options_complete_called);
1674+
1675+
$patch_before_send_called = false;
1676+
$patch_success_called = false;
1677+
$patch_error_called = false;
1678+
$patch_complete_called = false;
1679+
$multi_curl = new MultiCurl();
1680+
$multi_curl->addPatch(Test::TEST_URL);
1681+
$multi_curl->beforeSend(function ($instance) use (&$patch_before_send_called) {
1682+
$patch_before_send_called = true;
1683+
});
1684+
$multi_curl->success(function ($instance) use (&$patch_success_called) {
1685+
$patch_success_called = true;
1686+
});
1687+
$multi_curl->error(function ($instance) use (&$patch_error_called) {
1688+
$patch_error_called = true;
1689+
});
1690+
$multi_curl->complete(function ($instance) use (&$patch_complete_called) {
1691+
$patch_complete_called = true;
1692+
});
1693+
$multi_curl->start();
1694+
$this->assertTrue($patch_before_send_called);
1695+
$this->assertTrue($patch_success_called);
1696+
$this->assertFalse($patch_error_called);
1697+
$this->assertTrue($patch_complete_called);
1698+
1699+
$post_before_send_called = false;
1700+
$post_success_called = false;
1701+
$post_error_called = false;
1702+
$post_complete_called = false;
1703+
$multi_curl = new MultiCurl();
1704+
$multi_curl->addPost(Test::TEST_URL);
1705+
$multi_curl->beforeSend(function ($instance) use (&$post_before_send_called) {
1706+
$post_before_send_called = true;
1707+
});
1708+
$multi_curl->success(function ($instance) use (&$post_success_called) {
1709+
$post_success_called = true;
1710+
});
1711+
$multi_curl->error(function ($instance) use (&$post_error_called) {
1712+
$post_error_called = true;
1713+
});
1714+
$multi_curl->complete(function ($instance) use (&$post_complete_called) {
1715+
$post_complete_called = true;
1716+
});
1717+
$multi_curl->start();
1718+
$this->assertTrue($post_before_send_called);
1719+
$this->assertTrue($post_success_called);
1720+
$this->assertFalse($post_error_called);
1721+
$this->assertTrue($post_complete_called);
1722+
1723+
$put_before_send_called = false;
1724+
$put_success_called = false;
1725+
$put_error_called = false;
1726+
$put_complete_called = false;
1727+
$multi_curl = new MultiCurl();
1728+
$multi_curl->addPut(Test::TEST_URL);
1729+
$multi_curl->beforeSend(function ($instance) use (&$put_before_send_called) {
1730+
$put_before_send_called = true;
1731+
});
1732+
$multi_curl->success(function ($instance) use (&$put_success_called) {
1733+
$put_success_called = true;
1734+
});
1735+
$multi_curl->error(function ($instance) use (&$put_error_called) {
1736+
$put_error_called = true;
1737+
});
1738+
$multi_curl->complete(function ($instance) use (&$put_complete_called) {
1739+
$put_complete_called = true;
1740+
});
1741+
$multi_curl->start();
1742+
$this->assertTrue($put_before_send_called);
1743+
$this->assertTrue($put_success_called);
1744+
$this->assertFalse($put_error_called);
1745+
$this->assertTrue($put_complete_called);
1746+
}
1747+
15511748
public function testSetOptAndSetOptOverride()
15521749
{
15531750
$multi_curl_user_agent = 'multi curl user agent';

0 commit comments

Comments
 (0)