X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-http;a=blobdiff_plain;f=http_request_api.c;h=5a9093690b4e32384e0b73f8188d09d5ca0b97ec;hp=934bc87f5e58737523c8f4a9d25d4c59a1785c22;hb=b272c1e03de58ff0c01f78421b824c7f45d43959;hpb=b30c267318b2b1add1a01e783f9dbe561a649a7b diff --git a/http_request_api.c b/http_request_api.c index 934bc87..5a90936 100644 --- a/http_request_api.c +++ b/http_request_api.c @@ -124,6 +124,7 @@ typedef struct { static http_curl_callback_ctx *_http_curl_callback_data(void *data TSRMLS_DC); static void http_request_pool_freebody(http_request_body **body); +static void http_request_pool_freehandle(zval **request); static void http_request_pool_responsehandler(zval **req TSRMLS_DC); static inline STATUS http_request_pool_select(http_request_pool *pool); static inline void http_request_pool_perform(http_request_pool *pool); @@ -168,13 +169,13 @@ void *_http_request_data_copy(int type, void *data TSRMLS_DC) zend_llist_add_element(&HTTP_G(request).copies.strings, &new_str); return new_str; } - + case COPY_SLIST: { zend_llist_add_element(&HTTP_G(request).copies.slists, &data); return data; } - + default: { return data; @@ -831,7 +832,7 @@ PHP_HTTP_API STATUS _http_request_pool_attach(http_request_pool *pool, zval *req { getObjectEx(http_request_object, req, request); - if (req->attached) { + if (req->pool) { http_error(E_WARNING, HTTP_E_CURL, "HttpRequest object is already member of an HttpRequestPool"); } else { CURLMcode code; @@ -844,7 +845,7 @@ PHP_HTTP_API STATUS _http_request_pool_attach(http_request_pool *pool, zval *req } else if (CURLM_OK != (code = curl_multi_add_handle(pool->ch, req->ch))) { http_error_ex(E_WARNING, HTTP_E_CURL, "Could not attach HttpRequest object to the HttpRequestPool: %s", curl_multi_strerror(code)); } else { - req->attached = 1; + req->pool = pool; zval_add_ref(&request); zend_llist_add_element(&pool->handles, &request); zend_llist_add_element(&pool->bodies, &body); @@ -860,15 +861,15 @@ PHP_HTTP_API STATUS _http_request_pool_detach(http_request_pool *pool, zval *req { getObjectEx(http_request_object, req, request); - if (!req->attached) { - http_error(E_WARNING, HTTP_E_CURL, "HttpRequest object is not attached to an HttpRequestPool"); + if (req->pool != pool) { + http_error(E_WARNING, HTTP_E_CURL, "HttpRequest object is not attached to this HttpRequestPool"); } else { CURLMcode code; if (CURLM_OK != (code = curl_multi_remove_handle(pool->ch, req->ch))) { http_error_ex(E_WARNING, HTTP_E_CURL, "Could not detach HttpRequest object from the HttpRequestPool: %s", curl_multi_strerror(code)); } else { - req->attached = 0; + req->pool = NULL; zval_ptr_dtor(&request); return SUCCESS; } @@ -893,9 +894,19 @@ PHP_HTTP_API STATUS _http_request_pool_send(http_request_pool *pool TSRMLS_DC) } /* }}} */ +/* {{{ void http_request_pool_dtor(http_request_pool *) */ +PHP_HTTP_API void _http_request_pool_dtor(http_request_pool *pool TSRMLS_DC) +{ + pool->unfinished = 0; + zend_llist_clean(&pool->handles); + zend_llist_clean(&pool->bodies); + curl_multi_cleanup(pool->ch); +} +/* }}} */ + /*#*/ -/* {{{ static void http_request_pool_free_body(http_request_body *) */ +/* {{{ static void http_request_pool_freebody(http_request_body **) */ static void http_request_pool_freebody(http_request_body **body) { TSRMLS_FETCH();