44
44
#include "ext/standard/file.h"
45
45
#include "php_curl.h"
46
46
47
- static int le_curl ;
48
- #define le_curl_name "cURL handle"
47
+ static unsigned char second_arg_force_ref [] = {2 , BYREF_NONE , BYREF_FORCE };
49
48
50
49
static void _php_curl_close (zend_rsrc_list_entry * rsrc TSRMLS_DC );
51
50
@@ -59,14 +58,22 @@ static void _php_curl_close(zend_rsrc_list_entry *rsrc TSRMLS_DC);
59
58
/* {{{ curl_functions[]
60
59
*/
61
60
function_entry curl_functions [] = {
62
- PHP_FE (curl_init , NULL )
63
- PHP_FE (curl_version , NULL )
64
- PHP_FE (curl_setopt , NULL )
65
- PHP_FE (curl_exec , NULL )
66
- PHP_FE (curl_getinfo , NULL )
67
- PHP_FE (curl_error , NULL )
68
- PHP_FE (curl_errno , NULL )
69
- PHP_FE (curl_close , NULL )
61
+ PHP_FE (curl_init , NULL )
62
+ PHP_FE (curl_version , NULL )
63
+ PHP_FE (curl_setopt , NULL )
64
+ PHP_FE (curl_exec , NULL )
65
+ PHP_FE (curl_getinfo , NULL )
66
+ PHP_FE (curl_error , NULL )
67
+ PHP_FE (curl_errno , NULL )
68
+ PHP_FE (curl_close , NULL )
69
+ PHP_FE (curl_multi_init , NULL )
70
+ PHP_FE (curl_multi_add_handle , NULL )
71
+ PHP_FE (curl_multi_remove_handle , NULL )
72
+ PHP_FE (curl_multi_select , NULL )
73
+ PHP_FE (curl_multi_exec , second_arg_force_ref )
74
+ PHP_FE (curl_multi_getcontent , NULL )
75
+ PHP_FE (curl_multi_info_read , NULL )
76
+ PHP_FE (curl_multi_close , NULL )
70
77
{NULL , NULL , NULL }
71
78
};
72
79
/* }}} */
@@ -109,6 +116,7 @@ PHP_MINFO_FUNCTION(curl)
109
116
PHP_MINIT_FUNCTION (curl )
110
117
{
111
118
le_curl = zend_register_list_destructors_ex (_php_curl_close , NULL , "curl" , module_number );
119
+ le_curl_multi_handle = zend_register_list_destructors_ex (_php_curl_multi_close , NULL , "curl" , module_number );
112
120
113
121
/* Constants for curl_setopt() */
114
122
REGISTER_CURL_CONSTANT (CURLOPT_DNS_USE_GLOBAL_CACHE );
@@ -183,6 +191,9 @@ PHP_MINIT_FUNCTION(curl)
183
191
REGISTER_CURL_CONSTANT (CURLOPT_COOKIEJAR );
184
192
REGISTER_CURL_CONSTANT (CURLOPT_SSL_CIPHER_LIST );
185
193
REGISTER_CURL_CONSTANT (CURLOPT_BINARYTRANSFER );
194
+ REGISTER_CURL_CONSTANT (CURLOPT_NOSIGNAL );
195
+ REGISTER_CURL_CONSTANT (CURLOPT_PROXYTYPE );
196
+ REGISTER_CURL_CONSTANT (CURLOPT_BUFFERSIZE );
186
197
REGISTER_CURL_CONSTANT (CURLOPT_HTTPGET );
187
198
REGISTER_CURL_CONSTANT (CURLOPT_HTTP_VERSION );
188
199
REGISTER_CURL_CONSTANT (CURLOPT_SSLKEY );
@@ -221,6 +232,15 @@ PHP_MINIT_FUNCTION(curl)
221
232
REGISTER_CURL_CONSTANT (CURLINFO_REDIRECT_TIME );
222
233
REGISTER_CURL_CONSTANT (CURLINFO_REDIRECT_COUNT );
223
234
235
+ /* cURL protocol constants (curl_version) */
236
+ REGISTER_CURL_CONSTANT (CURL_VERSION_IPV6 );
237
+ REGISTER_CURL_CONSTANT (CURL_VERSION_KERBEROS4 );
238
+ REGISTER_CURL_CONSTANT (CURL_VERSION_SSL );
239
+ REGISTER_CURL_CONSTANT (CURL_VERSION_LIBZ );
240
+
241
+ /* version constants */
242
+ REGISTER_CURL_CONSTANT (CURLVERSION_NOW );
243
+
224
244
/* Error Constants */
225
245
REGISTER_CURL_CONSTANT (CURLE_OK );
226
246
REGISTER_CURL_CONSTANT (CURLE_UNSUPPORTED_PROTOCOL );
@@ -275,6 +295,9 @@ PHP_MINIT_FUNCTION(curl)
275
295
REGISTER_CURL_CONSTANT (CURLE_OBSOLETE );
276
296
REGISTER_CURL_CONSTANT (CURLE_SSL_PEER_CERTIFICATE );
277
297
298
+ REGISTER_CURL_CONSTANT (CURLPROXY_HTTP );
299
+ REGISTER_CURL_CONSTANT (CURLPROXY_SOCKS5 );
300
+
278
301
REGISTER_CURL_CONSTANT (CURL_NETRC_OPTIONAL );
279
302
REGISTER_CURL_CONSTANT (CURL_NETRC_IGNORED );
280
303
REGISTER_CURL_CONSTANT (CURL_NETRC_REQUIRED );
@@ -283,6 +306,14 @@ PHP_MINIT_FUNCTION(curl)
283
306
REGISTER_CURL_CONSTANT (CURL_HTTP_VERSION_1_0 );
284
307
REGISTER_CURL_CONSTANT (CURL_HTTP_VERSION_1_1 );
285
308
309
+ REGISTER_CURL_CONSTANT (CURLM_CALL_MULTI_PERFORM );
310
+ REGISTER_CURL_CONSTANT (CURLM_OK );
311
+ REGISTER_CURL_CONSTANT (CURLM_BAD_HANDLE );
312
+ REGISTER_CURL_CONSTANT (CURLM_BAD_EASY_HANDLE );
313
+ REGISTER_CURL_CONSTANT (CURLM_OUT_OF_MEMORY );
314
+ REGISTER_CURL_CONSTANT (CURLM_INTERNAL_ERROR );
315
+
316
+ REGISTER_CURL_CONSTANT (CURLMSG_DONE );
286
317
287
318
if (curl_global_init (CURL_GLOBAL_SSL ) != CURLE_OK ) {
288
319
return FAILURE ;
@@ -315,15 +346,6 @@ PHP_MSHUTDOWN_FUNCTION(curl)
315
346
}
316
347
/* }}} */
317
348
318
- #define PHP_CURL_STDOUT 0
319
- #define PHP_CURL_FILE 1
320
- #define PHP_CURL_USER 2
321
- #define PHP_CURL_DIRECT 3
322
- #define PHP_CURL_RETURN 4
323
- #define PHP_CURL_ASCII 5
324
- #define PHP_CURL_BINARY 6
325
- #define PHP_CURL_IGNORE 7
326
-
327
349
/* {{{ curl_write
328
350
*/
329
351
static size_t curl_write (char * data , size_t size , size_t nmemb , void * ctx )
@@ -333,6 +355,12 @@ static size_t curl_write(char *data, size_t size, size_t nmemb, void *ctx)
333
355
size_t length = size * nmemb ;
334
356
TSRMLS_FETCH ();
335
357
358
+ #if PHP_CURL_DEBUG
359
+ fprintf (stderr , "curl_write() called\n" );
360
+ fprintf (stderr , "data = %s, size = %d, nmemb = %d, ctx = %x\n" ,
361
+ data , size , nmemb , ctx );
362
+ #endif
363
+
336
364
switch (t -> method ) {
337
365
case PHP_CURL_STDOUT :
338
366
PUTS (data );
@@ -569,15 +597,45 @@ static void curl_free_slist(void **slist)
569
597
/* }}} */
570
598
571
599
572
- /* {{{ proto array curl_version(void )
600
+ /* {{{ proto array curl_version([int version] )
573
601
Return cURL version information. */
574
602
PHP_FUNCTION (curl_version )
575
603
{
576
- if (ZEND_NUM_ARGS () != 0 ) {
577
- WRONG_PARAM_COUNT ;
604
+ curl_version_info_data * d ;
605
+ long uversion = CURLVERSION_NOW ;
606
+
607
+ if (zend_parse_parameters (ZEND_NUM_ARGS () TSRMLS_CC , "|l" , & uversion ) == FAILURE ) {
608
+ return ;
609
+ }
610
+
611
+ d = curl_version_info (uversion );
612
+ if (d == NULL ) {
613
+ RETURN_FALSE ;
578
614
}
579
615
580
- RETURN_STRING (curl_version (), 1 );
616
+ array_init (return_value );
617
+
618
+ CAAL ("version_number" , d -> version_num );
619
+ CAAL ("age" , d -> age );
620
+ CAAL ("features" , d -> features );
621
+ CAAL ("ssl_version_number" , d -> ssl_version_num );
622
+ CAAS ("version" , d -> version );
623
+ CAAS ("host" , d -> host );
624
+ CAAS ("ssl_version" , d -> ssl_version );
625
+ CAAS ("libz_version" , d -> libz_version );
626
+ /* Add an array of protocols */
627
+ {
628
+ char * * p = (char * * ) d -> protocols ;
629
+ zval * protocol_list = NULL ;
630
+
631
+ MAKE_STD_ZVAL (protocol_list );
632
+ array_init (protocol_list );
633
+
634
+ while (* p != NULL ) {
635
+ add_next_index_string (protocol_list , * p ++ , 1 );
636
+ }
637
+ CAAZ ("protocols" , protocol_list );
638
+ }
581
639
}
582
640
/* }}} */
583
641
@@ -707,6 +765,9 @@ PHP_FUNCTION(curl_setopt)
707
765
case CURLOPT_SSL_VERIFYHOST :
708
766
case CURLOPT_SSL_VERIFYPEER :
709
767
case CURLOPT_DNS_USE_GLOBAL_CACHE :
768
+ case CURLOPT_NOSIGNAL :
769
+ case CURLOPT_PROXYTYPE :
770
+ case CURLOPT_BUFFERSIZE :
710
771
case CURLOPT_HTTPGET :
711
772
case CURLOPT_HTTP_VERSION :
712
773
case CURLOPT_CRLF :
@@ -956,10 +1017,10 @@ PHP_FUNCTION(curl_setopt)
956
1017
}
957
1018
/* }}} */
958
1019
959
- /* {{{ cleanup_handle (ch)
1020
+ /* {{{ _php_curl_cleanup_handle (ch)
960
1021
Cleanup an execution phase */
961
- static void
962
- cleanup_handle (php_curl * ch )
1022
+ void
1023
+ _php_curl_cleanup_handle (php_curl * ch )
963
1024
{
964
1025
if (ch -> uses < 1 ) {
965
1026
return ;
@@ -988,7 +1049,7 @@ PHP_FUNCTION(curl_exec)
988
1049
}
989
1050
ZEND_FETCH_RESOURCE (ch , php_curl * , zid , -1 , le_curl_name , le_curl );
990
1051
991
- cleanup_handle (ch );
1052
+ _php_curl_cleanup_handle (ch );
992
1053
993
1054
error = curl_easy_perform (ch -> cp );
994
1055
SAVE_CURL_ERROR (ch , error );
@@ -1005,7 +1066,7 @@ PHP_FUNCTION(curl_exec)
1005
1066
if (ch -> handlers -> write -> method == PHP_CURL_RETURN && ch -> handlers -> write -> buf .len > 0 ) {
1006
1067
if (ch -> handlers -> write -> type != PHP_CURL_BINARY )
1007
1068
smart_str_0 (& ch -> handlers -> write -> buf );
1008
- RETURN_STRINGL (ch -> handlers -> write -> buf .c , ch -> handlers -> write -> buf .len , 1 );
1069
+ RETURN_STRINGL (ch -> handlers -> write -> buf .c , ch -> handlers -> write -> buf .len , 0 );
1009
1070
}
1010
1071
1011
1072
RETURN_TRUE ;
@@ -1182,6 +1243,10 @@ static void _php_curl_close(zend_rsrc_list_entry *rsrc TSRMLS_DC)
1182
1243
{
1183
1244
php_curl * ch = (php_curl * ) rsrc -> ptr ;
1184
1245
1246
+ #if PHP_CURL_DEBUG
1247
+ fprintf (stderr , "DTOR CALLED, ch = %x\n" , ch );
1248
+ #endif
1249
+
1185
1250
curl_easy_cleanup (ch -> cp );
1186
1251
zend_llist_clean (& ch -> to_free .str );
1187
1252
zend_llist_clean (& ch -> to_free .slist );
0 commit comments