iliaa           Thu Jan  5 18:05:37 2006 UTC

  Modified files:              (Branch: PHP_5_1)
    /php-src/ext/curl   interface.c 
    /php-src    NEWS 
  Log:
  MFH4: Fixed bug #35908 (curl extension uses undefined 
GCRY_THREAD_OPTIONS_USER).
  
  
http://cvs.php.net/viewcvs.cgi/php-src/ext/curl/interface.c?r1=1.62.2.9&r2=1.62.2.10&diff_format=u
Index: php-src/ext/curl/interface.c
diff -u php-src/ext/curl/interface.c:1.62.2.9 
php-src/ext/curl/interface.c:1.62.2.10
--- php-src/ext/curl/interface.c:1.62.2.9       Sun Jan  1 12:50:01 2006
+++ php-src/ext/curl/interface.c        Thu Jan  5 18:05:37 2006
@@ -16,7 +16,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: interface.c,v 1.62.2.9 2006/01/01 12:50:01 sniper Exp $ */
+/* $Id: interface.c,v 1.62.2.10 2006/01/05 18:05:37 iliaa Exp $ */
 
 #define ZEND_INCLUDE_FULL_WINDOWS_HEADERS
 
@@ -135,6 +135,7 @@
        PHP_FE(curl_copy_handle,         NULL)
        PHP_FE(curl_version,             NULL)
        PHP_FE(curl_setopt,              NULL)
+       PHP_FE(curl_setopt_array,        NULL)
        PHP_FE(curl_exec,                NULL)
        PHP_FE(curl_getinfo,             NULL)
        PHP_FE(curl_error,               NULL)
@@ -337,6 +338,7 @@
        REGISTER_CURL_CONSTANT(CURLINFO_CONTENT_TYPE);
        REGISTER_CURL_CONSTANT(CURLINFO_REDIRECT_TIME);
        REGISTER_CURL_CONSTANT(CURLINFO_REDIRECT_COUNT);
+       REGISTER_CURL_CONSTANT(CURLINFO_HEADER_OUT);
 
        /* cURL protocol constants (curl_version) */
        REGISTER_CURL_CONSTANT(CURL_VERSION_IPV6);
@@ -719,6 +721,23 @@
 }
 /* }}} */
 
+static int curl_debug(CURL *cp, curl_infotype type, char *buf, size_t buf_len, 
void *ctx)
+{
+       php_curl    *ch   = (php_curl *) ctx;
+
+       if (type == CURLINFO_HEADER_OUT) {
+               if (ch->header.str_len) {
+                       efree(ch->header.str);          
+               }
+               if (buf_len > 0) {
+                       ch->header.str = estrndup(buf, buf_len);
+                       ch->header.str_len = buf_len;
+               }
+       }
+
+       return 0;
+}
+
 #if CURLOPT_PASSWDFUNCTION != 0
 /* {{{ curl_passwd
  */
@@ -841,6 +860,7 @@
        (*ch)->handlers->read         = ecalloc(1, sizeof(php_curl_read));
 
        (*ch)->in_callback = 0;
+       (*ch)->header.str_len = 0;
                
        memset(&(*ch)->err, 0, sizeof((*ch)->err));
        
@@ -949,24 +969,10 @@
 }
 /* }}} */
 
-/* {{{ proto bool curl_setopt(resource ch, int option, mixed value)
-   Set an option for a CURL transfer */
-PHP_FUNCTION(curl_setopt)
+static int _php_curl_setopt(php_curl *ch, long option, zval **zvalue, zval 
*return_value TSRMLS_DC)
 {
-       zval       **zid, **zoption, **zvalue;
-       php_curl    *ch;
        CURLcode     error=CURLE_OK;
-       int          option;
 
-       if (ZEND_NUM_ARGS() != 3 || zend_get_parameters_ex(3, &zid, &zoption, 
&zvalue) == FAILURE) {
-               WRONG_PARAM_COUNT;
-       }
-
-       ZEND_FETCH_RESOURCE(ch, php_curl *, zid, -1, le_curl_name, le_curl);
-
-       convert_to_long_ex(zoption);
-
-       option = Z_LVAL_PP(zoption);
        switch (option) {
                case CURLOPT_INFILESIZE:
                case CURLOPT_VERBOSE:
@@ -1294,17 +1300,83 @@
 
                        break;
                }
+               case CURLINFO_HEADER_OUT:
+                       convert_to_long_ex(zvalue);
+                       if (Z_LVAL_PP(zvalue) == 1) {
+                               curl_easy_setopt(ch->cp, CURLOPT_DEBUGFUNCTION, 
curl_debug);
+                               curl_easy_setopt(ch->cp, CURLOPT_DEBUGDATA, 
(void *)ch);
+                               curl_easy_setopt(ch->cp, CURLOPT_VERBOSE, 1);
+                       } else {
+                               curl_easy_setopt(ch->cp, CURLOPT_DEBUGFUNCTION, 
NULL);
+                               curl_easy_setopt(ch->cp, CURLOPT_DEBUGDATA, 
NULL);
+                               curl_easy_setopt(ch->cp, CURLOPT_VERBOSE, 0);
+                       }
+                       break;
        }
 
        SAVE_CURL_ERROR(ch, error);
        if (error != CURLE_OK) {
-               RETURN_FALSE;
+               return 1;
        } else {
+               return 0;
+       }
+}
+
+/* {{{ proto bool curl_setopt(resource ch, int option, mixed value)
+   Set an option for a CURL transfer */
+PHP_FUNCTION(curl_setopt)
+{
+       zval       **zid, **zoption, **zvalue;
+       php_curl    *ch;
+
+       if (ZEND_NUM_ARGS() != 3 || zend_get_parameters_ex(3, &zid, &zoption, 
&zvalue) == FAILURE) {
+               WRONG_PARAM_COUNT;
+       }
+
+       ZEND_FETCH_RESOURCE(ch, php_curl *, zid, -1, le_curl_name, le_curl);
+
+       convert_to_long_ex(zoption);
+
+       if (!_php_curl_setopt(ch, Z_LVAL_PP(zoption), zvalue, return_value 
TSRMLS_CC)) {
                RETURN_TRUE;
+       } else {
+               RETURN_FALSE;
        }
 }
 /* }}} */
 
+/* {{{ proto bool curl_setopt_array(resource ch, array options)
+   Set an array of option for a CURL transfer */
+PHP_FUNCTION(curl_setopt_array)
+{
+       zval            *zid, *arr, **entry;
+       php_curl        *ch;
+       long            option;
+       HashPosition    pos;
+       char            *string_key;
+       int             str_key_len;
+
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "za", &zid, &arr) 
== FAILURE) {
+               RETURN_FALSE;
+       }
+
+       ZEND_FETCH_RESOURCE(ch, php_curl *, &zid, -1, le_curl_name, le_curl);
+
+       zend_hash_internal_pointer_reset_ex(Z_ARRVAL_P(arr), &pos);
+       while (zend_hash_get_current_data_ex(Z_ARRVAL_P(arr), (void **)&entry, 
&pos) == SUCCESS) {
+               if (zend_hash_get_current_key_ex(Z_ARRVAL_P(arr), &string_key, 
&str_key_len, &option, 0, &pos) == HASH_KEY_IS_STRING) {
+                       php_error_docref(NULL TSRMLS_CC, E_WARNING, "Array keys 
must be CURLOPT constants or equivalent interger values."); 
+                       RETURN_FALSE;
+               }
+               if (_php_curl_setopt(ch, option, entry, return_value 
TSRMLS_CC)) {
+                       RETURN_FALSE;
+               }
+               zend_hash_move_forward_ex(Z_ARRVAL_P(arr), &pos);
+       }
+       RETURN_TRUE;
+}
+/* }}} */
+
 /* {{{ _php_curl_cleanup_handle(ch) 
    Cleanup an execution phase */
 void _php_curl_cleanup_handle(php_curl *ch)
@@ -1312,6 +1384,10 @@
        if (ch->handlers->write->buf.len > 0) {
                memset(&ch->handlers->write->buf, 0, sizeof(smart_str));
        }
+       if (ch->header.str_len) {
+               efree(ch->header.str);
+               ch->header.str_len = 0;
+       }
 
        memset(ch->err.str, 0, CURL_ERROR_SIZE + 1);
        ch->err.no = 0;
@@ -1443,6 +1519,9 @@
                if (curl_easy_getinfo(ch->cp, CURLINFO_REDIRECT_TIME, &d_code) 
== CURLE_OK) {
                        CAAD("redirect_time", d_code);
                }
+               if (ch->header.str_len > 0) {
+                       CAAS("request_header", ch->header.str);
+               }
        } else {
                option = Z_LVAL_PP(zoption);
                switch (option) {
@@ -1493,6 +1572,12 @@
                                }
                                break;
                        }
+                       case CURLINFO_HEADER_OUT:
+                               if (ch->header.str_len > 0) {
+                                       RETURN_STRINGL(ch->header.str, 
ch->header.str_len, 1);
+                               } else {
+                                       RETURN_FALSE;
+                               }
                }
        }
 }
@@ -1586,6 +1671,10 @@
        if (ch->handlers->passwd) {
                zval_ptr_dtor(&ch->handlers->passwd);
        }
+       if (ch->header.str_len > 0) {
+               efree(ch->header.str);
+       }
+
        efree(ch->handlers->write);
        efree(ch->handlers->write_header);
        efree(ch->handlers->read);
@@ -1673,7 +1762,7 @@
 }
 
 static struct gcry_thread_cbs php_curl_gnutls_tsl = {
-       GCRY_THREAD_OPTIONS_USER,
+       GCRY_THREAD_OPTION_USER,
        NULL,
        php_curl_ssl_mutex_create,
        php_curl_ssl_mutex_destroy,
http://cvs.php.net/viewcvs.cgi/php-src/NEWS?r1=1.2027.2.339&r2=1.2027.2.340&diff_format=u
Index: php-src/NEWS
diff -u php-src/NEWS:1.2027.2.339 php-src/NEWS:1.2027.2.340
--- php-src/NEWS:1.2027.2.339   Thu Jan  5 00:47:16 2006
+++ php-src/NEWS        Thu Jan  5 18:05:37 2006
@@ -9,6 +9,8 @@
 - Fixed segfault/leak in imagecolormatch(). (Pierre)
 - Fixed small leak in mysqli_stmt_fetch() when bound variable was empty string.
   (Andrey)
+- Fixed bug #35908 (curl extension uses undefined GCRY_THREAD_OPTIONS_USER).
+  (Ilia)
 - Fixed bug #35887 (wddx_deserialize not parsing dateTime fields properly).
   (Derick)
 - Fixed bug #35885 (strtotime("NOW") no longer works). (Derick)

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to