-
-#include "php_http.h"
-
-#include <ext/standard/php_string.h>
-#include <ext/spl/spl_iterators.h>
+/*
+ +--------------------------------------------------------------------+
+ | 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 <mike@php.net> |
+ +--------------------------------------------------------------------+
+*/
+
+#include "php_http_api.h"
+
+#include <curl/curl.h>
static int php_http_request_datashare_compare_handles(void *h1, void *h2);
-#ifdef ZTS
-static void *php_http_request_datashare_locks_init(void);
-static void php_http_request_datashare_locks_dtor(void *l);
-static void php_http_request_datashare_lock_func(CURL *handle, curl_lock_data data, curl_lock_access locktype, void *userptr);
-static void php_http_request_datashare_unlock_func(CURL *handle, curl_lock_data data, void *userptr);
-static MUTEX_T php_http_request_datashare_global_shares_lock;
-#endif
-static HashTable php_http_request_datashare_global_shares;
-php_http_request_datashare_t *php_http_request_datashare_global_get(const char *driver_str, size_t driver_len TSRMLS_DC)
+PHP_HTTP_API php_http_request_datashare_t *php_http_request_datashare_init(php_http_request_datashare_t *h, php_http_request_datashare_ops_t *ops, php_http_resource_factory_t *rf, void *init_arg TSRMLS_DC)
{
- php_http_request_datashare_t *s = NULL, **s_ptr;
- char *lower_str = php_strtolower(estrndup(driver_str, driver_len), driver_len);
-
-#ifdef ZTS
- tsrm_mutex_lock(php_http_request_datashare_global_shares_lock);
-#endif
- if (zend_hash_find(&php_http_request_datashare_global_shares, lower_str, driver_len + 1, (void *) &s_ptr)) {
- s = *s_ptr;
- } else {
- php_http_request_factory_driver_t driver;
-
- if ((SUCCESS == php_http_request_factory_get_driver(driver_str, driver_len, &driver)) && driver.request_datashare_ops) {
- s = php_http_request_datashare_init(NULL, driver.request_datashare_ops, NULL, 1 TSRMLS_CC);
- zend_hash_add(&php_http_request_datashare_global_shares, lower_str, driver_len + 1, &s, sizeof(php_http_request_datashare_t *), NULL);
- }
- }
-#ifdef ZTS
- tsrm_mutex_unlock(php_http_request_datashare_global_shares_lock);
-#endif
-
- efree(lower_str);
- return s;
-}
-
-PHP_HTTP_API php_http_request_datashare_t *php_http_request_datashare_init(php_http_request_datashare_t *h, php_http_request_datashare_ops_t *ops, void *init_arg, zend_bool persistent TSRMLS_DC)
-{
- php_http_request_datashare_t *free_h;
+ php_http_request_datashare_t *free_h = NULL;
if (!h) {
- free_h = h = pemalloc(sizeof(*h), persistent);
+ free_h = h = emalloc(sizeof(*h));
}
memset(h, sizeof(*h), 0);
- if (!(h->persistent = persistent)) {
- h->requests = emalloc(sizeof(*h->requests));
- zend_llist_init(h->requests, sizeof(zval *), ZVAL_PTR_DTOR, 0);
- TSRMLS_SET_CTX(h->ts);
- }
+ zend_llist_init(&h->requests, sizeof(zval *), ZVAL_PTR_DTOR, 0);
h->ops = ops;
+ h->rf = rf ? rf : php_http_resource_factory_init(NULL, h->ops->rsrc, NULL, NULL);
+ TSRMLS_SET_CTX(h->ts);
if (h->ops->init) {
if (!(h = h->ops->init(h, init_arg))) {
if (free_h) {
- pefree(free_h, persistent);
+ efree(free_h);
}
}
}
if (h->ops->dtor) {
h->ops->dtor(h);
}
- if (h->requests) {
- zend_llist_destroy(h->requests);
- pefree(h->requests, h->persistent);
- h->requests = NULL;
- }
+ zend_llist_destroy(&h->requests);
+ php_http_resource_factory_free(&h->rf);
}
PHP_HTTP_API void php_http_request_datashare_free(php_http_request_datashare_t **h)
{
php_http_request_datashare_dtor(*h);
- pefree(*h, (*h)->persistent);
+ efree(*h);
*h = NULL;
}
if (SUCCESS == h->ops->attach(h, obj->request)) {
Z_ADDREF_P(request);
- zend_llist_add_element(PHP_HTTP_REQUEST_DATASHARE_REQUESTS(h), &request);
+ zend_llist_add_element(&h->requests, &request);
return SUCCESS;
}
}
php_http_request_object_t *obj = zend_object_store_get_object(request TSRMLS_CC);
if (SUCCESS == h->ops->detach(h, obj->request)) {
- zend_llist_del_element(PHP_HTTP_REQUEST_DATASHARE_REQUESTS(h), request, php_http_request_datashare_compare_handles);
+ zend_llist_del_element(&h->requests, request, php_http_request_datashare_compare_handles);
return SUCCESS;
}
}
PHP_HTTP_API void php_http_request_datashare_reset(php_http_request_datashare_t *h)
{
+ TSRMLS_FETCH_FROM_CTX(h->ts);
+
if (h->ops->reset) {
h->ops->reset(h);
} else if (h->ops->detach) {
- TSRMLS_FETCH_FROM_CTX(h->ts);
-
- zend_llist_apply_with_argument(PHP_HTTP_REQUEST_DATASHARE_REQUESTS(h), detach, h TSRMLS_CC);
+ zend_llist_apply_with_argument(&h->requests, detach, h TSRMLS_CC);
}
- zend_llist_clean(PHP_HTTP_REQUEST_DATASHARE_REQUESTS(h));
-}
-
-static void php_http_request_datashare_global_requests_dtor(void *el)
-{
- //php_http_request_datashare_detach(php_http_request_datashare_global_get(), *((zval **) el));
- zval_ptr_dtor(el);
+ zend_llist_clean(&h->requests);
}
#define PHP_HTTP_BEGIN_ARGS(method, req_args) PHP_HTTP_BEGIN_ARGS_EX(HttpRequestDataShare, method, 0, req_args)
if (share) {
o->share = share;
} else {
- o->share = php_http_request_datashare_init(NULL, NULL, NULL, 0 TSRMLS_CC);
+ o->share = php_http_request_datashare_init(NULL, NULL, NULL, NULL TSRMLS_CC);
}
if (ptr) {
{
php_http_request_datashare_object_t *o = (php_http_request_datashare_object_t *) object;
- if (!o->share->persistent) {
- php_http_request_datashare_free(&o->share);
- }
- zend_object_std_dtor((zend_object *) o);
+ php_http_request_datashare_free(&o->share);
+ zend_object_std_dtor((zend_object *) o TSRMLS_CC);
efree(o);
}
zend_property_info *pi;
if ((pi = zend_get_property_info(php_http_request_datashare_class_entry, member, 1 TSRMLS_CC))) {
- return &php_http_property_proxy_init(NULL, object, member TSRMLS_CC)->myself;
+ return &php_http_property_proxy_init(NULL, object, member, NULL TSRMLS_CC)->myself;
}
return zend_get_std_object_handlers()->get_property_ptr_ptr(object, member, literal_key TSRMLS_CC);
PHP_METHOD(HttpRequestDataShare, __construct)
{
- with_error_handling(EH_THROW, PHP_HTTP_EX_CE(runtime)) {
+ with_error_handling(EH_THROW, php_http_exception_class_entry) {
zend_parse_parameters_none();
} end_error_handling();
}
if (SUCCESS == zend_parse_parameters_none()) {
php_http_request_datashare_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
- RETURN_LONG(zend_llist_count(PHP_HTTP_REQUEST_DATASHARE_REQUESTS(obj->share)));
+ RETURN_LONG(zend_llist_count(&obj->share->requests));
}
RETURN_FALSE;
}
PHP_MINIT_FUNCTION(http_request_datashare)
{
- PHP_HTTP_REGISTER_CLASS(http\\request, DataShare, http_request_datashare, php_http_object_class_entry, 0);
+ PHP_HTTP_REGISTER_CLASS(http\\Request, DataShare, http_request_datashare, php_http_object_class_entry, 0);
php_http_request_datashare_class_entry->create_object = php_http_request_datashare_object_new;
memcpy(&php_http_request_datashare_object_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers));
php_http_request_datashare_object_handlers.clone_obj = NULL;
zend_class_implements(php_http_request_datashare_class_entry TSRMLS_CC, 1, spl_ce_Countable);
- zend_declare_property_null(php_http_request_datashare_class_entry, ZEND_STRL("instance"), (ZEND_ACC_STATIC|ZEND_ACC_PRIVATE) TSRMLS_CC);
zend_declare_property_bool(php_http_request_datashare_class_entry, ZEND_STRL("cookie"), 0, ZEND_ACC_PUBLIC TSRMLS_CC);
zend_declare_property_bool(php_http_request_datashare_class_entry, ZEND_STRL("dns"), 0, ZEND_ACC_PUBLIC TSRMLS_CC);
-#ifdef ZTS
- php_http_request_datashare_global_shares_lock = tsrm_mutex_alloc();
-#endif
- zend_hash_init(&php_http_request_datashare_global_shares, 0, NULL, (dtor_func_t) php_http_request_datashare_free, 1);
-
return SUCCESS;
}
-PHP_MSHUTDOWN_FUNCTION(http_request_datashare)
-{
- zend_hash_destroy(&php_http_request_datashare_global_shares);
-#ifdef ZTS
- tsrm_mutex_free(php_http_request_datashare_global_shares_lock);
-#endif
-
- return SUCCESS;
-}
-
-PHP_RINIT_FUNCTION(http_request_datashare)
-{
- zend_llist_init(&PHP_HTTP_G->request_datashare.requests, sizeof(zval *), php_http_request_datashare_global_requests_dtor, 0);
-
- return SUCCESS;
-}
-
-PHP_RSHUTDOWN_FUNCTION(http_request_datashare)
-{
- zend_llist_destroy(&PHP_HTTP_G->request_datashare.requests);
-
- return SUCCESS;
-}
+/*
+ * 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
+ */