From a18e662d5ff2c4e7051e028f8002dbba720cccd6 Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Tue, 27 Mar 2012 10:55:44 +0000 Subject: [PATCH] re-enable the factory --- config9.m4 | 49 +++-- php_http.c | 2 + php_http_api.h | 1 + php_http_client.c | 7 + php_http_client.h | 2 + php_http_client_curl.c | 9 +- php_http_client_datashare.h | 2 + php_http_client_datashare_curl.c | 23 ++- php_http_client_datashare_curl.h | 3 + ...est_factory.c => php_http_client_factory.c | 189 ++++++++---------- php_http_client_factory.h | 55 +++++ php_http_client_pool.h | 2 + php_http_client_pool_curl.c | 33 +-- php_http_client_pool_curl.h | 3 + php_http_curl.c | 10 + php_http_request_factory.h | 55 ----- 16 files changed, 243 insertions(+), 202 deletions(-) rename php_http_request_factory.c => php_http_client_factory.c (50%) create mode 100644 php_http_client_factory.h delete mode 100644 php_http_request_factory.h diff --git a/config9.m4 b/config9.m4 index c318e16..9cce66b 100644 --- a/config9.m4 +++ b/config9.m4 @@ -392,9 +392,20 @@ dnl ---- dnl DONE dnl ---- PHP_HTTP_SOURCES="\ - php_http.c \ php_http_buffer.c \ + php_http.c \ + php_http_client.c \ + php_http_client_curl.c \ + php_http_client_datashare.c \ + php_http_client_datashare_curl.c \ + php_http_client_factory.c \ + php_http_client_interface.c \ + php_http_client_pool.c \ + php_http_client_pool_curl.c \ + php_http_client_request.c \ + php_http_client_response.c \ php_http_cookie.c \ + php_http_curl.c \ php_http_encoding.c \ php_http_env.c \ php_http_env_request.c \ @@ -402,8 +413,8 @@ dnl ---- php_http_etag.c \ php_http_exception.c \ php_http_filter.c \ - php_http_headers.c \ php_http_header_parser.c \ + php_http_headers.c \ php_http_info.c \ php_http_message_body.c \ php_http_message.c \ @@ -412,20 +423,10 @@ dnl ---- php_http_negotiate.c \ php_http_object.c \ php_http_params.c \ - php_http_resource_factory.c \ php_http_persistent_handle.c \ php_http_property_proxy.c \ php_http_querystring.c \ - php_http_curl.c \ - php_http_client_interface.c \ - php_http_client.c \ - php_http_client_pool.c \ - php_http_client_datashare.c \ - php_http_client_curl.c \ - php_http_client_pool_curl.c \ - php_http_client_datashare_curl.c \ - php_http_client_request.c \ - php_http_client_response.c \ + php_http_resource_factory.c \ php_http_strlist.c \ php_http_url.c \ php_http_version.c \ @@ -439,10 +440,20 @@ dnl ---- PHP_SUBST([HTTP_SHARED_LIBADD]) PHP_HTTP_HEADERS=" - php_http.h \ php_http_api.h \ php_http_buffer.h \ + php_http_client_curl.h \ + php_http_client_datashare_curl.h \ + php_http_client_datashare.h \ + php_http_client_factory.h \ + php_http_client.h \ + php_http_client_interface.h \ + php_http_client_pool_curl.h \ + php_http_client_pool.h \ + php_http_client_request.h \ + php_http_client_response.h \ php_http_cookie.h \ + php_http_curl.h \ php_http_encoding.h \ php_http_env.h \ php_http_env_request.h \ @@ -450,8 +461,9 @@ dnl ---- php_http_etag.h \ php_http_exception.h \ php_http_filter.h \ - php_http_headers.h \ + php_http.h \ php_http_header_parser.h \ + php_http_headers.h \ php_http_info.h \ php_http_message_body.h \ php_http_message.h \ @@ -460,15 +472,10 @@ dnl ---- php_http_negotiate.h \ php_http_object.h \ php_http_params.h \ - php_http_resource_factory.h \ php_http_persistent_handle.h \ php_http_property_proxy.h \ php_http_querystring.h \ - php_http_request_datashare.h \ - php_http_request.h \ - php_http_request_factory.h \ - php_http_curl.h \ - php_http_request_pool.h \ + php_http_resource_factory.h \ php_http_strlist.h \ php_http_url.h \ php_http_version.h \ diff --git a/php_http.c b/php_http.c index f4b7394..bad11c0 100644 --- a/php_http.c +++ b/php_http.c @@ -146,6 +146,7 @@ PHP_MINIT_FUNCTION(http) || SUCCESS != PHP_MINIT_CALL(http_client_response) || SUCCESS != PHP_MINIT_CALL(http_client_datashare) || SUCCESS != PHP_MINIT_CALL(http_client_pool) + || SUCCESS != PHP_MINIT_CALL(http_client_factory) #if PHP_HTTP_HAVE_CURL || SUCCESS != PHP_MINIT_CALL(http_curl) #endif @@ -176,6 +177,7 @@ PHP_MSHUTDOWN_FUNCTION(http) || SUCCESS != PHP_MSHUTDOWN_CALL(http_curl) #endif || SUCCESS != PHP_MSHUTDOWN_CALL(http_persistent_handle) + || SUCCESS != PHP_MSHUTDOWN_CALL(http_client_factory) ) { return FAILURE; } diff --git a/php_http_api.h b/php_http_api.h index bc3a2f5..a754267 100644 --- a/php_http_api.h +++ b/php_http_api.h @@ -104,6 +104,7 @@ typedef int STATUS; #include "php_http_client_pool_curl.h" #include "php_http_client_datashare.h" #include "php_http_client_datashare_curl.h" +#include "php_http_client_factory.h" #include "php_http_url.h" #include "php_http_version.h" diff --git a/php_http_client.c b/php_http_client.c index e0f7bc8..9c4589b 100644 --- a/php_http_client.c +++ b/php_http_client.c @@ -750,6 +750,13 @@ static inline void php_http_client_object_get_options_subr(INTERNAL_FUNCTION_PAR PHP_METHOD(HttpClient, __construct) { with_error_handling(EH_THROW, php_http_exception_class_entry) { + zval *os; + + MAKE_STD_ZVAL(os); + object_init_ex(os, spl_ce_SplObjectStorage); + zend_update_property(php_http_client_class_entry, getThis(), ZEND_STRL("observers"), os TSRMLS_CC); + zval_ptr_dtor(&os); + php_http_client_object_set_options(INTERNAL_FUNCTION_PARAM_PASSTHRU); } end_error_handling(); } diff --git a/php_http_client.h b/php_http_client.h index 4fdef59..12e557e 100644 --- a/php_http_client.h +++ b/php_http_client.h @@ -136,6 +136,8 @@ typedef struct php_http_client_ops { php_http_client_exec_func_t exec; php_http_client_setopt_func_t setopt; php_http_client_getopt_func_t getopt; + php_http_new_t create_object; + zend_class_entry *(*class_entry)(void); } php_http_client_ops_t; typedef struct php_http_client { diff --git a/php_http_client_curl.c b/php_http_client_curl.c index a89a807..554b57c 100644 --- a/php_http_client_curl.c +++ b/php_http_client_curl.c @@ -1243,6 +1243,11 @@ static php_http_resource_factory_ops_t php_http_client_curl_resource_factory_ops php_http_curl_dtor }; +static zend_class_entry *get_class_entry(void) +{ + return php_http_client_curl_class_entry; +} + static php_http_client_ops_t php_http_client_curl_ops = { &php_http_client_curl_resource_factory_ops, php_http_client_curl_init, @@ -1251,7 +1256,9 @@ static php_http_client_ops_t php_http_client_curl_ops = { php_http_client_curl_reset, php_http_client_curl_exec, php_http_client_curl_setopt, - php_http_client_curl_getopt + php_http_client_curl_getopt, + (php_http_new_t) php_http_client_curl_object_new_ex, + get_class_entry }; PHP_HTTP_API php_http_client_ops_t *php_http_client_curl_get_ops(void) diff --git a/php_http_client_datashare.h b/php_http_client_datashare.h index a68c00a..fb3fc55 100644 --- a/php_http_client_datashare.h +++ b/php_http_client_datashare.h @@ -36,6 +36,8 @@ typedef struct php_http_client_datashare_ops { php_http_client_datashare_attach_func_t attach; php_http_client_datashare_detach_func_t detach; php_http_client_datashare_setopt_func_t setopt; + php_http_new_t create_object; + zend_class_entry *(*class_entry)(void); } php_http_client_datashare_ops_t; typedef struct php_http_client_datashare { diff --git a/php_http_client_datashare_curl.c b/php_http_client_datashare_curl.c index 8c62a02..c5201f8 100644 --- a/php_http_client_datashare_curl.c +++ b/php_http_client_datashare_curl.c @@ -136,15 +136,22 @@ static php_http_resource_factory_ops_t php_http_curlsh_resource_factory_ops = { php_http_curlsh_dtor }; +static zend_class_entry *get_class_entry(void) +{ + return php_http_client_datashare_curl_class_entry; +} + static php_http_client_datashare_ops_t php_http_client_datashare_curl_ops = { - &php_http_curlsh_resource_factory_ops, - php_http_client_datashare_curl_init, - NULL /* copy */, - php_http_client_datashare_curl_dtor, - NULL /*reset */, - php_http_client_datashare_curl_attach, - php_http_client_datashare_curl_detach, - php_http_client_datashare_curl_setopt, + &php_http_curlsh_resource_factory_ops, + php_http_client_datashare_curl_init, + NULL /* copy */, + php_http_client_datashare_curl_dtor, + NULL /*reset */, + php_http_client_datashare_curl_attach, + php_http_client_datashare_curl_detach, + php_http_client_datashare_curl_setopt, + (php_http_new_t) php_http_client_datashare_curl_object_new_ex, + get_class_entry }; PHP_HTTP_API php_http_client_datashare_ops_t *php_http_client_datashare_curl_get_ops(void) diff --git a/php_http_client_datashare_curl.h b/php_http_client_datashare_curl.h index 74859d0..c13689b 100644 --- a/php_http_client_datashare_curl.h +++ b/php_http_client_datashare_curl.h @@ -17,6 +17,9 @@ PHP_HTTP_API php_http_client_datashare_ops_t *php_http_client_datashare_curl_get_ops(void); +extern zend_class_entry *php_http_client_datashare_curl_class_entry; +extern zend_function_entry php_http_client_datashare_curl_method_entry[]; + extern zend_object_value php_http_client_datashare_curl_object_new(zend_class_entry *ce TSRMLS_DC); extern zend_object_value php_http_client_datashare_curl_object_new_ex(zend_class_entry *ce, php_http_client_datashare_t *share, php_http_client_datashare_object_t **ptr TSRMLS_DC); diff --git a/php_http_request_factory.c b/php_http_client_factory.c similarity index 50% rename from php_http_request_factory.c rename to php_http_client_factory.c index 8d18ab1..45986c4 100644 --- a/php_http_request_factory.c +++ b/php_http_client_factory.c @@ -15,27 +15,27 @@ #include /* - * array of name => php_http_request_factory_driver_t* + * array of name => php_http_client_factory_driver_t* */ -static HashTable php_http_request_factory_drivers; +static HashTable php_http_client_factory_drivers; -PHP_HTTP_API STATUS php_http_request_factory_add_driver(const char *name_str, size_t name_len, php_http_request_factory_driver_t *driver) +PHP_HTTP_API STATUS php_http_client_factory_add_driver(const char *name_str, size_t name_len, php_http_client_factory_driver_t *driver) { - return zend_hash_add(&php_http_request_factory_drivers, name_str, name_len + 1, (void *) driver, sizeof(php_http_request_factory_driver_t), NULL); + return zend_hash_add(&php_http_client_factory_drivers, name_str, name_len + 1, (void *) driver, sizeof(php_http_client_factory_driver_t), NULL); } -PHP_HTTP_API STATUS php_http_request_factory_get_driver(const char *name_str, size_t name_len, php_http_request_factory_driver_t *driver) +PHP_HTTP_API STATUS php_http_client_factory_get_driver(const char *name_str, size_t name_len, php_http_client_factory_driver_t *driver) { - php_http_request_factory_driver_t *tmp; + php_http_client_factory_driver_t *tmp; - if (SUCCESS == zend_hash_find(&php_http_request_factory_drivers, name_str, name_len + 1, (void *) &tmp)) { + if (SUCCESS == zend_hash_find(&php_http_client_factory_drivers, name_str, name_len + 1, (void *) &tmp)) { *driver = *tmp; return SUCCESS; } return FAILURE; } -static zend_class_entry *php_http_request_factory_get_class_entry(zval *this_ptr, const char *for_str, size_t for_len TSRMLS_DC) +static zend_class_entry *php_http_client_factory_get_class_entry(zval *this_ptr, const char *for_str, size_t for_len TSRMLS_DC) { /* stupid non-const api */ char *sc = estrndup(for_str, for_len); @@ -49,37 +49,35 @@ static zend_class_entry *php_http_request_factory_get_class_entry(zval *this_ptr return NULL; } -#define PHP_HTTP_BEGIN_ARGS(method, req_args) PHP_HTTP_BEGIN_ARGS_EX(HttpRequestFactory, method, 0, req_args) -#define PHP_HTTP_EMPTY_ARGS(method) PHP_HTTP_EMPTY_ARGS_EX(HttpRequestFactory, method, 0) -#define PHP_HTTP_REQUEST_FACTORY_ME(method, visibility) PHP_ME(HttpRequestFactory, method, PHP_HTTP_ARGS(HttpRequestFactory, method), visibility) -#define PHP_HTTP_REQUEST_FACTORY_ALIAS(method, func) PHP_HTTP_STATIC_ME_ALIAS(method, func, PHP_HTTP_ARGS(HttpRequestFactory, method)) -#define PHP_HTTP_REQUEST_FACTORY_MALIAS(me, al, vis) ZEND_FENTRY(me, ZEND_MN(HttpRequestFactory_##al), PHP_HTTP_ARGS(HttpRequestFactory, al), vis) +#define PHP_HTTP_BEGIN_ARGS(method, req_args) PHP_HTTP_BEGIN_ARGS_EX(HttpClientFactory, method, 0, req_args) +#define PHP_HTTP_EMPTY_ARGS(method) PHP_HTTP_EMPTY_ARGS_EX(HttpClientFactory, method, 0) +#define PHP_HTTP_REQUEST_FACTORY_ME(method, visibility) PHP_ME(HttpClientFactory, method, PHP_HTTP_ARGS(HttpClientFactory, method), visibility) +#define PHP_HTTP_REQUEST_FACTORY_ALIAS(method, func) PHP_HTTP_STATIC_ME_ALIAS(method, func, PHP_HTTP_ARGS(HttpClientFactory, method)) +#define PHP_HTTP_REQUEST_FACTORY_MALIAS(me, al, vis) ZEND_FENTRY(me, ZEND_MN(HttpClientFactory_##al), PHP_HTTP_ARGS(HttpClientFactory, al), vis) PHP_HTTP_BEGIN_ARGS(__construct, 1) PHP_HTTP_ARG_VAL(options, 0) PHP_HTTP_END_ARGS; -PHP_HTTP_BEGIN_ARGS(createRequest, 0) - PHP_HTTP_ARG_VAL(url, 0) - PHP_HTTP_ARG_VAL(method, 0) - PHP_HTTP_ARG_VAL(options, 0) +PHP_HTTP_BEGIN_ARGS(createClient, 0) + PHP_HTTP_ARG_ARR(options, 1, 0) PHP_HTTP_END_ARGS; PHP_HTTP_BEGIN_ARGS(createPool, 0) - PHP_HTTP_ARG_OBJ(http\\Request, request1, 1) - PHP_HTTP_ARG_OBJ(http\\Request, request2, 1) - PHP_HTTP_ARG_OBJ(http\\Request, requestN, 1) + PHP_HTTP_ARG_OBJ(http\\Client, client1, 1) + PHP_HTTP_ARG_OBJ(http\\Client, client2, 1) + PHP_HTTP_ARG_OBJ(http\\Client, clientN, 1) PHP_HTTP_END_ARGS; PHP_HTTP_BEGIN_ARGS(createDataShare, 0) - PHP_HTTP_ARG_OBJ(http\\Request, request1, 1) - PHP_HTTP_ARG_OBJ(http\\Request, request2, 1) - PHP_HTTP_ARG_OBJ(http\\Request, requestN, 1) + PHP_HTTP_ARG_OBJ(http\\Client, client1, 1) + PHP_HTTP_ARG_OBJ(http\\Client, client2, 1) + PHP_HTTP_ARG_OBJ(http\\Client, clientN, 1) PHP_HTTP_END_ARGS; PHP_HTTP_EMPTY_ARGS(getDriver); PHP_HTTP_EMPTY_ARGS(getAvailableDrivers); -zend_class_entry *php_http_request_factory_class_entry; -zend_function_entry php_http_request_factory_method_entry[] = { +zend_class_entry *php_http_client_factory_class_entry; +zend_function_entry php_http_client_factory_method_entry[] = { PHP_HTTP_REQUEST_FACTORY_ME(__construct, ZEND_ACC_PUBLIC|ZEND_ACC_CTOR) - PHP_HTTP_REQUEST_FACTORY_ME(createRequest, ZEND_ACC_PUBLIC) + PHP_HTTP_REQUEST_FACTORY_ME(createClient, ZEND_ACC_PUBLIC) PHP_HTTP_REQUEST_FACTORY_ME(createPool, ZEND_ACC_PUBLIC) PHP_HTTP_REQUEST_FACTORY_ME(createDataShare, ZEND_ACC_PUBLIC) PHP_HTTP_REQUEST_FACTORY_ME(getDriver, ZEND_ACC_PUBLIC) @@ -88,7 +86,7 @@ zend_function_entry php_http_request_factory_method_entry[] = { EMPTY_FUNCTION_ENTRY }; -PHP_METHOD(HttpRequestFactory, __construct) +PHP_METHOD(HttpClientFactory, __construct) { with_error_handling(EH_THROW, php_http_exception_class_entry) { HashTable *options = NULL; @@ -102,7 +100,7 @@ PHP_METHOD(HttpRequestFactory, __construct) FOREACH_HASH_KEYVAL(pos, options, key, val) { if (key.type == HASH_KEY_IS_STRING) { zval *newval = php_http_zsep(1, Z_TYPE_PP(val), *val); - zend_update_property(php_http_request_factory_class_entry, getThis(), key.str, key.len - 1, newval TSRMLS_CC); + zend_update_property(php_http_client_factory_class_entry, getThis(), key.str, key.len - 1, newval TSRMLS_CC); zval_ptr_dtor(&newval); } } @@ -111,31 +109,23 @@ PHP_METHOD(HttpRequestFactory, __construct) } end_error_handling(); } -PHP_METHOD(HttpRequestFactory, createRequest) +PHP_METHOD(HttpClientFactory, createClient) { - char *meth_str = NULL, *url_str = NULL; - int meth_len, url_len; zval *options = NULL; with_error_handling(EH_THROW, php_http_exception_class_entry) { - if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s!s!a!", &url_str, &url_len, &meth_str, &meth_len, &options)) { + if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|a!", &options)) { with_error_handling(EH_THROW, php_http_exception_class_entry) { zval *zdriver, *os; zend_object_value ov; zend_class_entry *class_entry = NULL; php_http_client_t *req = NULL; - php_http_request_factory_driver_t driver; - - class_entry = php_http_request_factory_get_class_entry(getThis(), ZEND_STRL("requestClass") TSRMLS_CC); + php_http_client_factory_driver_t driver; - if (!class_entry) { - class_entry = php_http_client_class_entry; - } + zdriver = zend_read_property(php_http_client_factory_class_entry, getThis(), ZEND_STRL("driver"), 0 TSRMLS_CC); - zdriver = zend_read_property(php_http_request_factory_class_entry, getThis(), ZEND_STRL("driver"), 0 TSRMLS_CC); - - if ((IS_STRING == Z_TYPE_P(zdriver)) && (SUCCESS == php_http_request_factory_get_driver(Z_STRVAL_P(zdriver), Z_STRLEN_P(zdriver), &driver)) && driver.request_ops) { - zval *phi = php_http_zsep(1, IS_STRING, zend_read_property(php_http_request_factory_class_entry, getThis(), ZEND_STRL("persistentHandleId"), 0 TSRMLS_CC)); + if ((IS_STRING == Z_TYPE_P(zdriver)) && (SUCCESS == php_http_client_factory_get_driver(Z_STRVAL_P(zdriver), Z_STRLEN_P(zdriver), &driver)) && driver.client_ops) { + zval *phi = php_http_zsep(1, IS_STRING, zend_read_property(php_http_client_factory_class_entry, getThis(), ZEND_STRL("persistentHandleId"), 0 TSRMLS_CC)); php_http_resource_factory_t *rf = NULL; if (Z_STRLEN_P(phi)) { @@ -143,7 +133,7 @@ PHP_METHOD(HttpRequestFactory, createRequest) size_t name_len; php_http_persistent_handle_factory_t *pf; - name_len = spprintf(&name_str, 0, "http_request.%s", Z_STRVAL_P(zdriver)); + name_len = spprintf(&name_str, 0, "http_client.%s", Z_STRVAL_P(zdriver)); if ((pf = php_http_persistent_handle_concede(NULL , name_str, name_len, Z_STRVAL_P(phi), Z_STRLEN_P(phi) TSRMLS_CC))) { rf = php_http_resource_factory_init(NULL, php_http_persistent_handle_resource_factory_ops(), pf, (void (*)(void *)) php_http_persistent_handle_abandon); @@ -152,25 +142,16 @@ PHP_METHOD(HttpRequestFactory, createRequest) efree(name_str); } - req = php_http_client_init(NULL, driver.request_ops, rf, NULL TSRMLS_CC); + req = php_http_client_init(NULL, driver.client_ops, rf, NULL TSRMLS_CC); if (req) { - if (SUCCESS == php_http_new(&ov, class_entry, (php_http_new_t) php_http_client_object_new_ex, php_http_client_class_entry, req, NULL TSRMLS_CC)) { - ZVAL_OBJVAL(return_value, ov, 0); + if (!(class_entry = php_http_client_factory_get_class_entry(getThis(), ZEND_STRL("clientClass") TSRMLS_CC))) { + class_entry = driver.client_ops->class_entry(); + } - MAKE_STD_ZVAL(os); - object_init_ex(os, spl_ce_SplObjectStorage); - zend_update_property(php_http_client_class_entry, return_value, ZEND_STRL("observers"), os TSRMLS_CC); - zval_ptr_dtor(&os); + if (SUCCESS == php_http_new(&ov, class_entry, driver.client_ops->create_object, driver.client_ops->class_entry(), req, NULL TSRMLS_CC)) { + ZVAL_OBJVAL(return_value, ov, 0); - if (url_str) { - zend_update_property_stringl(php_http_client_class_entry, return_value, ZEND_STRL("url"), url_str, url_len TSRMLS_CC); - } - if (meth_str) { - zend_update_property_stringl(php_http_client_class_entry, return_value, ZEND_STRL("method"), meth_str, meth_len TSRMLS_CC); - } - if (options) { - zend_call_method_with_1_params(&return_value, Z_OBJCE_P(return_value), NULL, "setoptions", NULL, options); - } + zend_call_method_with_1_params(&return_value, Z_OBJCE_P(return_value), NULL, "__construct", NULL, options); } else { php_http_client_free(&req); } @@ -178,14 +159,14 @@ PHP_METHOD(HttpRequestFactory, createRequest) zval_ptr_dtor(&phi); } else { - php_http_error(HE_WARNING, PHP_HTTP_E_REQUEST_FACTORY, "requests are not supported by this driver"); + php_http_error(HE_WARNING, PHP_HTTP_E_REQUEST_FACTORY, "clients are not supported by this driver"); } } end_error_handling(); } } end_error_handling(); } -PHP_METHOD(HttpRequestFactory, createPool) +PHP_METHOD(HttpClientFactory, createPool) { int argc = 0; zval ***argv; @@ -197,16 +178,12 @@ PHP_METHOD(HttpRequestFactory, createPool) zval *zdriver; zend_object_value ov; zend_class_entry *class_entry = NULL; - php_http_request_pool_t *pool = NULL; - php_http_request_factory_driver_t driver; - - if (!(class_entry = php_http_request_factory_get_class_entry(getThis(), ZEND_STRL("requestPoolClass") TSRMLS_CC))) { - class_entry = php_http_request_pool_class_entry; - } + php_http_client_pool_t *pool = NULL; + php_http_client_factory_driver_t driver; - zdriver = zend_read_property(php_http_request_factory_class_entry, getThis(), ZEND_STRL("driver"), 0 TSRMLS_CC); - if ((IS_STRING == Z_TYPE_P(zdriver)) && (SUCCESS == php_http_request_factory_get_driver(Z_STRVAL_P(zdriver), Z_STRLEN_P(zdriver), &driver)) && driver.request_pool_ops) { - zval *phi = php_http_zsep(1, IS_STRING, zend_read_property(php_http_request_factory_class_entry, getThis(), ZEND_STRL("persistentHandleId"), 0 TSRMLS_CC)); + zdriver = zend_read_property(php_http_client_factory_class_entry, getThis(), ZEND_STRL("driver"), 0 TSRMLS_CC); + if ((IS_STRING == Z_TYPE_P(zdriver)) && (SUCCESS == php_http_client_factory_get_driver(Z_STRVAL_P(zdriver), Z_STRLEN_P(zdriver), &driver)) && driver.client_pool_ops) { + zval *phi = php_http_zsep(1, IS_STRING, zend_read_property(php_http_client_factory_class_entry, getThis(), ZEND_STRL("persistentHandleId"), 0 TSRMLS_CC)); php_http_resource_factory_t *rf = NULL; if (Z_STRLEN_P(phi)) { @@ -214,7 +191,7 @@ PHP_METHOD(HttpRequestFactory, createPool) size_t name_len; php_http_persistent_handle_factory_t *pf; - name_len = spprintf(&name_str, 0, "http_request_pool.%s", Z_STRVAL_P(zdriver)); + name_len = spprintf(&name_str, 0, "http_client_pool.%s", Z_STRVAL_P(zdriver)); if ((pf = php_http_persistent_handle_concede(NULL , name_str, name_len, Z_STRVAL_P(phi), Z_STRLEN_P(phi) TSRMLS_CC))) { rf = php_http_resource_factory_init(NULL, php_http_persistent_handle_resource_factory_ops(), pf, (void (*)(void *)) php_http_persistent_handle_abandon); @@ -223,17 +200,21 @@ PHP_METHOD(HttpRequestFactory, createPool) efree(name_str); } - pool = php_http_request_pool_init(NULL, driver.request_pool_ops, rf, NULL TSRMLS_CC); + pool = php_http_client_pool_init(NULL, driver.client_pool_ops, rf, NULL TSRMLS_CC); if (pool) { - if (SUCCESS == php_http_new(&ov, class_entry, (php_http_new_t) php_http_request_pool_object_new_ex, php_http_request_pool_class_entry, pool, NULL TSRMLS_CC)) { + if (!(class_entry = php_http_client_factory_get_class_entry(getThis(), ZEND_STRL("clientPoolClass") TSRMLS_CC))) { + class_entry = driver.client_pool_ops->class_entry(); + } + + if (SUCCESS == php_http_new(&ov, class_entry, driver.client_pool_ops->create_object, driver.client_pool_ops->class_entry(), pool, NULL TSRMLS_CC)) { ZVAL_OBJVAL(return_value, ov, 0); for (i = 0; i < argc; ++i) { if (Z_TYPE_PP(argv[i]) == IS_OBJECT && instanceof_function(Z_OBJCE_PP(argv[i]), php_http_client_class_entry TSRMLS_CC)) { - php_http_request_pool_attach(pool, *(argv[i])); + php_http_client_pool_attach(pool, *(argv[i])); } } } else { - php_http_request_pool_free(&pool); + php_http_client_pool_free(&pool); } } @@ -246,7 +227,7 @@ PHP_METHOD(HttpRequestFactory, createPool) } end_error_handling(); } -PHP_METHOD(HttpRequestFactory, createDataShare) +PHP_METHOD(HttpClientFactory, createDataShare) { int argc = 0; zval ***argv; @@ -259,15 +240,11 @@ PHP_METHOD(HttpRequestFactory, createDataShare) zend_object_value ov; zend_class_entry *class_entry; php_http_client_datashare_t *share = NULL; - php_http_request_factory_driver_t driver; + php_http_client_factory_driver_t driver; - if (!(class_entry = php_http_request_factory_get_class_entry(getThis(), ZEND_STRL("requestDataShareClass") TSRMLS_CC))) { - class_entry = php_http_request_datashare_class_entry; - } - - zdriver = zend_read_property(php_http_request_factory_class_entry, getThis(), ZEND_STRL("driver"), 0 TSRMLS_CC); - if ((IS_STRING == Z_TYPE_P(zdriver)) && (SUCCESS == php_http_request_factory_get_driver(Z_STRVAL_P(zdriver), Z_STRLEN_P(zdriver), &driver)) && driver.request_datashare_ops) { - zval *phi = php_http_zsep(1, IS_STRING, zend_read_property(php_http_request_factory_class_entry, getThis(), ZEND_STRL("persistentHandleId"), 0 TSRMLS_CC)); + zdriver = zend_read_property(php_http_client_factory_class_entry, getThis(), ZEND_STRL("driver"), 0 TSRMLS_CC); + if ((IS_STRING == Z_TYPE_P(zdriver)) && (SUCCESS == php_http_client_factory_get_driver(Z_STRVAL_P(zdriver), Z_STRLEN_P(zdriver), &driver)) && driver.client_datashare_ops) { + zval *phi = php_http_zsep(1, IS_STRING, zend_read_property(php_http_client_factory_class_entry, getThis(), ZEND_STRL("persistentHandleId"), 0 TSRMLS_CC)); php_http_resource_factory_t *rf = NULL; if (Z_STRLEN_P(phi)) { @@ -275,7 +252,7 @@ PHP_METHOD(HttpRequestFactory, createDataShare) size_t name_len; php_http_persistent_handle_factory_t *pf; - name_len = spprintf(&name_str, 0, "http_request_datashare.%s", Z_STRVAL_P(zdriver)); + name_len = spprintf(&name_str, 0, "http_client_datashare.%s", Z_STRVAL_P(zdriver)); if ((pf = php_http_persistent_handle_concede(NULL , name_str, name_len, Z_STRVAL_P(phi), Z_STRLEN_P(phi) TSRMLS_CC))) { rf = php_http_resource_factory_init(NULL, php_http_persistent_handle_resource_factory_ops(), pf, (void (*)(void *)) php_http_persistent_handle_abandon); @@ -284,17 +261,21 @@ PHP_METHOD(HttpRequestFactory, createDataShare) efree(name_str); } - share = php_http_client_datashare_init(NULL, driver.request_datashare_ops, rf, NULL TSRMLS_CC); + share = php_http_client_datashare_init(NULL, driver.client_datashare_ops, rf, NULL TSRMLS_CC); if (share) { - if (SUCCESS == php_http_new(&ov, class_entry, (php_http_new_t) php_http_request_datashare_object_new_ex, php_http_request_datashare_class_entry, share, NULL TSRMLS_CC)) { + if (!(class_entry = php_http_client_factory_get_class_entry(getThis(), ZEND_STRL("clientDataShareClass") TSRMLS_CC))) { + class_entry = driver.client_datashare_ops->class_entry(); + } + + if (SUCCESS == php_http_new(&ov, class_entry, driver.client_datashare_ops->create_object, driver.client_datashare_ops->class_entry(), share, NULL TSRMLS_CC)) { ZVAL_OBJVAL(return_value, ov, 0); for (i = 0; i < argc; ++i) { if (Z_TYPE_PP(argv[i]) == IS_OBJECT && instanceof_function(Z_OBJCE_PP(argv[i]), php_http_client_class_entry TSRMLS_CC)) { - php_http_request_datashare_attach(share, *(argv[i])); + php_http_client_datashare_attach(share, *(argv[i])); } } } else { - php_http_request_datashare_free(&share); + php_http_client_datashare_free(&share); } } @@ -307,22 +288,22 @@ PHP_METHOD(HttpRequestFactory, createDataShare) } end_error_handling(); } -PHP_METHOD(HttpRequestFactory, getDriver) +PHP_METHOD(HttpClientFactory, getDriver) { if (SUCCESS == zend_parse_parameters_none()) { - RETURN_PROP(php_http_request_factory_class_entry, "driver"); + RETURN_PROP(php_http_client_factory_class_entry, "driver"); } RETURN_FALSE; } -PHP_METHOD(HttpRequestFactory, getAvailableDrivers) +PHP_METHOD(HttpClientFactory, getAvailableDrivers) { if (SUCCESS == zend_parse_parameters_none()) { HashPosition pos; php_http_array_hashkey_t key = php_http_array_hashkey_init(0); array_init(return_value); - FOREACH_HASH_KEY(pos, &php_http_request_factory_drivers, key) { + FOREACH_HASH_KEY(pos, &php_http_client_factory_drivers, key) { add_next_index_stringl(return_value, key.str, key.len - 1, 1); } return; @@ -330,25 +311,25 @@ PHP_METHOD(HttpRequestFactory, getAvailableDrivers) RETURN_FALSE; } -PHP_MINIT_FUNCTION(http_request_factory) +PHP_MINIT_FUNCTION(http_client_factory) { - zend_hash_init(&php_http_request_factory_drivers, 0, NULL, NULL, 1); + zend_hash_init(&php_http_client_factory_drivers, 0, NULL, NULL, 1); - PHP_HTTP_REGISTER_CLASS(http\\Request, Factory, http_request_factory, php_http_object_class_entry, 0); - php_http_request_factory_class_entry->create_object = php_http_request_factory_new; + PHP_HTTP_REGISTER_CLASS(http\\Client, Factory, http_client_factory, php_http_object_class_entry, 0); + php_http_client_factory_class_entry->create_object = php_http_client_factory_new; - zend_declare_property_stringl(php_http_request_factory_class_entry, ZEND_STRL("driver"), ZEND_STRL("curl"), ZEND_ACC_PROTECTED TSRMLS_CC); - zend_declare_property_null(php_http_request_factory_class_entry, ZEND_STRL("persistentHandleId"), ZEND_ACC_PROTECTED TSRMLS_CC); - zend_declare_property_null(php_http_request_factory_class_entry, ZEND_STRL("requestClass"), ZEND_ACC_PROTECTED TSRMLS_CC); - zend_declare_property_null(php_http_request_factory_class_entry, ZEND_STRL("requestPoolClass"), ZEND_ACC_PROTECTED TSRMLS_CC); - zend_declare_property_null(php_http_request_factory_class_entry, ZEND_STRL("requestDataShareClass"), ZEND_ACC_PROTECTED TSRMLS_CC); + zend_declare_property_stringl(php_http_client_factory_class_entry, ZEND_STRL("driver"), ZEND_STRL("curl"), ZEND_ACC_PROTECTED TSRMLS_CC); + zend_declare_property_null(php_http_client_factory_class_entry, ZEND_STRL("persistentHandleId"), ZEND_ACC_PROTECTED TSRMLS_CC); + zend_declare_property_null(php_http_client_factory_class_entry, ZEND_STRL("clientClass"), ZEND_ACC_PROTECTED TSRMLS_CC); + zend_declare_property_null(php_http_client_factory_class_entry, ZEND_STRL("clientPoolClass"), ZEND_ACC_PROTECTED TSRMLS_CC); + zend_declare_property_null(php_http_client_factory_class_entry, ZEND_STRL("clientDataShareClass"), ZEND_ACC_PROTECTED TSRMLS_CC); return SUCCESS; } -PHP_MSHUTDOWN_FUNCTION(http_request_factory) +PHP_MSHUTDOWN_FUNCTION(http_client_factory) { - zend_hash_destroy(&php_http_request_factory_drivers); + zend_hash_destroy(&php_http_client_factory_drivers); return SUCCESS; } diff --git a/php_http_client_factory.h b/php_http_client_factory.h new file mode 100644 index 0000000..a31663d --- /dev/null +++ b/php_http_client_factory.h @@ -0,0 +1,55 @@ +/* + +--------------------------------------------------------------------+ + | PECL :: http | + +--------------------------------------------------------------------+ + | Redistribution and use in source and binary forms, with or without | + | modification, are permitted provided that the conditions mentioned | + | in the accompanying LICENSE file are met. | + +--------------------------------------------------------------------+ + | Copyright (c) 2004-2011, Michael Wallner | + +--------------------------------------------------------------------+ +*/ + +#ifndef PHP_HTTP_REQUEST_FACTORY_H +#define PHP_HTTP_REQUEST_FACTORY_H + +#include "php_http_client.h" +#include "php_http_client_pool.h" +#include "php_http_client_datashare.h" + +typedef struct php_http_client_factory_driver { + php_http_client_ops_t *client_ops; + php_http_client_pool_ops_t *client_pool_ops; + php_http_client_datashare_ops_t *client_datashare_ops; +} php_http_client_factory_driver_t; + +PHP_HTTP_API STATUS php_http_client_factory_add_driver(const char *name_str, size_t name_len, php_http_client_factory_driver_t *driver); +PHP_HTTP_API STATUS php_http_client_factory_get_driver(const char *name_str, size_t name_len, php_http_client_factory_driver_t *driver); + +extern zend_class_entry *php_http_client_factory_class_entry; +extern zend_function_entry php_http_client_factory_method_entry[]; + +#define php_http_client_factory_new php_http_object_new + +PHP_METHOD(HttpClientFactory, __construct); +PHP_METHOD(HttpClientFactory, createClient); +PHP_METHOD(HttpClientFactory, createPool); +PHP_METHOD(HttpClientFactory, createDataShare); +PHP_METHOD(HttpClientFactory, getGlobalDataShareInstance); +PHP_METHOD(HttpClientFactory, getDriver); +PHP_METHOD(HttpClientFactory, getAvailableDrivers); + +extern PHP_MINIT_FUNCTION(http_client_factory); +extern PHP_MSHUTDOWN_FUNCTION(http_client_factory); + +#endif /* PHP_HTTP_REQUEST_FACTORY_H */ + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + * vim600: noet sw=4 ts=4 fdm=marker + * vim<600: noet sw=4 ts=4 + */ + diff --git a/php_http_client_pool.h b/php_http_client_pool.h index 50b5856..68ba369 100644 --- a/php_http_client_pool.h +++ b/php_http_client_pool.h @@ -41,6 +41,8 @@ typedef struct php_http_client_pool_ops { php_http_client_pool_attach_func_t attach; php_http_client_pool_detach_func_t detach; php_http_client_pool_setopt_func_t setopt; + php_http_new_t create_object; + zend_class_entry *(*class_entry)(void); } php_http_client_pool_ops_t; typedef struct php_http_client_pool { diff --git a/php_http_client_pool_curl.c b/php_http_client_pool_curl.c index 055079b..b6d39e3 100644 --- a/php_http_client_pool_curl.c +++ b/php_http_client_pool_curl.c @@ -460,18 +460,25 @@ static php_http_resource_factory_ops_t php_http_curlm_resource_factory_ops = { php_http_curlm_dtor }; +static zend_class_entry *get_class_entry(void) +{ + return php_http_client_pool_curl_class_entry; +} + static php_http_client_pool_ops_t php_http_client_pool_curl_ops = { - &php_http_curlm_resource_factory_ops, - php_http_client_pool_curl_init, - NULL /* copy */, - php_http_client_pool_curl_dtor, - NULL /*reset */, - php_http_client_pool_curl_exec, - php_http_client_pool_curl_wait, - php_http_client_pool_curl_once, - php_http_client_pool_curl_attach, - php_http_client_pool_curl_detach, - php_http_client_pool_curl_setopt, + &php_http_curlm_resource_factory_ops, + php_http_client_pool_curl_init, + NULL /* copy */, + php_http_client_pool_curl_dtor, + NULL /*reset */, + php_http_client_pool_curl_exec, + php_http_client_pool_curl_wait, + php_http_client_pool_curl_once, + php_http_client_pool_curl_attach, + php_http_client_pool_curl_detach, + php_http_client_pool_curl_setopt, + (php_http_new_t) php_http_client_pool_curl_object_new_ex, + get_class_entry }; PHP_HTTP_API php_http_client_pool_ops_t *php_http_client_pool_curl_get_ops(void) @@ -482,8 +489,8 @@ PHP_HTTP_API php_http_client_pool_ops_t *php_http_client_pool_curl_get_ops(void) #define PHP_HTTP_BEGIN_ARGS(method, req_args) PHP_HTTP_BEGIN_ARGS_EX(HttpClientCURL, method, 0, req_args) #define PHP_HTTP_EMPTY_ARGS(method) PHP_HTTP_EMPTY_ARGS_EX(HttpClientCURL, method, 0) #define PHP_HTTP_CURL_ME(method, visibility) PHP_ME(HttpClientCURL, method, PHP_HTTP_ARGS(HttpClientCURL, method), visibility) -#define PHP_HTTP_CURL_ALIAS(method, func) PHP_HTTP_STATIC_ME_ALIAS(method, func, PHP_HTTP_ARGS(HttpClientCURL, method)) -#define PHP_HTTP_CURL_MALIAS(me, al, vis) ZEND_FENTRY(me, ZEND_MN(HttpClientCURL_##al), PHP_HTTP_ARGS(HttpClientCURL, al), vis) +#define PHP_HTTP_CURL_ALIAS(method, func) PHP_HTTP_STATIC_ME_ALIAS(method, func, PHP_HTTP_ARGS(HttpClientCURL, method)) +#define PHP_HTTP_CURL_MALIAS(me, al, vis) ZEND_FENTRY(me, ZEND_MN(HttpClientCURL_##al), PHP_HTTP_ARGS(HttpClientCURL, al), vis) zend_class_entry *php_http_client_pool_curl_class_entry; zend_function_entry php_http_client_pool_curl_method_entry[] = { diff --git a/php_http_client_pool_curl.h b/php_http_client_pool_curl.h index e17e161..092b76c 100644 --- a/php_http_client_pool_curl.h +++ b/php_http_client_pool_curl.h @@ -17,6 +17,9 @@ PHP_HTTP_API php_http_client_pool_ops_t *php_http_client_pool_curl_get_ops(void); +extern zend_class_entry *php_http_client_pool_curl_class_entry; +extern zend_function_entry php_http_client_pool_curl_method_entry[]; + extern zend_object_value php_http_client_pool_curl_object_new(zend_class_entry *ce TSRMLS_DC); extern zend_object_value php_http_client_pool_curl_object_new_ex(zend_class_entry *ce, php_http_client_pool_t *p, php_http_client_pool_object_t **ptr TSRMLS_DC); diff --git a/php_http_curl.c b/php_http_curl.c index 569a414..866f2d8 100644 --- a/php_http_curl.c +++ b/php_http_curl.c @@ -90,6 +90,12 @@ static struct gcry_thread_cbs php_http_gnutls_tsl = { PHP_MINIT_FUNCTION(http_curl) { + php_http_client_factory_driver_t driver = { + php_http_client_curl_get_ops(), + php_http_client_pool_curl_get_ops(), + php_http_client_datashare_curl_get_ops() + }; + #ifdef PHP_HTTP_NEED_OPENSSL_TSL /* mod_ssl, libpq or ext/curl might already have set thread lock callbacks */ if (!CRYPTO_get_id_callback()) { @@ -113,6 +119,10 @@ PHP_MINIT_FUNCTION(http_curl) return FAILURE; } + if (SUCCESS != php_http_client_factory_add_driver(ZEND_STRL("curl"), &driver)) { + return FAILURE; + } + return SUCCESS; } diff --git a/php_http_request_factory.h b/php_http_request_factory.h deleted file mode 100644 index fd6a092..0000000 --- a/php_http_request_factory.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - +--------------------------------------------------------------------+ - | PECL :: http | - +--------------------------------------------------------------------+ - | Redistribution and use in source and binary forms, with or without | - | modification, are permitted provided that the conditions mentioned | - | in the accompanying LICENSE file are met. | - +--------------------------------------------------------------------+ - | Copyright (c) 2004-2011, Michael Wallner | - +--------------------------------------------------------------------+ -*/ - -#ifndef PHP_HTTP_REQUEST_FACTORY_H -#define PHP_HTTP_REQUEST_FACTORY_H - -#include "php_http_request.h" -#include "php_http_request_pool.h" -#include "php_http_request_datashare.h" - -typedef struct php_http_request_factory_driver { - php_http_client_ops_t *request_ops; - php_http_request_pool_ops_t *request_pool_ops; - php_http_request_datashare_ops_t *request_datashare_ops; -} php_http_request_factory_driver_t; - -PHP_HTTP_API STATUS php_http_request_factory_add_driver(const char *name_str, size_t name_len, php_http_request_factory_driver_t *driver); -PHP_HTTP_API STATUS php_http_request_factory_get_driver(const char *name_str, size_t name_len, php_http_request_factory_driver_t *driver); - -extern zend_class_entry *php_http_request_factory_class_entry; -extern zend_function_entry php_http_request_factory_method_entry[]; - -#define php_http_request_factory_new php_http_object_new - -PHP_METHOD(HttpRequestFactory, __construct); -PHP_METHOD(HttpRequestFactory, createRequest); -PHP_METHOD(HttpRequestFactory, createPool); -PHP_METHOD(HttpRequestFactory, createDataShare); -PHP_METHOD(HttpRequestFactory, getGlobalDataShareInstance); -PHP_METHOD(HttpRequestFactory, getDriver); -PHP_METHOD(HttpRequestFactory, getAvailableDrivers); - -extern PHP_MINIT_FUNCTION(http_request_factory); -extern PHP_MSHUTDOWN_FUNCTION(http_request_factory); - -#endif /* PHP_HTTP_REQUEST_FACTORY_H */ - -/* - * Local variables: - * tab-width: 4 - * c-basic-offset: 4 - * End: - * vim600: noet sw=4 ts=4 fdm=marker - * vim<600: noet sw=4 ts=4 - */ - -- 2.30.2