-/* {{{ char *http_request_method_name(http_request_method) */
-PHP_HTTP_API const char *_http_request_method_name(http_request_method m TSRMLS_DC)
-{
- zval **meth;
-
- if (HTTP_STD_REQUEST_METHOD(m)) {
- return http_request_methods[m];
- }
-
- if (SUCCESS == zend_hash_index_find(&HTTP_G(request).methods.custom, HTTP_CUSTOM_REQUEST_METHOD(m), (void **) &meth)) {
- return Z_STRVAL_PP(meth);
- }
-
- return http_request_methods[0];
-}
-/* }}} */
-
-/* {{{ unsigned long http_request_method_exists(zend_bool, unsigned long, char *) */
-PHP_HTTP_API unsigned long _http_request_method_exists(zend_bool by_name, unsigned long id, const char *name TSRMLS_DC)
-{
- if (by_name) {
- unsigned i;
-
- for (i = HTTP_NO_REQUEST_METHOD + 1; i < HTTP_MAX_REQUEST_METHOD; ++i) {
- if (!strcmp(name, http_request_methods[i])) {
- return i;
- }
- }
- {
- zval **data;
- char *key;
- ulong idx;
-
- FOREACH_HASH_KEYVAL(&HTTP_G(request).methods.custom, key, idx, data) {
- if (!strcmp(name, Z_STRVAL_PP(data))) {
- return idx + HTTP_MAX_REQUEST_METHOD;
- }
- }
- }
- return 0;
- } else {
- return HTTP_STD_REQUEST_METHOD(id) || zend_hash_index_exists(&HTTP_G(request).methods.custom, HTTP_CUSTOM_REQUEST_METHOD(id)) ? id : 0;
- }
-}
-/* }}} */
-
-/* {{{ unsigned long http_request_method_register(char *) */
-PHP_HTTP_API unsigned long _http_request_method_register(const char *method TSRMLS_DC)
-{
- zval array;
- char *http_method;
- unsigned long meth_num = HTTP_G(request).methods.custom.nNextFreeElement + HTTP_MAX_REQUEST_METHOD;
-
- Z_ARRVAL(array) = &HTTP_G(request).methods.custom;
- add_next_index_string(&array, estrdup(method), 0);
-
- spprintf(&http_method, 0, "HTTP_%s", method);
- zend_register_long_constant(http_method, strlen(http_method) + 1, meth_num, CONST_CS, http_module_number TSRMLS_CC);
- efree(http_method);
-
- return meth_num;
-}
-/* }}} */
-
-/* {{{ STATUS http_request_method_unregister(usngigned long) */
-PHP_HTTP_API STATUS _http_request_method_unregister(unsigned long method TSRMLS_DC)
-{
- zval **zmethod;
- char *http_method;
-
- if (SUCCESS != zend_hash_index_find(&HTTP_G(request).methods.custom, HTTP_CUSTOM_REQUEST_METHOD(method), (void **) &zmethod)) {
- http_error_ex(E_NOTICE, HTTP_E_PARAM, "Request method with id %lu does not exist", method);
- return FAILURE;
- }
-
- spprintf(&http_method, 0, "HTTP_%s", Z_STRVAL_PP(zmethod));
-
- if ( (SUCCESS != zend_hash_index_del(&HTTP_G(request).methods.custom, HTTP_CUSTOM_REQUEST_METHOD(method)))
- || (SUCCESS != zend_hash_del(EG(zend_constants), http_method, strlen(http_method) + 1))) {
- http_error_ex(E_NOTICE, 0, "Could not unregister request method: %s", http_method);
- efree(http_method);
- return FAILURE;
- }
-
- efree(http_method);
- return SUCCESS;
-}
-/* }}} */
-
-
-/* {{{ http_request_pool *http_request_pool_init(http_request_pool *) */
-PHP_HTTP_API http_request_pool *_http_request_pool_init(http_request_pool *pool TSRMLS_DC)
-{
- zend_bool free_pool;
-#if HTTP_DEBUG_REQPOOLS
- fprintf(stderr, "Initializing request pool\n");
-#endif
- if ((free_pool = (!pool))) {
- pool = emalloc(sizeof(http_request_pool));
- pool->ch = NULL;
- }
-
- if (!pool->ch) {
- if (!(pool->ch = curl_multi_init())) {
- http_error(E_WARNING, HTTP_E_CURL, "Could not initialize curl");
- if (free_pool) {
- efree(pool);
- }
- return NULL;
- }
- }
-
- 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);
-#if HTTP_DEBUG_REQPOOLS
- fprintf(stderr, "Initialized request pool %p\n", pool);
-#endif
- return pool;
-}
-/* }}} */
-
-/* {{{ STATUS http_request_pool_attach(http_request_pool *, zval *) */
-PHP_HTTP_API STATUS _http_request_pool_attach(http_request_pool *pool, zval *request TSRMLS_DC)
-{
- getObjectEx(http_request_object, req, request);
-#if HTTP_DEBUG_REQPOOLS
- fprintf(stderr, "Attaching request %p to pool %p\n", req, pool);
-#endif
- if (req->pool) {
- http_error(E_WARNING, HTTP_E_CURL, "HttpRequest object is already member of an HttpRequestPool");
- } else {
- CURLMcode code;
- http_request_body *body = http_request_body_new();
- zval *info = GET_PROP_EX(req, request, responseInfo);
-
- if (SUCCESS != http_request_object_requesthandler(req, request, body)) {
- http_error_ex(E_WARNING, HTTP_E_CURL, "Could not initialize HttpRequest object for attaching to the HttpRequestPool");
- } 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->pool = pool;
- zval_add_ref(&request);
- zend_llist_add_element(&pool->handles, &request);
- zend_llist_add_element(&pool->bodies, &body);
- return SUCCESS;
- }
- efree(body);
- }
- return FAILURE;
-}
-/* }}} */
-
-/* {{{ STATUS http_request_pool_detach(http_request_pool *, zval *) */
-PHP_HTTP_API STATUS _http_request_pool_detach(http_request_pool *pool, zval *request TSRMLS_DC)
-{
- getObjectEx(http_request_object, req, request);
-#if HTTP_DEBUG_REQPOOLS
- fprintf(stderr, "Detaching request %p (pool: %p) from pool %p\n", req, req->pool, pool);
-#endif
- 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->pool = NULL;
- zval_ptr_dtor(&request);
- return SUCCESS;
- }
- }
- return FAILURE;
-}
-/* }}} */
-
-/* {{{ void http_request_pool_detach_all(http_request_pool *) */
-PHP_HTTP_API void _http_request_pool_detach_all(http_request_pool *pool TSRMLS_DC)
-{
-#if HTTP_DEBUG_REQPOOLS
- fprintf(stderr, "Detaching all requests from pool %p\n", pool);
-#endif
- zend_llist_apply_with_argument(&pool->handles, (llist_apply_with_arg_func_t) http_request_pool_freehandle, pool TSRMLS_CC);
-}
-
-
-/* {{{ STATUS http_request_pool_send(http_request_pool *) */
-PHP_HTTP_API STATUS _http_request_pool_send(http_request_pool *pool TSRMLS_DC)
-{
-#if HTTP_DEBUG_REQPOOLS
- fprintf(stderr, "Attempt to send requests of pool %p\n", 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(E_WARNING, HTTP_E_CURL, "Socket error");
- return FAILURE;
- }
- }
- zend_llist_apply(&pool->handles, (llist_apply_func_t) http_request_pool_responsehandler TSRMLS_CC);
- return SUCCESS;
-}
-/* }}} */
-
-/* {{{ void http_request_pool_dtor(http_request_pool *) */
-PHP_HTTP_API void _http_request_pool_dtor(http_request_pool *pool TSRMLS_DC)
-{
-#if HTTP_DEBUG_REQPOOLS
- fprintf(stderr, "Destructing request pool %p\n", pool);
-#endif
- pool->unfinished = 0;
- zend_llist_clean(&pool->handles);
- zend_llist_clean(&pool->bodies);
- curl_multi_cleanup(pool->ch);
-}
-/* }}} */
-
-/* {{{ STATUS http_request_pool_select(http_request_pool *) */
-PHP_HTTP_API STATUS _http_request_pool_select(http_request_pool *pool)
-{
- int MAX;
- fd_set R, W, E;
- struct timeval timeout = {1, 0};
-
- FD_ZERO(&R);
- FD_ZERO(&W);
- FD_ZERO(&E);
-
- curl_multi_fdset(pool->ch, &R, &W, &E, &MAX);
- return (-1 != select(MAX + 1, &R, &W, &E, &timeout)) ? SUCCESS : FAILURE;
-}
-/* }}} */
-
-/* {{{ int http_request_pool_perform(http_request_pool *) */
-PHP_HTTP_API int _http_request_pool_perform(http_request_pool *pool)
-{
- while (CURLM_CALL_MULTI_PERFORM == curl_multi_perform(pool->ch, &pool->unfinished));
- return pool->unfinished;
-}
-/* }}} */
-
-/* {{{ void http_request_pool_responsehandler(zval **) */
-void _http_request_pool_responsehandler(zval **req TSRMLS_DC)
-{
- getObjectEx(http_request_object, obj, *req);
-#if HTTP_DEBUG_REQPOOLS
- fprintf(stderr, "Fetching data from request %p of pool %p\n", obj, obj->pool);
-#endif
- http_request_object_responsehandler(obj, *req);
-}
-/* }}} */
-
-/*#*/
-
-/* {{{ static void http_request_pool_freebody(http_request_body **) */
-static void http_request_pool_freebody(http_request_body **body)
-{
- TSRMLS_FETCH();
- http_request_body_free(*body);
-}
-/* }}} */
-
-/* {{{ static void http_request_pool_freehandle(zval **, http_request_pool *) */
-static void http_request_pool_freehandle(zval **request, http_request_pool *pool TSRMLS_DC)
-{
- getObjectEx(http_request_object, req, *request);
- if (req->pool) {
- http_request_pool_detach(pool, *request);
- }
-#if HTTP_DEBUG_REQPOOLS
- else fprintf(stderr, "Request %p (pool: %p) is not (anymore) attached to pool %p\n", req, req->pool, pool);
-#endif
-}
-/* }}} */
-
-/* {{{ char *http_request_methods[] */
-static const char *const http_request_methods[] = {
- "UNKOWN",
- /* HTTP/1.1 */
- "GET",
- "HEAD",
- "POST",
- "PUT",
- "DELETE",
- "OPTIONS",
- "TRACE",
- "CONNECT",
- /* WebDAV - RFC 2518 */
- "PROPFIND",
- "PROPPATCH",
- "MKCOL",
- "COPY",
- "MOVE",
- "LOCK",
- "UNLOCK",
- /* WebDAV Versioning - RFC 3253 */
- "VERSION-CONTROL",
- "REPORT",
- "CHECKOUT",
- "CHECKIN",
- "UNCHECKOUT",
- "MKWORKSPACE",
- "UPDATE",
- "LABEL",
- "MERGE",
- "BASELINE-CONTROL",
- "MKACTIVITY",
- /* WebDAV Access Control - RFC 3744 */
- "ACL",
- NULL
-};
-/* }}} */
-
-/* {{{ static size_t http_curl_write_callback(char *, size_t, size_t, void *) */
-static size_t http_curl_write_callback(char *buf, size_t len, size_t n, void *s)
-{
- HTTP_CURL_CALLBACK_DATA(s, phpstr *, str);
- return str ? phpstr_append(PHPSTR(str), buf, len * n) : len * n;
-}
-/* }}} */
-