X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-http;a=blobdiff_plain;f=http.c;h=e174ba11f241aa21e7efe0d2dd24a6173b1dad89;hp=1fddaa4b23b0a74cc95bca932c7c58c92be277c1;hb=2414448a15f7a9959dc41749dd938b6770843f0c;hpb=a856e9055f2de647fdb3c7ff89238f6b17a1217e diff --git a/http.c b/http.c index 1fddaa4..e174ba1 100644 --- a/http.c +++ b/http.c @@ -161,14 +161,16 @@ function_entry http_functions[] = { MAKE_STD_ZVAL(__tmp); \ array_init(__tmp); \ SET_PROP(o, n, __tmp); \ - o->n = __tmp; \ } -# define FREE_PARR(p) \ - if (p) { \ - zval_dtor(p); \ - FREE_ZVAL(p); \ - (p) = NULL; \ +# define FREE_PARR(o, p) \ + { \ + zval *__tmp = NULL; \ + if (__tmp = GET_PROP(o, p)) { \ + zval_dtor(__tmp); \ + FREE_ZVAL(__tmp); \ + __tmp = NULL; \ + } \ } /* {{{ HTTPi */ @@ -736,10 +738,6 @@ static zend_object_handlers httpi_request_object_handlers; typedef struct { zend_object zo; CURL *ch; - - zval *options; - zval *responseInfo; - zval *responseData; } httpi_request_object; #define httpi_request_declare_default_properties(ce) _httpi_request_declare_default_properties(ce TSRMLS_CC) @@ -760,11 +758,13 @@ static inline void _httpi_request_declare_default_properties(zend_class_entry *c #define httpi_request_destroy_object _httpi_request_destroy_object void _httpi_request_destroy_object(void *object, zend_object_handle handle TSRMLS_DC) { - httpi_request_object *o = object; - - FREE_PARR(o->options); - FREE_PARR(o->responseInfo); - FREE_PARR(o->responseData); + zend_objects_destroy_object(object, handle TSRMLS_CC); +} + +#define httpi_request_free_object _httpi_request_free_object +void _httpi_request_free_object(zend_object /* void */ *object TSRMLS_DC) +{ + httpi_request_object *o = (httpi_request_object *) object; if (OBJ_PROP(o)) { zend_hash_destroy(OBJ_PROP(o)); @@ -791,7 +791,7 @@ zend_object_value _httpi_request_new_object(zend_class_entry *ce TSRMLS_DC) zend_hash_init(OBJ_PROP(o), 0, NULL, ZVAL_PTR_DTOR, 0); zend_hash_copy(OBJ_PROP(o), &ce->default_properties, (copy_ctor_func_t) zval_add_ref, NULL, sizeof(zval *)); - ov.handle = zend_objects_store_put(o, httpi_request_destroy_object, NULL, NULL TSRMLS_CC); + ov.handle = zend_objects_store_put(o, httpi_request_destroy_object, httpi_request_free_object, NULL TSRMLS_CC); ov.handlers = &httpi_request_object_handlers; return ov; @@ -852,7 +852,7 @@ PHP_METHOD(HTTPi_Request, __construct) INIT_PARR(obj, options); INIT_PARR(obj, responseInfo); INIT_PARR(obj, responseData); - + if (URL) { UPD_PROP(obj, string, url, URL); } @@ -862,29 +862,20 @@ PHP_METHOD(HTTPi_Request, __construct) } /* }}} */ +/* {{{ proto void HTTPi_Request::__destruct() + * + */ PHP_METHOD(HTTPi_Request, __destruct) { - zval *opts, *info, *resp; getObject(httpi_request_object, obj); - /* - * this never happens ??? - */ - - fprintf(stderr, "\n\n\nYAY, DESTRCUTOR CALLED!\n\n\n"); - - opts = GET_PROP(obj, options); - zval_dtor(opts); - FREE_ZVAL(opts); - - info = GET_PROP(obj, reeponseInfo); - zval_dtor(info); - FREE_ZVAL(info); + NO_ARGS; - resp = GET_PROP(obj, responseData); - zval_dtor(resp); - FREE_ZVAL(resp); + FREE_PARR(obj, options); + FREE_PARR(obj, responseInfo); + FREE_PARR(obj, responseData); } +/* }}} */ /* {{{ proto bool HTTPi_Request::setOptions(array options) * @@ -893,13 +884,13 @@ PHP_METHOD(HTTPi_Request, setOptions) { zval *opts, *old_opts, **opt; getObject(httpi_request_object, obj); - + if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "a/", &opts)) { RETURN_FALSE; } - + old_opts = GET_PROP(obj, options); - + /* headers and cookies need extra attention -- thus cannot use zend_hash_merge() or php_array_merge() directly */ for ( zend_hash_internal_pointer_reset(Z_ARRVAL_P(opts)); zend_hash_get_current_data(Z_ARRVAL_P(opts), (void **) &opt) == SUCCESS; @@ -920,8 +911,8 @@ PHP_METHOD(HTTPi_Request, setOptions) continue; } } - zval_add_ref(opt); - add_assoc_zval(old_opts, key, *opt); + zval_add_ref(opt); + add_assoc_zval(old_opts, key, *opt); } } RETURN_TRUE; @@ -935,9 +926,9 @@ PHP_METHOD(HTTPi_Request, getOptions) { zval *opts; getObject(httpi_request_object, obj); - + NO_ARGS; - + opts = GET_PROP(obj, options); array_init(return_value); array_copy(opts, return_value); @@ -1211,9 +1202,9 @@ PHP_METHOD(HTTPi_Request, getResponseInfo) { zval *info; getObject(httpi_request_object, obj); - + NO_ARGS; - + info = GET_PROP(obj, responseInfo); array_init(return_value); array_copy(info, return_value); @@ -1249,7 +1240,7 @@ PHP_METHOD(HTTPi_Request, send) request_uri = ecalloc(HTTP_URI_MAXLEN + 1, 1); strcpy(request_uri, uri); efree(uri); - + if (Z_STRLEN_P(qdata) && (strlen(request_uri) < HTTP_URI_MAXLEN)) { if (!strchr(request_uri, '?')) { strcat(request_uri, "?"); @@ -1277,7 +1268,7 @@ PHP_METHOD(HTTPi_Request, send) } efree(request_uri); - + /* final data handling */ if (status != SUCCESS) { RETURN_FALSE; @@ -1298,7 +1289,7 @@ PHP_METHOD(HTTPi_Request, send) add_assoc_zval(resp, "headers", zheaders); add_assoc_zval(resp, "body", zbody); - + efree(response_data); RETURN_TRUE;