X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-http;a=blobdiff_plain;f=src%2Fphp_http_message.c;h=d70ced4993c5a16cd199e189f3a49e62c80a4166;hp=feef2655f565357a9dbb74543da43cdb135755df;hb=d5d03014cff8c8ca80ee7866af100d3ceae1bd8f;hpb=b2cddc09fda9358c7c2bdfaf487196cb3ff34749 diff --git a/src/php_http_message.c b/src/php_http_message.c index feef265..d70ced4 100644 --- a/src/php_http_message.c +++ b/src/php_http_message.c @@ -75,7 +75,7 @@ php_http_message_t *php_http_message_init_env(php_http_message_t *message, php_h break; case PHP_HTTP_RESPONSE: - message = php_http_message_init(NULL, type, NULL); + message = php_http_message_init(message, type, NULL); if (!SG(sapi_headers).http_status_line || !php_http_info_parse((php_http_info_t *) &message->http, SG(sapi_headers).http_status_line)) { if (!(message->http.info.response.code = SG(sapi_headers).http_response_code)) { message->http.info.response.code = 200; @@ -177,24 +177,24 @@ zend_bool php_http_message_is_multipart(php_http_message_t *msg, char **boundary popts.input.str = ct->val; popts.input.len = ct->len; - if (php_http_params_parse(¶ms, &popts)) { + if (EXPECTED(php_http_params_parse(¶ms, &popts))) { zval *cur, *arg; zend_string *ct_str; zend_ulong index; zend_hash_internal_pointer_reset(¶ms); - if ((cur = zend_hash_get_current_data(¶ms)) + if (EXPECTED((cur = zend_hash_get_current_data(¶ms)) && (Z_TYPE_P(cur) == IS_ARRAY) - && (HASH_KEY_IS_STRING == zend_hash_get_current_key(¶ms, &ct_str, &index)) + && (HASH_KEY_IS_STRING == zend_hash_get_current_key(¶ms, &ct_str, &index))) ) { if (php_http_match(ct_str->val, "multipart", PHP_HTTP_MATCH_WORD)) { is_multipart = 1; /* get boundary */ - if (boundary + if (EXPECTED(boundary && (arg = zend_hash_str_find(Z_ARRVAL_P(cur), ZEND_STRL("arguments"))) - && Z_TYPE_P(arg) == IS_ARRAY + && Z_TYPE_P(arg) == IS_ARRAY) ) { zval *val; php_http_arrkey_t key; @@ -204,7 +204,7 @@ zend_bool php_http_message_is_multipart(php_http_message_t *msg, char **boundary if (key.key && key.key->len == lenof("boundary") && !strcasecmp(key.key->val, "boundary")) { zend_string *bnd = zval_get_string(val); - if (bnd->len) { + if (EXPECTED(bnd->len)) { *boundary = estrndup(bnd->val, bnd->len); } zend_string_release(bnd); @@ -471,7 +471,7 @@ php_http_message_t *php_http_message_copy_ex(php_http_message_t *from, php_http_ void php_http_message_dtor(php_http_message_t *message) { - if (message) { + if (EXPECTED(message)) { zend_hash_destroy(&message->hdrs); php_http_message_body_free(&message->body); @@ -493,7 +493,7 @@ void php_http_message_dtor(php_http_message_t *message) void php_http_message_free(php_http_message_t **message) { - if (*message) { + if (EXPECTED(*message)) { if ((*message)->parent) { php_http_message_free(&(*message)->parent); } @@ -538,12 +538,14 @@ static php_http_message_object_prophandler_t *php_http_message_object_get_propha return zend_hash_str_find_ptr(&php_http_message_object_prophandlers, name_str->val, name_str->len); } static void php_http_message_object_prophandler_get_type(php_http_message_object_t *obj, zval *return_value) { + zval_ptr_dtor(return_value); RETVAL_LONG(obj->message->type); } static void php_http_message_object_prophandler_set_type(php_http_message_object_t *obj, zval *value) { php_http_message_set_type(obj->message, zval_get_long(value)); } static void php_http_message_object_prophandler_get_request_method(php_http_message_object_t *obj, zval *return_value) { + zval_ptr_dtor(return_value); if (PHP_HTTP_MESSAGE_TYPE(REQUEST, obj->message) && obj->message->http.info.request.method) { RETVAL_STRING(obj->message->http.info.request.method); } else { @@ -561,6 +563,7 @@ static void php_http_message_object_prophandler_get_request_url(php_http_message char *url_str; size_t url_len; + zval_ptr_dtor(return_value); if (PHP_HTTP_MESSAGE_TYPE(REQUEST, obj->message) && obj->message->http.info.request.url && php_http_url_to_string(obj->message->http.info.request.url, &url_str, &url_len, 0)) { RETVAL_STR(php_http_cs2zs(url_str, url_len)); } else { @@ -573,6 +576,7 @@ static void php_http_message_object_prophandler_set_request_url(php_http_message } } static void php_http_message_object_prophandler_get_response_status(php_http_message_object_t *obj, zval *return_value) { + zval_ptr_dtor(return_value); if (PHP_HTTP_MESSAGE_TYPE(RESPONSE, obj->message) && obj->message->http.info.response.status) { RETVAL_STRING(obj->message->http.info.response.status); } else { @@ -587,6 +591,7 @@ static void php_http_message_object_prophandler_set_response_status(php_http_mes } } static void php_http_message_object_prophandler_get_response_code(php_http_message_object_t *obj, zval *return_value) { + zval_ptr_dtor(return_value); if (PHP_HTTP_MESSAGE_TYPE(RESPONSE, obj->message)) { RETVAL_LONG(obj->message->http.info.response.code); } else { @@ -603,6 +608,7 @@ static void php_http_message_object_prophandler_get_http_version(php_http_messag char *version_str; size_t version_len; + zval_ptr_dtor(return_value); php_http_version_to_string(&obj->message->http.version, &version_str, &version_len, NULL, NULL); RETVAL_STR(php_http_cs2zs(version_str, version_len)); } @@ -612,28 +618,41 @@ static void php_http_message_object_prophandler_set_http_version(php_http_messag zend_string_release(zs); } static void php_http_message_object_prophandler_get_headers(php_http_message_object_t *obj, zval *return_value ) { + zval tmp; + + ZVAL_COPY_VALUE(&tmp, return_value); array_init(return_value); array_copy(&obj->message->hdrs, Z_ARRVAL_P(return_value)); + zval_ptr_dtor(&tmp); } static void php_http_message_object_prophandler_set_headers(php_http_message_object_t *obj, zval *value) { - HashTable *headers; - zval *orig_value = value; + int converted = 0; + HashTable garbage, *src; if (Z_TYPE_P(value) != IS_ARRAY && Z_TYPE_P(value) != IS_OBJECT) { - convert_to_array_ex(value); + converted = 1; + SEPARATE_ZVAL(value); + convert_to_array(value); } - headers = HASH_OF(value); + src = HASH_OF(value); - zend_hash_clean(&obj->message->hdrs); - array_copy(headers, &obj->message->hdrs); + garbage = obj->message->hdrs; + zend_hash_init(&obj->message->hdrs, zend_hash_num_elements(src), NULL, ZVAL_PTR_DTOR, 0); + array_copy(HASH_OF(value), &obj->message->hdrs); - if (orig_value != value) { + zend_hash_destroy(&garbage); + + if (converted) { zval_ptr_dtor(value); } } static void php_http_message_object_prophandler_get_body(php_http_message_object_t *obj, zval *return_value) { if (obj->body) { + zval tmp; + + ZVAL_COPY_VALUE(&tmp, return_value); RETVAL_OBJECT(&obj->body->zo, 1); + zval_ptr_dtor(&tmp); } else { RETVAL_NULL(); } @@ -643,7 +662,11 @@ static void php_http_message_object_prophandler_set_body(php_http_message_object } static void php_http_message_object_prophandler_get_parent_message(php_http_message_object_t *obj, zval *return_value) { if (obj->message->parent) { + zval tmp; + + ZVAL_COPY_VALUE(&tmp, return_value); RETVAL_OBJECT(&obj->parent->zo, 1); + zval_ptr_dtor(&tmp); } else { RETVAL_NULL(); } @@ -652,10 +675,10 @@ static void php_http_message_object_prophandler_set_parent_message(php_http_mess if (Z_TYPE_P(value) == IS_OBJECT && instanceof_function(Z_OBJCE_P(value), php_http_message_class_entry)) { php_http_message_object_t *parent_obj = PHP_HTTP_OBJ(NULL, value); + Z_ADDREF_P(value); if (obj->message->parent) { zend_object_release(&obj->parent->zo); } - Z_ADDREF_P(value); obj->parent = parent_obj; obj->message->parent = parent_obj->message; } @@ -835,7 +858,7 @@ php_http_message_object_t *php_http_message_object_new_ex(zend_class_entry *ce, zend_object *php_http_message_object_clone(zval *this_ptr) { - php_http_message_object_t *new_obj = NULL; + php_http_message_object_t *new_obj; php_http_message_object_t *old_obj = PHP_HTTP_OBJ(NULL, this_ptr); new_obj = php_http_message_object_new_ex(old_obj->zo.ce, php_http_message_copy(old_obj->message, NULL)); @@ -877,31 +900,27 @@ static zval *php_http_message_object_read_prop(zval *object, zval *member, int t zend_string *member_name = zval_get_string(member); php_http_message_object_prophandler_t *handler = php_http_message_object_get_prophandler(member_name); - if (!handler || type == BP_VAR_R || type == BP_VAR_IS) { - return_value = zend_get_std_object_handlers()->read_property(object, member, type, cache_slot, tmp); + return_value = zend_get_std_object_handlers()->read_property(object, member, type, cache_slot, tmp); - if (handler) { + if (handler && handler->read) { + if (type == BP_VAR_R || type == BP_VAR_IS) { php_http_message_object_t *obj = PHP_HTTP_OBJ(NULL, object); - PHP_HTTP_MESSAGE_OBJECT_INIT(obj); - handler->read(obj, tmp); - - zval_ptr_dtor(return_value); - ZVAL_COPY_VALUE(return_value, tmp); - } - zend_string_release(member_name); - return return_value; - } else { - php_property_proxy_t *proxy; - php_property_proxy_object_t *proxy_obj; + handler->read(obj, return_value); + } else { + php_property_proxy_t *proxy; + php_property_proxy_object_t *proxy_obj; - proxy = php_property_proxy_init(object, member_name); - proxy_obj = php_property_proxy_object_new_ex(NULL, proxy); + proxy = php_property_proxy_init(object, member_name); + proxy_obj = php_property_proxy_object_new_ex(NULL, proxy); - ZVAL_OBJ(tmp, &proxy_obj->zo); - zend_string_release(member_name); - return tmp; + ZVAL_OBJ(tmp, &proxy_obj->zo); + return_value = tmp; + } } + + zend_string_release(member_name); + return return_value; } static void php_http_message_object_write_prop(zval *object, zval *member, zval *value, void **cache_slot) @@ -1102,7 +1121,6 @@ static PHP_METHOD(HttpMessage, getBody) if (!obj->body) { php_http_message_object_init_body_object(obj); - } if (obj->body) { RETVAL_OBJECT(&obj->body->zo, 1); @@ -1975,7 +1993,7 @@ static PHP_METHOD(HttpMessage, current) } static zend_function_entry php_http_message_methods[] = { - PHP_ME(HttpMessage, __construct, ai_HttpMessage___construct, ZEND_ACC_PUBLIC|ZEND_ACC_CTOR) + PHP_ME(HttpMessage, __construct, ai_HttpMessage___construct, ZEND_ACC_PUBLIC) PHP_ME(HttpMessage, getBody, ai_HttpMessage_getBody, ZEND_ACC_PUBLIC) PHP_ME(HttpMessage, setBody, ai_HttpMessage_setBody, ZEND_ACC_PUBLIC) PHP_ME(HttpMessage, addBody, ai_HttpMessage_addBody, ZEND_ACC_PUBLIC)