build: fix master
[m6w6/ext-http] / src / php_http_client.c
index b719d2f6676b49ae78d9b525c981e1bd1d25daca..2f8b4aed62df35b79016a276930f21c4666b27b0 100644 (file)
@@ -75,6 +75,7 @@ void php_http_client_options_set_subr(zval *instance, char *key, size_t len, zva
 
                array_init(&new_opts);
                old_opts = zend_read_property(this_ce, instance, ZEND_STRL("options"), 0, &old_opts_tmp);
+
                if (Z_TYPE_P(old_opts) == IS_ARRAY) {
                        array_copy(Z_ARRVAL_P(old_opts), Z_ARRVAL(new_opts));
                }
@@ -88,6 +89,7 @@ void php_http_client_options_set_subr(zval *instance, char *key, size_t len, zva
                        }
                } else if (opts && zend_hash_num_elements(Z_ARRVAL_P(opts))) {
                        if ((entry = zend_symtable_str_find(Z_ARRVAL(new_opts), key, len))) {
+                               SEPARATE_ZVAL(entry);
                                array_join(Z_ARRVAL_P(opts), Z_ARRVAL_P(entry), 0, 0);
                        } else {
                                Z_ADDREF_P(opts);
@@ -376,7 +378,7 @@ static HashTable *php_http_client_object_get_gc(zval *object, zval **table, int
        *n = 0;
        *table = obj->gc = erealloc(obj->gc, sizeof(zval) * count);
 
-#if PHP_HTTP_HAVE_CURL
+#if PHP_HTTP_HAVE_LIBCURL
        if (obj->client->ops == php_http_client_curl_get_ops()) {
                php_http_client_curl_t *curl = obj->client->ctx;
 
@@ -476,7 +478,9 @@ static ZEND_RESULT_CODE handle_response(void *arg, php_http_client_t *client, ph
                        ZVAL_UNDEF(&retval);
                        zend_fcall_info_argn(&e->closure.fci, 1, &zresponse);
                        zend_replace_error_handling(EH_NORMAL, NULL, &zeh);
+                       ++client->callback.depth;
                        zend_fcall_info_call(&e->closure.fci, &e->closure.fcc, &retval, NULL);
+                       --client->callback.depth;
                        zend_restore_error_handling(&zeh);
                        zend_fcall_info_argn(&e->closure.fci, 0);
 
@@ -521,7 +525,9 @@ static void handle_progress(void *arg, php_http_client_t *client, php_http_clien
        add_property_double(&args[1], "ulnow", progress->ul.now);
 
        zend_replace_error_handling(EH_NORMAL, NULL, &zeh);
+       ++client->callback.depth;
        php_http_object_method_call(&client_obj->notify, &zclient, NULL, 2, args);
+       --client->callback.depth;
        zend_restore_error_handling(&zeh);
 
        zval_ptr_dtor(&zclient);
@@ -542,7 +548,9 @@ static void handle_debug(void *arg, php_http_client_t *client, php_http_client_e
 
        zend_replace_error_handling(EH_NORMAL, NULL, &zeh);
        if (SUCCESS == zend_fcall_info_argn(&client_obj->debug.fci, 4, &zclient, &zreq, &ztype, &zdata)) {
+               ++client->callback.depth;
                zend_fcall_info_call(&client_obj->debug.fci, &client_obj->debug.fcc, NULL, NULL);
+               --client->callback.depth;
                zend_fcall_info_args_clear(&client_obj->debug.fci, 0);
        }
        zend_restore_error_handling(&zeh);
@@ -681,7 +689,7 @@ static PHP_METHOD(HttpClient, enqueue)
        zend_fcall_info_cache fcc = empty_fcall_info_cache;
        php_http_client_object_t *obj;
        php_http_message_object_t *msg_obj;
-       php_http_client_enqueue_t q;
+       php_http_client_enqueue_t q = {0};
 
        php_http_expect(SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS(), "O|f", &request, php_http_get_client_request_class_entry(), &fci, &fcc), invalid_arg, return);
 
@@ -693,6 +701,17 @@ static PHP_METHOD(HttpClient, enqueue)
                return;
        }
 
+       /* set early for progress callback */
+       q.opaque = msg_obj;
+
+       if (obj->client->callback.progress.func) {
+               php_http_client_progress_state_t progress = {0};
+
+               progress.info = "prepare";
+               obj->client->callback.progress.func(obj->client->callback.progress.arg, obj->client, &q, &progress);
+       }
+
+       Z_ADDREF_P(request);
        q.request = msg_obj->message;
        q.options = combined_options(getThis(), request);
        q.dtor = msg_queue_dtor;
@@ -703,12 +722,10 @@ static PHP_METHOD(HttpClient, enqueue)
        if (fci.size) {
                Z_TRY_ADDREF(fci.function_name);
                if (fci.object) {
-                       ++GC_REFCOUNT(fci.object);
+                       GC_ADDREF(fci.object);
                }
        }
 
-       Z_ADDREF_P(request);
-
        php_http_expect(SUCCESS == php_http_client_enqueue(obj->client, &q), runtime,
                        msg_queue_dtor(&q);
                        return;
@@ -773,7 +790,7 @@ static PHP_METHOD(HttpClient, requeue)
        if (fci.size) {
                Z_TRY_ADDREF(fci.function_name);
                if (fci.object) {
-                       ++GC_REFCOUNT(fci.object);
+                       GC_ADDREF(fci.object);
                }
        }
 
@@ -1264,7 +1281,8 @@ static PHP_METHOD(HttpClient, getAvailableConfiguration)
 }
 
 ZEND_BEGIN_ARG_INFO_EX(ai_HttpClient_setDebug, 0, 0, 1)
-       ZEND_ARG_TYPE_INFO(0, callback, IS_CALLABLE, 1)
+       /* using IS_CALLABLE type hint would create a forwards compatibility break */
+       ZEND_ARG_INFO(0, callback)
 ZEND_END_ARG_INFO();
 static PHP_METHOD(HttpClient, setDebug)
 {
@@ -1296,7 +1314,7 @@ static PHP_METHOD(HttpClient, setDebug)
 }
 
 static zend_function_entry php_http_client_methods[] = {
-       PHP_ME(HttpClient, __construct,          ai_HttpClient_construct,            ZEND_ACC_PUBLIC|ZEND_ACC_CTOR)
+       PHP_ME(HttpClient, __construct,          ai_HttpClient_construct,            ZEND_ACC_PUBLIC)
        PHP_ME(HttpClient, reset,                ai_HttpClient_reset,                ZEND_ACC_PUBLIC)
        PHP_ME(HttpClient, enqueue,              ai_HttpClient_enqueue,              ZEND_ACC_PUBLIC)
        PHP_ME(HttpClient, dequeue,              ai_HttpClient_dequeue,              ZEND_ACC_PUBLIC)