}
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;
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)
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;
}
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);
}
NO_ARGS;
if (return_value_used) {
- zval headers;
getObject(http_message_object, obj);
- INIT_ZARR(headers, &obj->message->hdrs);
array_init(return_value);
- array_copy(&headers, return_value);
+ array_copy(&obj->message->hdrs, Z_ARRVAL_P(return_value));
}
}
/* }}} */
*/
PHP_METHOD(HttpMessage, setHeaders)
{
- zval *new_headers, old_headers;
+ zval *new_headers = NULL;
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) {
+ array_copy(Z_ARRVAL_P(new_headers), &obj->message->hdrs);
+ }
}
/* }}} */
*/
PHP_METHOD(HttpMessage, addHeaders)
{
- zval old_headers, *new_headers;
+ zval *new_headers;
zend_bool append = 0;
getObject(http_message_object, obj);
return;
}
- INIT_ZARR(old_headers, &obj->message->hdrs);
- if (append) {
- array_append(new_headers, &old_headers);
- } else {
- array_merge(new_headers, &old_headers);
- }
+ array_join(Z_ARRVAL_P(new_headers), &obj->message->hdrs, append, ARRAY_JOIN_STRONLY|ARRAY_JOIN_PRETTIFY);
}
/* }}} */
#ifdef HTTP_HAVE_CURL
int method;
char *url;
- zval tmp, body, *array, *headers, *host = http_message_header(obj->message, "Host");
+ zval body, *array, *headers, *host = http_message_header(obj->message, "Host");
php_url hurl, *purl = php_url_parse(obj->message->http.info.request.url);
MAKE_STD_ZVAL(array);
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);
MAKE_STD_ZVAL(headers);
array_init(headers);
- INIT_ZARR(tmp, &obj->message->hdrs);
- array_copy(&tmp, headers);
+ array_copy(&obj->message->hdrs, Z_ARRVAL_P(headers));
add_assoc_zval(array, "headers", headers);
object_init_ex(return_value, http_request_object_ce);
{
#ifndef WONKY
HashPosition pos1, pos2;
- ulong idx;
- uint key_len;
- char *key = NULL;
+ HashKey key = initHashKey(0);
zval **header, **h, *body;
if (obj->message->http.info.response.code) {
object_init_ex(return_value, http_response_object_ce);
- FOREACH_HASH_KEYLENVAL(pos1, &obj->message->hdrs, key, key_len, idx, header) {
- if (key) {
- zval zkey;
+ FOREACH_HASH_KEYVAL(pos1, &obj->message->hdrs, key, header) {
+ if (key.type == HASH_KEY_IS_STRING) {
+ zval *zkey;
- INIT_PZVAL(&zkey);
- ZVAL_STRINGL(&zkey, key, key_len, 0);
+ MAKE_STD_ZVAL(zkey);
+ ZVAL_STRINGL(zkey, key.str, key.len - 1, 1);
switch (Z_TYPE_PP(header)) {
case IS_ARRAY:
case IS_OBJECT:
FOREACH_HASH_VAL(pos2, HASH_OF(*header), h) {
ZVAL_ADDREF(*h);
- zend_call_method_with_2_params(&return_value, http_response_object_ce, NULL, "setheader", NULL, &zkey, *h);
+ zend_call_method_with_2_params(&return_value, http_response_object_ce, NULL, "setheader", NULL, zkey, *h);
zval_ptr_dtor(h);
}
break;
default:
ZVAL_ADDREF(*header);
- zend_call_method_with_2_params(&return_value, http_response_object_ce, NULL, "setheader", NULL, &zkey, *header);
+ zend_call_method_with_2_params(&return_value, http_response_object_ce, NULL, "setheader", NULL, zkey, *header);
zval_ptr_dtor(header);
break;
}
- key = NULL;
+ zval_ptr_dtor(&zkey);
}
}