@@ -289,10 +289,11 @@ static size_t curl_write(char *data, size_t size, size_t nmemb, void *ctx)
289
289
retval , 2 , argv );
290
290
if (error == FAILURE ) {
291
291
php_error (E_WARNING , "Cannot call the CURLOPT_WRITEFUNCTION" );
292
- return -1 ;
292
+ length = -1 ;
293
+ }
294
+ else {
295
+ length = Z_LVAL_P (retval );
293
296
}
294
-
295
- length = Z_LVAL_P (retval );
296
297
297
298
zval_ptr_dtor (& argv [0 ]);
298
299
zval_ptr_dtor (& argv [1 ]);
@@ -341,17 +342,17 @@ static size_t curl_read(char *data, size_t size, size_t nmemb, void *ctx)
341
342
retval , 3 , argv );
342
343
if (error == FAILURE ) {
343
344
php_error (E_WARNING , "Cannot call the CURLOPT_READFUNCTION" );
344
- break ;
345
+ length = -1 ;
346
+ }
347
+ else {
348
+ memcpy (data , Z_STRVAL_P (retval ), size * nmemb );
349
+ length = Z_STRLEN_P (retval );
345
350
}
346
-
347
- memcpy (data , Z_STRVAL_P (retval ), Z_STRLEN_P (retval ));
348
- length = Z_STRLEN_P (retval );
349
351
350
352
zval_ptr_dtor (& argv [0 ]);
351
353
zval_ptr_dtor (& argv [1 ]);
352
354
zval_ptr_dtor (& argv [2 ]);
353
355
zval_ptr_dtor (& retval );
354
-
355
356
break ;
356
357
}
357
358
}
@@ -360,54 +361,73 @@ static size_t curl_read(char *data, size_t size, size_t nmemb, void *ctx)
360
361
}
361
362
/* }}} */
362
363
363
- /* {{{ _php_curl_write_header
364
+ /* {{{ curl_write_header
364
365
*/
365
- static size_t _php_curl_write_header (char * data , size_t size , size_t nmemb , void * ctx )
366
+ static size_t curl_write_header (char * data , size_t size , size_t nmemb , void * ctx )
366
367
{
367
- php_curl * ch = (php_curl * ) ctx ;
368
- zval * func = ch -> handlers -> write_header ;
369
- zval * argv [2 ];
370
- zval * retval ;
371
- int error ;
372
- int length ;
368
+ php_curl * ch = (php_curl * ) ctx ;
369
+ php_curl_write * t = ch -> handlers -> write_header ;
370
+ int error ;
371
+ int length ;
373
372
ELS_FETCH ();
373
+
374
+ switch (t -> method ) {
375
+ case PHP_CURL_STDOUT :
376
+ /* Handle special case write when we're returning the entire transfer
377
+ */
378
+ if (ch -> handlers -> write -> method == PHP_CURL_RETURN )
379
+ smart_str_appendl (& ch -> handlers -> write -> buf , data , size * nmemb );
380
+ else
381
+ PUTS (data );
382
+ break ;
383
+ case PHP_CURL_FILE :
384
+ length = fwrite (data , size , nmemb , t -> fp );
385
+ break ;
386
+ case PHP_CURL_USER : {
387
+ zval * argv [2 ];
388
+ zval * retval ;
389
+
390
+ MAKE_STD_ZVAL (argv [0 ]);
391
+ MAKE_STD_ZVAL (argv [1 ]);
392
+ MAKE_STD_ZVAL (retval );
374
393
375
- MAKE_STD_ZVAL (argv [0 ]);
376
- MAKE_STD_ZVAL ( argv [ 1 ] );
377
- MAKE_STD_ZVAL ( retval );
394
+ ZVAL_RESOURCE (argv [0 ], ch -> id );
395
+ zend_list_addref ( ch -> id );
396
+ ZVAL_STRINGL ( argv [ 0 ], data , size * nmemb , 1 );
378
397
379
- ZVAL_RESOURCE (argv [0 ], ch -> id );
380
- zend_list_addref (ch -> id );
381
- ZVAL_STRINGL (argv [0 ], data , size * nmemb , 1 );
398
+ error = call_user_function (EG (function_table ),
399
+ NULL ,
400
+ t -> func ,
401
+ retval , 2 , argv );
402
+ if (error == FAILURE ) {
403
+ php_error (E_WARNING , "Couldn't call the CURLOPT_HEADERFUNCTION" );
404
+ length = -1 ;
405
+ }
406
+ else {
407
+ length = Z_LVAL_P (retval );
408
+ }
382
409
383
- error = call_user_function (EG (function_table ),
384
- NULL ,
385
- func ,
386
- retval , 2 , argv );
387
- if (error == FAILURE ) {
388
- php_error (E_WARNING , "Couldn't call the CURLOPT_HEADERFUNCTION" );
389
- return -1 ;
410
+ zval_ptr_dtor (& argv [0 ]);
411
+ zval_ptr_dtor (& argv [1 ]);
412
+ zval_ptr_dtor (& retval );
413
+ break ;
390
414
}
391
-
392
- length = Z_LVAL_P (retval );
393
-
394
- zval_ptr_dtor (& argv [0 ]);
395
- zval_ptr_dtor (& argv [1 ]);
396
- zval_ptr_dtor (& retval );
397
-
415
+ }
416
+
398
417
return length ;
399
418
}
400
419
/* }}} */
401
420
402
- /* {{{ _php_curl_passwd
421
+ /* {{{ curl_passwd
403
422
*/
404
- static size_t _php_curl_passwd (void * ctx , char * prompt , char * buf , int buflen )
423
+ static size_t curl_passwd (void * ctx , char * prompt , char * buf , int buflen )
405
424
{
406
425
php_curl * ch = (php_curl * ) ctx ;
407
426
zval * func = ch -> handlers -> passwd ;
408
427
zval * argv [3 ];
409
428
zval * retval ;
410
429
int error ;
430
+ int ret = 0 ;
411
431
ELS_FETCH ();
412
432
413
433
MAKE_STD_ZVAL (argv [0 ]);
@@ -425,22 +445,24 @@ static size_t _php_curl_passwd(void *ctx, char *prompt, char *buf, int buflen)
425
445
retval , 2 , argv );
426
446
if (error == FAILURE ) {
427
447
php_error (E_WARNING , "Couldn't call the CURLOPT_PASSWDFUNCTION" );
428
- return -1 ;
448
+ ret = -1 ;
429
449
}
430
-
431
- if (Z_STRLEN_P (retval ) > buflen ) {
432
- php_error (E_WARNING , "Returned password is too long for libcurl to handle" );
433
- return -1 ;
450
+ else {
451
+ if (Z_STRLEN_P (retval ) > buflen ) {
452
+ php_error (E_WARNING , "Returned password is too long for libcurl to handle" );
453
+ ret = -1 ;
454
+ }
455
+ else {
456
+ strlcpy (buf , Z_STRVAL_P (retval ), buflen );
457
+ }
434
458
}
435
-
436
- strlcpy (buf , Z_STRVAL_P (retval ), buflen );
437
-
459
+
438
460
zval_ptr_dtor (& argv [0 ]);
439
461
zval_ptr_dtor (& argv [1 ]);
440
462
zval_ptr_dtor (& argv [2 ]);
441
463
zval_ptr_dtor (& retval );
442
464
443
- return 0 ;
465
+ return ret ;
444
466
}
445
467
/* }}} */
446
468
@@ -483,6 +505,7 @@ static void alloc_curl_handle(php_curl **ch)
483
505
* ch = emalloc (sizeof (php_curl ));
484
506
(* ch )-> handlers = ecalloc (1 , sizeof (php_curl_handlers ));
485
507
(* ch )-> handlers -> write = ecalloc (1 , sizeof (php_curl_write ));
508
+ (* ch )-> handlers -> write_header = ecalloc (1 , sizeof (php_curl_write ));
486
509
(* ch )-> handlers -> read = ecalloc (1 , sizeof (php_curl_read ));
487
510
488
511
zend_llist_init (& (* ch )-> to_free .str , sizeof (char * ),
@@ -526,6 +549,8 @@ PHP_FUNCTION(curl_init)
526
549
curl_easy_setopt (ch -> cp , CURLOPT_FILE , (void * ) ch );
527
550
curl_easy_setopt (ch -> cp , CURLOPT_READFUNCTION , curl_read );
528
551
curl_easy_setopt (ch -> cp , CURLOPT_INFILE , (void * ) ch );
552
+ curl_easy_setopt (ch -> cp , CURLOPT_HEADERFUNCTION , curl_write_header );
553
+ curl_easy_setopt (ch -> cp , CURLOPT_WRITEHEADER , (void * ) ch );
529
554
if (argc > 0 ) {
530
555
char * urlcopy ;
531
556
convert_to_string_ex (url );
@@ -629,17 +654,24 @@ PHP_FUNCTION(curl_setopt)
629
654
FILE * fp ;
630
655
ZEND_FETCH_RESOURCE (fp , FILE * , zvalue , -1 , "File-Handle" , php_file_le_fopen ());
631
656
632
- if (option == CURLOPT_FILE ) {
657
+ error = CURLE_OK ;
658
+ switch (option ) {
659
+ case CURLOPT_FILE :
633
660
ch -> handlers -> write -> fp = fp ;
634
661
ch -> handlers -> write -> method = PHP_CURL_FILE ;
635
- }
636
- else if (option == CURLOPT_INFILE ) {
662
+ break ;
663
+ case CURLOPT_WRITEHEADER :
664
+ ch -> handlers -> write_header -> fp = fp ;
665
+ ch -> handlers -> write_header -> method = PHP_CURL_FILE ;
666
+ break ;
667
+ case CURLOPT_INFILE :
637
668
zend_list_addref (Z_LVAL_PP (zvalue ));
638
669
ch -> handlers -> read -> fp = fp ;
639
670
ch -> handlers -> read -> fd = Z_LVAL_PP (zvalue );
640
- }
641
- else {
671
+ break ;
672
+ default :
642
673
error = curl_easy_setopt (ch -> cp , option , fp );
674
+ break ;
643
675
}
644
676
645
677
break ;
@@ -657,7 +689,7 @@ PHP_FUNCTION(curl_setopt)
657
689
ch -> handlers -> write -> type = PHP_CURL_BINARY ;
658
690
case CURLOPT_WRITEFUNCTION :
659
691
zval_add_ref (zvalue );
660
- ch -> handlers -> write -> func = * zvalue ;
692
+ ch -> handlers -> write -> func = * zvalue ;
661
693
ch -> handlers -> write -> method = PHP_CURL_USER ;
662
694
break ;
663
695
case CURLOPT_READFUNCTION :
@@ -667,14 +699,13 @@ PHP_FUNCTION(curl_setopt)
667
699
break ;
668
700
case CURLOPT_HEADERFUNCTION :
669
701
zval_add_ref (zvalue );
670
- ch -> handlers -> write_header = * zvalue ;
671
- error = curl_easy_setopt (ch -> cp , CURLOPT_HEADERFUNCTION , _php_curl_write_header );
672
- error = curl_easy_setopt (ch -> cp , CURLOPT_WRITEHEADER , (void * ) ch );
702
+ ch -> handlers -> write_header -> func = * zvalue ;
703
+ ch -> handlers -> write_header -> method = PHP_CURL_USER ;
673
704
break ;
674
705
case CURLOPT_PASSWDFUNCTION :
675
706
zval_add_ref (zvalue );
676
707
ch -> handlers -> passwd = * zvalue ;
677
- error = curl_easy_setopt (ch -> cp , CURLOPT_PASSWDFUNCTION , _php_curl_passwd );
708
+ error = curl_easy_setopt (ch -> cp , CURLOPT_PASSWDFUNCTION , curl_passwd );
678
709
error = curl_easy_setopt (ch -> cp , CURLOPT_PASSWDDATA , (void * ) ch );
679
710
break ;
680
711
case CURLOPT_POSTFIELDS :
@@ -963,10 +994,11 @@ static void _php_curl_close(zend_rsrc_list_entry *rsrc)
963
994
964
995
if (ch -> handlers -> write -> func ) zval_ptr_dtor (& ch -> handlers -> write -> func );
965
996
if (ch -> handlers -> read -> func ) zval_ptr_dtor (& ch -> handlers -> read -> func );
966
- if (ch -> handlers -> write_header ) zval_ptr_dtor (& ch -> handlers -> write_header );
997
+ if (ch -> handlers -> write_header -> func ) zval_ptr_dtor (& ch -> handlers -> write_header -> func );
967
998
if (ch -> handlers -> passwd ) zval_ptr_dtor (& ch -> handlers -> passwd );
968
999
969
1000
efree (ch -> handlers -> write );
1001
+ efree (ch -> handlers -> write_header );
970
1002
efree (ch -> handlers -> read );
971
1003
efree (ch -> handlers );
972
1004
efree (ch );
0 commit comments