X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-http;a=blobdiff_plain;f=http_request_pool_api.c;h=76bd181f0764a023b2b9b99a19c5dfbcbdcd2397;hp=1775293452eddf63cd526c8d23d60d248677370c;hb=b97243b9bffae6ec360cfa7ea2dd1c7f1c3a556f;hpb=b08947e98f1832091c8a9f6dea3799e0524d2822 diff --git a/http_request_pool_api.c b/http_request_pool_api.c index 1775293..76bd181 100644 --- a/http_request_pool_api.c +++ b/http_request_pool_api.c @@ -36,7 +36,11 @@ ZEND_EXTERN_MODULE_GLOBALS(http); -static void http_request_pool_freebody(http_request_body **body); +#ifndef HAVE_CURL_MULTI_STRERROR +# define curl_multi_strerror(dummy) "unknown error" +#endif + +static void http_request_pool_freebody(http_request_callback_ctx **body); static int http_request_pool_compare_handles(void *h1, void *h2); /* {{{ http_request_pool *http_request_pool_init(http_request_pool *) */ @@ -63,7 +67,7 @@ PHP_HTTP_API http_request_pool *_http_request_pool_init(http_request_pool *pool pool->unfinished = 0; zend_llist_init(&pool->handles, sizeof(zval *), (llist_dtor_func_t) ZVAL_PTR_DTOR, 0); - zend_llist_init(&pool->bodies, sizeof(http_request_body *), (llist_dtor_func_t) http_request_pool_freebody, 0); + zend_llist_init(&pool->bodies, sizeof(http_request_callback_ctx *), (llist_dtor_func_t) http_request_pool_freebody, 0); #if HTTP_DEBUG_REQPOOLS fprintf(stderr, "Initialized request pool %p\n", pool); #endif @@ -81,9 +85,9 @@ PHP_HTTP_API STATUS _http_request_pool_attach(http_request_pool *pool, zval *req if (req->pool) { http_error_ex(HE_WARNING, HTTP_E_INVALID_PARAM, "HttpRequest object(#%d) is already member of %s HttpRequestPool", Z_OBJ_HANDLE_P(request), req->pool == pool ? "this" : "another"); } else { - http_request_body *body = http_request_body_new(); + http_request_callback_ctx *body = http_request_callback_data_ex(http_request_body_new(), 0); - if (SUCCESS != http_request_pool_requesthandler(request, body)) { + if (SUCCESS != http_request_pool_requesthandler(request, body->data)) { http_error_ex(HE_WARNING, HTTP_E_REQUEST, "Could not initialize HttpRequest object for attaching to the HttpRequestPool"); } else { CURLMcode code = curl_multi_add_handle(pool->ch, req->ch); @@ -105,6 +109,7 @@ PHP_HTTP_API STATUS _http_request_pool_attach(http_request_pool *pool, zval *req return SUCCESS; } } + efree(body->data); efree(body); } return FAILURE; @@ -163,14 +168,23 @@ PHP_HTTP_API void _http_request_pool_detach_all(http_request_pool *pool TSRMLS_D for (handle = zend_llist_get_first_ex(&pool->handles, &pos); handle; handle = zend_llist_get_next_ex(&pool->handles, &pos)) { handles[i++] = *handle; } + /* should never happen */ + if (i != count) { + zend_error(E_ERROR, "number of fetched request handles do not match overall count"); + count = i; + } for (i = 0; i < count; ++i) { http_request_pool_detach(pool, handles[i]); } efree(handles); } +#if HTTP_DEBUG_REQPOOLS + fprintf(stderr, "Destroying %d request bodies of pool %p\n", zend_llist_count(&pool->bodies), pool); +#endif + /* free created bodies too */ + zend_llist_clean(&pool->bodies); } - /* {{{ STATUS http_request_pool_send(http_request_pool *) */ PHP_HTTP_API STATUS _http_request_pool_send(http_request_pool *pool TSRMLS_DC) { @@ -178,16 +192,28 @@ PHP_HTTP_API STATUS _http_request_pool_send(http_request_pool *pool TSRMLS_DC) fprintf(stderr, "Attempt to send %d requests of pool %p\n", zend_llist_count(&pool->handles), pool); #endif while (http_request_pool_perform(pool)) { -#if HTTP_DEBUG_REQPOOLS - fprintf(stderr, "> %d unfinished requests of pool %p remaining\n", pool->unfinished, pool); -#endif if (SUCCESS != http_request_pool_select(pool)) { - http_error(HE_WARNING, HTTP_E_SOCKET, "Socket error"); +#ifdef PHP_WIN32 + http_error(HE_WARNING, HTTP_E_SOCKET, WSAGetLastError()); +#else + http_error(HE_WARNING, HTTP_E_SOCKET, strerror(errno)); +#endif return FAILURE; } } #if HTTP_DEBUG_REQPOOLS fprintf(stderr, "Finished sending %d HttpRequests of pool %p (still unfinished: %d)\n", zend_llist_count(&pool->handles), pool, pool->unfinished); + { + int remaining = 0; + CURLMsg *msg; + /* + * FIXXME: populate --somehow + */ + do { + if (msg = curl_multi_info_read(pool->ch, &remaining)) + fprintf(stderr, "CURL: %s (%d)\n", curl_easy_strerror(msg->data.result), msg->data.result); + } while (remaining); + } #endif zend_llist_apply(&pool->handles, (llist_apply_func_t) http_request_pool_responsehandler TSRMLS_CC); return SUCCESS; @@ -256,11 +282,12 @@ void _http_request_pool_responsehandler(zval **req TSRMLS_DC) /*#*/ -/* {{{ static void http_request_pool_freebody(http_request_body **) */ -static void http_request_pool_freebody(http_request_body **body) +/* {{{ static void http_request_pool_freebody(http_request_ctx **) */ +static void http_request_pool_freebody(http_request_callback_ctx **body) { - TSRMLS_FETCH(); - http_request_body_free(*body); + HTTP_REQUEST_CALLBACK_DATA(*body, http_request_body *, b); + http_request_body_free(b); + efree(*body); } /* }}} */