X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-http;a=blobdiff_plain;f=http.c;h=4f375f709ff38db43dbc33e06d69edb820fe6430;hp=1fddaa4b23b0a74cc95bca932c7c58c92be277c1;hb=007a8514b1fd679453526f96dc8a908a8e6354e8;hpb=a856e9055f2de647fdb3c7ff89238f6b17a1217e diff --git a/http.c b/http.c index 1fddaa4..4f375f7 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) @@ -757,15 +755,11 @@ static inline void _httpi_request_declare_default_properties(zend_class_entry *c DCL_PROP(PROTECTED, string, postData, ""); } -#define httpi_request_destroy_object _httpi_request_destroy_object -void _httpi_request_destroy_object(void *object, zend_object_handle handle TSRMLS_DC) +#define httpi_request_free_object _httpi_request_free_object +void _httpi_request_free_object(zend_object /* void */ *object TSRMLS_DC) { - httpi_request_object *o = object; - - FREE_PARR(o->options); - FREE_PARR(o->responseInfo); - FREE_PARR(o->responseData); - + httpi_request_object *o = (httpi_request_object *) object; + if (OBJ_PROP(o)) { zend_hash_destroy(OBJ_PROP(o)); FREE_HASHTABLE(OBJ_PROP(o)); @@ -791,7 +785,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, (zend_objects_store_dtor_t) zend_objects_destroy_object, httpi_request_free_object, NULL TSRMLS_CC); ov.handlers = &httpi_request_object_handlers; return ov; @@ -852,7 +846,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 +856,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); - - resp = GET_PROP(obj, responseData); - zval_dtor(resp); - FREE_ZVAL(resp); + + NO_ARGS; + + FREE_PARR(obj, options); + FREE_PARR(obj, responseInfo); + FREE_PARR(obj, responseData); } +/* }}} */ /* {{{ proto bool HTTPi_Request::setOptions(array options) * @@ -893,13 +878,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 +905,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 +920,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 +1196,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 +1234,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 +1262,7 @@ PHP_METHOD(HTTPi_Request, send) } efree(request_uri); - + /* final data handling */ if (status != SUCCESS) { RETURN_FALSE; @@ -1298,7 +1283,7 @@ PHP_METHOD(HTTPi_Request, send) add_assoc_zval(resp, "headers", zheaders); add_assoc_zval(resp, "body", zbody); - + efree(response_data); RETURN_TRUE; @@ -2281,7 +2266,7 @@ PHP_MINIT_FUNCTION(http) ZEND_INIT_MODULE_GLOBALS(http, php_http_init_globals, NULL); REGISTER_INI_ENTRIES(); -#ifdef HTTP_HAVE_CURL +#if defined(HTTP_HAVE_CURL) && (LIBCURL_VERSION_NUM >= 0x070a05) REGISTER_LONG_CONSTANT("HTTP_AUTH_BASIC", CURLAUTH_BASIC, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("HTTP_AUTH_DIGEST", CURLAUTH_DIGEST, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("HTTP_AUTH_NTLM", CURLAUTH_NTLM, CONST_CS | CONST_PERSISTENT);