HTTP_ARG_VAL(body, 0)
HTTP_END_ARGS;
+HTTP_BEGIN_ARGS(getHeader, 1)
+ HTTP_ARG_VAL(header, 0)
+HTTP_END_ARGS;
+
HTTP_EMPTY_ARGS(getHeaders);
HTTP_BEGIN_ARGS(setHeaders, 1)
HTTP_ARG_VAL(headers, 0)
HTTP_MESSAGE_ME(__construct, ZEND_ACC_PUBLIC|ZEND_ACC_CTOR)
HTTP_MESSAGE_ME(getBody, ZEND_ACC_PUBLIC)
HTTP_MESSAGE_ME(setBody, ZEND_ACC_PUBLIC)
+ HTTP_MESSAGE_ME(getHeader, ZEND_ACC_PUBLIC)
HTTP_MESSAGE_ME(getHeaders, ZEND_ACC_PUBLIC)
HTTP_MESSAGE_ME(setHeaders, ZEND_ACC_PUBLIC)
HTTP_MESSAGE_ME(addHeaders, ZEND_ACC_PUBLIC)
}
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)
{
http_message_object *o = (http_message_object *) object;
- if (OBJ_PROP(o)) {
- zend_hash_destroy(OBJ_PROP(o));
- FREE_HASHTABLE(OBJ_PROP(o));
- }
if (o->message) {
http_message_dtor(o->message);
efree(o->message);
p.value.obj = o->parent;
zend_objects_store_del_ref(&p TSRMLS_CC);
}
- efree(o);
+ freeObject(o);
}
static zval *_http_message_object_read_prop(zval *object, zval *member, int type 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;
}
/* }}} */
+/* {{{ proto string HttpMessage::getHeader(string header)
+ *
+ * Get message header.
+ *
+ * Returns the header value on success or NULL if the header does not exist.
+ */
+PHP_METHOD(HttpMessage, getHeader)
+{
+ zval *header;
+ char *orig_header, *nice_header;
+ int header_len;
+ getObject(http_message_object, obj);
+
+ if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &orig_header, &header_len)) {
+ RETURN_FALSE;
+ }
+
+ 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, 0))) {
+ RETVAL_ZVAL(header, 1, 1);
+ }
+ efree(nice_header);
+}
+/* }}} */
+
/* {{{ proto array HttpMessage::getHeaders()
*
* Get Message Headers.
*/
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);
+ }
}
/* }}} */
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);