X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-http;a=blobdiff_plain;f=http_message_object.c;h=5624e2172a744be2b9dd40819d1d15705d707902;hp=1a5980e18b92c690576032474b0d92debe397d7e;hb=82e8bfff78f52b0989fb865131461fe61156f507;hpb=c8dff7011092296f9fcc12e68ad8eef18b19cdf4 diff --git a/http_message_object.c b/http_message_object.c index 1a5980e..5624e21 100644 --- a/http_message_object.c +++ b/http_message_object.c @@ -350,7 +350,8 @@ zend_object_value _http_message_object_new_ex(zend_class_entry *ce, http_message } ALLOC_HASHTABLE(OBJ_PROP(o)); - zend_hash_init(OBJ_PROP(o), 0, NULL, ZVAL_PTR_DTOR, 0); + zend_hash_init(OBJ_PROP(o), zend_hash_num_elements(&ce->default_properties), 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 = putObject(http_message_object, o); ov.handlers = &http_message_object_handlers; @@ -360,8 +361,14 @@ zend_object_value _http_message_object_new_ex(zend_class_entry *ce, http_message zend_object_value _http_message_object_clone_obj(zval *this_ptr TSRMLS_DC) { - getObject(http_message_object, obj); - return http_message_object_new_ex(Z_OBJCE_P(this_ptr), http_message_dup(obj->message), NULL); + zend_object_value new_ov; + http_message_object *new_obj = NULL; + getObject(http_message_object, old_obj); + + new_ov = http_message_object_new_ex(old_obj->zo.ce, http_message_dup(old_obj->message), &new_obj); + zend_objects_clone_members(&new_obj->zo, new_ov, &old_obj->zo, Z_OBJ_HANDLE_P(this_ptr) TSRMLS_CC); + + return new_ov; } void _http_message_object_free(zend_object *object TSRMLS_DC) @@ -630,13 +637,13 @@ static HashTable *_http_message_object_get_props(zval *object TSRMLS_DC) case HTTP_MSG_REQUEST: ASSOC_PROP(array, long, "responseCode", 0); ASSOC_STRINGL(array, "responseStatus", "", 0); - ASSOC_STRING(array, "requestMethod", msg->http.info.request.method); - ASSOC_STRING(array, "requestUrl", msg->http.info.request.url); + ASSOC_STRING(array, "requestMethod", STR_PTR(msg->http.info.request.method)); + ASSOC_STRING(array, "requestUrl", STR_PTR(msg->http.info.request.url)); break; case HTTP_MSG_RESPONSE: ASSOC_PROP(array, long, "responseCode", msg->http.info.response.code); - ASSOC_STRING(array, "responseStatus", msg->http.info.response.status); + ASSOC_STRING(array, "responseStatus", STR_PTR(msg->http.info.response.status)); ASSOC_STRINGL(array, "requestMethod", "", 0); ASSOC_STRINGL(array, "requestUrl", "", 0); break; @@ -802,8 +809,8 @@ PHP_METHOD(HttpMessage, getHeader) } nice_header = pretty_key(estrndup(orig_header, header_len), header_len, 1, 1); - if ((header = http_message_header_ex(obj->message, nice_header, header_len + 1))) { - RETVAL_ZVAL(header, 1, 0); + if ((header = http_message_header_ex(obj->message, nice_header, header_len + 1, 0))) { + RETVAL_ZVAL(header, 1, 1); } efree(nice_header); } @@ -839,16 +846,18 @@ PHP_METHOD(HttpMessage, getHeaders) */ PHP_METHOD(HttpMessage, setHeaders) { - zval *new_headers, old_headers; + zval *new_headers = NULL, old_headers; getObject(http_message_object, obj); - if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "a/", &new_headers)) { + if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "a/!", &new_headers)) { return; } zend_hash_clean(&obj->message->hdrs); - INIT_ZARR(old_headers, &obj->message->hdrs); - array_copy(new_headers, &old_headers); + if (new_headers) { + INIT_ZARR(old_headers, &obj->message->hdrs); + array_copy(new_headers, &old_headers); + } } /* }}} */ @@ -1297,6 +1306,7 @@ PHP_METHOD(HttpMessage, toMessageTypeObject) memset(&hurl, 0, sizeof(php_url)); hurl.host = host ? Z_STRVAL_P(host) : NULL; + zval_ptr_dtor(&host); http_build_url(HTTP_URL_REPLACE, purl, &hurl, NULL, &url, NULL); php_url_free(purl); add_assoc_string(array, "url", url, 0);