@@ -456,6 +456,7 @@ PHP_MINIT_FUNCTION(curl)
456
456
REGISTER_CURL_CONSTANT (CURLOPT_VERBOSE );
457
457
REGISTER_CURL_CONSTANT (CURLOPT_WRITEFUNCTION );
458
458
REGISTER_CURL_CONSTANT (CURLOPT_WRITEHEADER );
459
+ REGISTER_CURL_CONSTANT (CURLOPT_XFERINFOFUNCTION );
459
460
460
461
/* */
461
462
REGISTER_CURL_CONSTANT (CURLE_ABORTED_BY_CALLBACK );
@@ -1287,11 +1288,13 @@ static HashTable *curl_get_gc(zend_object *object, zval **table, int *n)
1287
1288
zend_get_gc_buffer_add_zval (gc_buffer , & curl -> handlers .progress -> func_name );
1288
1289
}
1289
1290
1290
- #if LIBCURL_VERSION_NUM >= 0x071500
1291
+ if (curl -> handlers .xferinfo ) {
1292
+ zend_get_gc_buffer_add_zval (gc_buffer , & curl -> handlers .xferinfo -> func_name );
1293
+ }
1294
+
1291
1295
if (curl -> handlers .fnmatch ) {
1292
1296
zend_get_gc_buffer_add_zval (gc_buffer , & curl -> handlers .fnmatch -> func_name );
1293
1297
}
1294
- #endif
1295
1298
1296
1299
zend_get_gc_buffer_add_zval (gc_buffer , & curl -> handlers .std_err );
1297
1300
zend_get_gc_buffer_add_zval (gc_buffer , & curl -> private_data );
@@ -1496,6 +1499,54 @@ static size_t curl_progress(void *clientp, double dltotal, double dlnow, double
1496
1499
}
1497
1500
/* }}} */
1498
1501
1502
+ /* {{{ curl_xferinfo */
1503
+ static size_t curl_xferinfo (void * clientp , curl_off_t dltotal , curl_off_t dlnow , curl_off_t ultotal , curl_off_t ulnow )
1504
+ {
1505
+ php_curl * ch = (php_curl * )clientp ;
1506
+ php_curl_callback * t = ch -> handlers .xferinfo ;
1507
+ size_t rval = 0 ;
1508
+
1509
+ #if PHP_CURL_DEBUG
1510
+ fprintf (stderr , "curl_xferinfo() called\n" );
1511
+ fprintf (stderr , "clientp = %x, dltotal = %ld, dlnow = %ld, ultotal = %ld, ulnow = %ld\n" , clientp , dltotal , dlnow , ultotal , ulnow );
1512
+ #endif
1513
+
1514
+ zval argv [5 ];
1515
+ zval retval ;
1516
+ zend_result error ;
1517
+ zend_fcall_info fci ;
1518
+
1519
+ GC_ADDREF (& ch -> std );
1520
+ ZVAL_OBJ (& argv [0 ], & ch -> std );
1521
+ ZVAL_LONG (& argv [1 ], dltotal );
1522
+ ZVAL_LONG (& argv [2 ], dlnow );
1523
+ ZVAL_LONG (& argv [3 ], ultotal );
1524
+ ZVAL_LONG (& argv [4 ], ulnow );
1525
+
1526
+ fci .size = sizeof (fci );
1527
+ ZVAL_COPY_VALUE (& fci .function_name , & t -> func_name );
1528
+ fci .object = NULL ;
1529
+ fci .retval = & retval ;
1530
+ fci .param_count = 5 ;
1531
+ fci .params = argv ;
1532
+ fci .named_params = NULL ;
1533
+
1534
+ ch -> in_callback = 1 ;
1535
+ error = zend_call_function (& fci , & t -> fci_cache );
1536
+ ch -> in_callback = 0 ;
1537
+ if (error == FAILURE ) {
1538
+ php_error_docref (NULL , E_WARNING , "Cannot call the CURLOPT_XFERINFOFUNCTION" );
1539
+ } else if (!Z_ISUNDEF (retval )) {
1540
+ _php_curl_verify_handlers (ch , /* reporterror */ true);
1541
+ if (0 != zval_get_long (& retval )) {
1542
+ rval = 1 ;
1543
+ }
1544
+ }
1545
+ zval_ptr_dtor (& argv [0 ]);
1546
+ return rval ;
1547
+ }
1548
+ /* }}} */
1549
+
1499
1550
/* {{{ curl_read */
1500
1551
static size_t curl_read (char * data , size_t size , size_t nmemb , void * ctx )
1501
1552
{
@@ -1753,6 +1804,7 @@ void init_curl_handle(php_curl *ch)
1753
1804
ch -> handlers .write_header = ecalloc (1 , sizeof (php_curl_write ));
1754
1805
ch -> handlers .read = ecalloc (1 , sizeof (php_curl_read ));
1755
1806
ch -> handlers .progress = NULL ;
1807
+ ch -> handlers .xferinfo = NULL ;
1756
1808
ch -> handlers .fnmatch = NULL ;
1757
1809
ch -> clone = emalloc (sizeof (uint32_t ));
1758
1810
* ch -> clone = 1 ;
@@ -1925,6 +1977,14 @@ void _php_setup_easy_copy_handlers(php_curl *ch, php_curl *source)
1925
1977
curl_easy_setopt (ch -> cp , CURLOPT_PROGRESSDATA , (void * ) ch );
1926
1978
}
1927
1979
1980
+ if (source -> handlers .xferinfo ) {
1981
+ ch -> handlers .xferinfo = ecalloc (1 , sizeof (php_curl_callback ));
1982
+ if (!Z_ISUNDEF (source -> handlers .xferinfo -> func_name )) {
1983
+ ZVAL_COPY (& ch -> handlers .xferinfo -> func_name , & source -> handlers .xferinfo -> func_name );
1984
+ }
1985
+ curl_easy_setopt (ch -> cp , CURLOPT_XFERINFODATA , (void * ) ch );
1986
+ }
1987
+
1928
1988
if (source -> handlers .fnmatch ) {
1929
1989
ch -> handlers .fnmatch = ecalloc (1 , sizeof (php_curl_callback ));
1930
1990
if (!Z_ISUNDEF (source -> handlers .fnmatch -> func_name )) {
@@ -2825,6 +2885,7 @@ static zend_result _php_curl_setopt(php_curl *ch, zend_long option, zval *zvalue
2825
2885
ch -> handlers .progress -> fci_cache = empty_fcall_info_cache ;
2826
2886
}
2827
2887
ZVAL_COPY (& ch -> handlers .progress -> func_name , zvalue );
2888
+ php_error_docref (NULL , E_DEPRECATED , "CURLOPT_PROGRESSFUNCTION is deprecated" );
2828
2889
break ;
2829
2890
2830
2891
case CURLOPT_READFUNCTION :
@@ -2853,6 +2914,18 @@ static zend_result _php_curl_setopt(php_curl *ch, zend_long option, zval *zvalue
2853
2914
ch -> handlers .write -> method = PHP_CURL_USER ;
2854
2915
break ;
2855
2916
2917
+ case CURLOPT_XFERINFOFUNCTION :
2918
+ curl_easy_setopt (ch -> cp , CURLOPT_XFERINFOFUNCTION , curl_xferinfo );
2919
+ curl_easy_setopt (ch -> cp , CURLOPT_XFERINFODATA , ch );
2920
+ if (ch -> handlers .xferinfo == NULL ) {
2921
+ ch -> handlers .xferinfo = ecalloc (1 , sizeof (php_curl_callback ));
2922
+ } else if (!Z_ISUNDEF (ch -> handlers .xferinfo -> func_name )) {
2923
+ zval_ptr_dtor (& ch -> handlers .xferinfo -> func_name );
2924
+ ch -> handlers .xferinfo -> fci_cache = empty_fcall_info_cache ;
2925
+ }
2926
+ ZVAL_COPY (& ch -> handlers .xferinfo -> func_name , zvalue );
2927
+ break ;
2928
+
2856
2929
/* Curl off_t options */
2857
2930
case CURLOPT_MAX_RECV_SPEED_LARGE :
2858
2931
case CURLOPT_MAX_SEND_SPEED_LARGE :
@@ -3490,6 +3563,11 @@ static void curl_free_obj(zend_object *object)
3490
3563
efree (ch -> handlers .progress );
3491
3564
}
3492
3565
3566
+ if (ch -> handlers .xferinfo ) {
3567
+ zval_ptr_dtor (& ch -> handlers .xferinfo -> func_name );
3568
+ efree (ch -> handlers .xferinfo );
3569
+ }
3570
+
3493
3571
if (ch -> handlers .fnmatch ) {
3494
3572
zval_ptr_dtor (& ch -> handlers .fnmatch -> func_name );
3495
3573
efree (ch -> handlers .fnmatch );
@@ -3562,12 +3640,17 @@ static void _php_curl_reset_handlers(php_curl *ch)
3562
3640
ch -> handlers .progress = NULL ;
3563
3641
}
3564
3642
3643
+ if (ch -> handlers .xferinfo ) {
3644
+ zval_ptr_dtor (& ch -> handlers .xferinfo -> func_name );
3645
+ efree (ch -> handlers .xferinfo );
3646
+ ch -> handlers .xferinfo = NULL ;
3647
+ }
3648
+
3565
3649
if (ch -> handlers .fnmatch ) {
3566
3650
zval_ptr_dtor (& ch -> handlers .fnmatch -> func_name );
3567
3651
efree (ch -> handlers .fnmatch );
3568
3652
ch -> handlers .fnmatch = NULL ;
3569
3653
}
3570
-
3571
3654
}
3572
3655
/* }}} */
3573
3656
0 commit comments