- avoid callbacks during shutdown
[m6w6/ext-http] / http_request_api.c
index 3f77eff2ae55bc37e2ad541ed9bf1254a5f4e840..b3f7150e62fa240a74aed4ad122afb22e8662b20 100644 (file)
@@ -25,6 +25,9 @@
 #include "php_http_api.h"
 #include "php_http_request_api.h"
 #include "php_http_url_api.h"
+#ifdef ZEND_ENGINE_2
+#      include "php_http_request_object.h"
+#endif
 
 #include "phpstr/phpstr.h"
 
@@ -355,6 +358,7 @@ PHP_HTTP_API STATUS _http_request_init(CURL *ch, http_request_method meth, char
 
        /* progress callback */
        if (zoption = http_curl_getopt(options, "onprogress", 0)) {
+               HTTP_CURL_OPT(NOPROGRESS, 0);
                HTTP_CURL_OPT(PROGRESSFUNCTION, http_curl_progress_callback);
                HTTP_CURL_OPT(PROGRESSDATA,  http_curl_callback_data(zoption));
        } else {
@@ -920,6 +924,10 @@ static int http_curl_progress_callback(void *data, double dltotal, double dlnow,
        params_pass[2] = &params_local[2];
        params_pass[3] = &params_local[3];
 
+       INIT_PZVAL(params_pass[0]);
+       INIT_PZVAL(params_pass[1]);
+       INIT_PZVAL(params_pass[2]);
+       INIT_PZVAL(params_pass[3]);
        ZVAL_DOUBLE(params_pass[0], dltotal);
        ZVAL_DOUBLE(params_pass[1], dlnow);
        ZVAL_DOUBLE(params_pass[2], ultotal);
@@ -929,6 +937,7 @@ static int http_curl_progress_callback(void *data, double dltotal, double dlnow,
 }
 /* }}} */
 
+/* {{{ static int http_curl_debug_callback(CURL *, curl_infotype, char *, size_t, void *) */
 static int http_curl_debug_callback(CURL *ch, curl_infotype type, char *string, size_t length, void *data)
 {
        zval *params_pass[2], params_local[2], retval;
@@ -937,13 +946,28 @@ static int http_curl_debug_callback(CURL *ch, curl_infotype type, char *string,
        params_pass[0] = &params_local[0];
        params_pass[1] = &params_local[1];
 
+       INIT_PZVAL(&retval);
+       INIT_PZVAL(params_pass[0]);
+       INIT_PZVAL(params_pass[1]);
        ZVAL_LONG(params_pass[0], type);
-       ZVAL_STRINGL(params_pass[1], string, length, 1);
+       ZVAL_STRINGL(params_pass[1], string, length, 0);
 
-       call_user_function(EG(function_table), NULL, func, &retval, 2, params_pass TSRMLS_CC);
+#ifdef ZEND_ENGINE_2
+       /* ensure we can call private HttpRequest::debugWrapper() */
+       {
+               void *sc = EG(scope);
+               EG(scope) = http_request_object_ce;
+#endif
+               call_user_function(EG(function_table), NULL, func, &retval, 2, params_pass TSRMLS_CC);
+#ifdef ZEND_ENGINE_2
+               EG(scope) = sc;
+       }
+#endif
 
        return 0;
 }
+/* }}} */
+
 /* {{{ static inline zval *http_curl_getopt(HashTable *, char *, size_t, int) */
 static inline zval *_http_curl_getopt_ex(HashTable *options, char *key, size_t keylen, int type TSRMLS_DC)
 {
@@ -961,7 +985,7 @@ static inline zval *_http_curl_getopt_ex(HashTable *options, char *key, size_t k
                        case IS_DOUBLE: convert_to_double_ex(zoption);  break;
                        case IS_STRING: convert_to_string_ex(zoption);  break;
                        case IS_ARRAY:  convert_to_array_ex(zoption);   break;
-                       case IS_OBJECT: convert_to_object_ex(zoption);  break;
+                       case IS_OBJECT: convert_to_object_ex(zoption);  break;
                        default:
                        break;
                }