X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=http_message_object.c;h=0510829f74d791b02345ba51798a9fdd2adf25ad;hb=5f7061a515a21abec1cf742f25a68967516e21cb;hp=50d949131038d04afc93ae1b85f0f420e70225b8;hpb=b3fc227f0180cc93c521ef52bee7e4faa71c9a4c;p=m6w6%2Fext-http diff --git a/http_message_object.c b/http_message_object.c index 50d9491..0510829 100644 --- a/http_message_object.c +++ b/http_message_object.c @@ -97,8 +97,6 @@ static zval *_http_message_object_read_prop(zval *object, zval *member, int type static void _http_message_object_write_prop(zval *object, zval *member, zval *value TSRMLS_DC); #define http_message_object_get_props _http_message_object_get_props static HashTable *_http_message_object_get_props(zval *object TSRMLS_DC); -#define http_message_object_clone_obj _http_message_object_clone_obj -static inline zend_object_value _http_message_object_clone_obj(zval *object TSRMLS_DC); zend_class_entry *http_message_object_ce; zend_function_entry http_message_object_fe[] = { @@ -138,7 +136,7 @@ PHP_MINIT_FUNCTION(http_message_object) HTTP_LONG_CONSTANT("HTTP_MSG_REQUEST", HTTP_MSG_REQUEST); HTTP_LONG_CONSTANT("HTTP_MSG_RESPONSE", HTTP_MSG_RESPONSE); - http_message_object_handlers.clone_obj = http_message_object_clone_obj; + http_message_object_handlers.clone_obj = _http_message_object_clone_obj; http_message_object_handlers.read_property = http_message_object_read_prop; http_message_object_handlers.write_property = http_message_object_write_prop; http_message_object_handlers.get_properties = http_message_object_get_props; @@ -169,6 +167,8 @@ zend_object_value _http_message_object_new_ex(zend_class_entry *ce, http_message if (msg->parent) { o->parent = http_message_object_new_ex(ce, msg->parent, NULL); } + } else { + o->message = http_message_init(NULL); } ALLOC_HASHTABLE(OBJ_PROP(o)); @@ -236,7 +236,12 @@ static zval *_http_message_object_read_prop(zval *object, zval *member, int type } #endif - return_value = &EG(uninitialized_zval); + if (type == BP_VAR_W) { + zend_error(E_ERROR, "Cannot access HttpMessage properties by reference or array key/index"); + return NULL; + } + + ALLOC_ZVAL(return_value); return_value->refcount = 0; return_value->is_ref = 0; @@ -247,34 +252,29 @@ static zval *_http_message_object_read_prop(zval *object, zval *member, int type #endif { case HTTP_MSG_PROPHASH_TYPE: + case HTTP_MSG_CHILD_PROPHASH_TYPE: RETVAL_LONG(msg->type); break; case HTTP_MSG_PROPHASH_HTTP_VERSION: + case HTTP_MSG_CHILD_PROPHASH_HTTP_VERSION: RETVAL_DOUBLE(msg->http.version); break; case HTTP_MSG_PROPHASH_BODY: + case HTTP_MSG_CHILD_PROPHASH_BODY: phpstr_fix(PHPSTR(msg)); RETVAL_PHPSTR(PHPSTR(msg), 0, 1); break; case HTTP_MSG_PROPHASH_HEADERS: - /* This is needed for situations like - * $this->headers['foo'] = 'bar'; - */ - if (type == BP_VAR_W) { - return_value->refcount = 1; - return_value->is_ref = 1; - Z_TYPE_P(return_value) = IS_ARRAY; - Z_ARRVAL_P(return_value) = &msg->hdrs; - } else { - array_init(return_value); - zend_hash_copy(Z_ARRVAL_P(return_value), &msg->hdrs, (copy_ctor_func_t) zval_add_ref, NULL, sizeof(zval *)); - } + case HTTP_MSG_CHILD_PROPHASH_HEADERS: + array_init(return_value); + zend_hash_copy(Z_ARRVAL_P(return_value), &msg->hdrs, (copy_ctor_func_t) zval_add_ref, NULL, sizeof(zval *)); break; case HTTP_MSG_PROPHASH_PARENT_MESSAGE: + case HTTP_MSG_CHILD_PROPHASH_PARENT_MESSAGE: if (msg->parent) { RETVAL_OBJVAL(obj->parent); } else { @@ -283,6 +283,7 @@ static zval *_http_message_object_read_prop(zval *object, zval *member, int type break; case HTTP_MSG_PROPHASH_REQUEST_METHOD: + case HTTP_MSG_CHILD_PROPHASH_REQUEST_METHOD: if (HTTP_MSG_TYPE(REQUEST, msg) && msg->http.info.request.method) { RETVAL_STRING(msg->http.info.request.method, 1); } else { @@ -291,6 +292,7 @@ static zval *_http_message_object_read_prop(zval *object, zval *member, int type break; case HTTP_MSG_PROPHASH_REQUEST_URI: + case HTTP_MSG_CHILD_PROPHASH_REQUEST_URI: if (HTTP_MSG_TYPE(REQUEST, msg) && msg->http.info.request.URI) { RETVAL_STRING(msg->http.info.request.URI, 1); } else { @@ -299,6 +301,7 @@ static zval *_http_message_object_read_prop(zval *object, zval *member, int type break; case HTTP_MSG_PROPHASH_RESPONSE_CODE: + case HTTP_MSG_CHILD_PROPHASH_RESPONSE_CODE: if (HTTP_MSG_TYPE(RESPONSE, msg)) { RETVAL_LONG(msg->http.info.response.code); } else { @@ -307,6 +310,7 @@ static zval *_http_message_object_read_prop(zval *object, zval *member, int type break; case HTTP_MSG_PROPHASH_RESPONSE_STATUS: + case HTTP_MSG_CHILD_PROPHASH_RESPONSE_STATUS: if (HTTP_MSG_TYPE(RESPONSE, msg) && msg->http.info.response.status) { RETVAL_STRING(msg->http.info.response.status, 1); } else { @@ -348,28 +352,33 @@ static void _http_message_object_write_prop(zval *object, zval *member, zval *va #endif { case HTTP_MSG_PROPHASH_TYPE: + case HTTP_MSG_CHILD_PROPHASH_TYPE: convert_to_long_ex(&value); http_message_set_type(msg, Z_LVAL_P(value)); break; case HTTP_MSG_PROPHASH_HTTP_VERSION: + case HTTP_MSG_CHILD_PROPHASH_HTTP_VERSION: convert_to_double_ex(&value); msg->http.version = Z_DVAL_P(value); break; case HTTP_MSG_PROPHASH_BODY: + case HTTP_MSG_CHILD_PROPHASH_BODY: convert_to_string_ex(&value); phpstr_dtor(PHPSTR(msg)); phpstr_from_string_ex(PHPSTR(msg), Z_STRVAL_P(value), Z_STRLEN_P(value)); break; case HTTP_MSG_PROPHASH_HEADERS: + case HTTP_MSG_CHILD_PROPHASH_HEADERS: convert_to_array_ex(&value); zend_hash_clean(&msg->hdrs); zend_hash_copy(&msg->hdrs, Z_ARRVAL_P(value), (copy_ctor_func_t) zval_add_ref, NULL, sizeof(zval *)); break; case HTTP_MSG_PROPHASH_PARENT_MESSAGE: + case HTTP_MSG_CHILD_PROPHASH_PARENT_MESSAGE: if (Z_TYPE_P(value) == IS_OBJECT && instanceof_function(Z_OBJCE_P(value), http_message_object_ce TSRMLS_CC)) { if (msg->parent) { zval tmp; @@ -382,6 +391,7 @@ static void _http_message_object_write_prop(zval *object, zval *member, zval *va break; case HTTP_MSG_PROPHASH_REQUEST_METHOD: + case HTTP_MSG_CHILD_PROPHASH_REQUEST_METHOD: if (HTTP_MSG_TYPE(REQUEST, msg)) { convert_to_string_ex(&value); STR_SET(msg->http.info.request.method, estrndup(Z_STRVAL_P(value), Z_STRLEN_P(value))); @@ -389,6 +399,7 @@ static void _http_message_object_write_prop(zval *object, zval *member, zval *va break; case HTTP_MSG_PROPHASH_REQUEST_URI: + case HTTP_MSG_CHILD_PROPHASH_REQUEST_URI: if (HTTP_MSG_TYPE(REQUEST, msg)) { convert_to_string_ex(&value); STR_SET(msg->http.info.request.URI, estrndup(Z_STRVAL_P(value), Z_STRLEN_P(value))); @@ -396,6 +407,7 @@ static void _http_message_object_write_prop(zval *object, zval *member, zval *va break; case HTTP_MSG_PROPHASH_RESPONSE_CODE: + case HTTP_MSG_CHILD_PROPHASH_RESPONSE_CODE: if (HTTP_MSG_TYPE(RESPONSE, msg)) { convert_to_long_ex(&value); msg->http.info.response.code = Z_LVAL_P(value); @@ -403,6 +415,7 @@ static void _http_message_object_write_prop(zval *object, zval *member, zval *va break; case HTTP_MSG_PROPHASH_RESPONSE_STATUS: + case HTTP_MSG_CHILD_PROPHASH_RESPONSE_STATUS: if (HTTP_MSG_TYPE(RESPONSE, msg)) { convert_to_string_ex(&value); STR_SET(msg->http.info.response.status, estrndup(Z_STRVAL_P(value), Z_STRLEN_P(value)));