X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=http_message_object.c;h=3c90c58d4162524684e1fe0c802684e1d69cd2cc;hb=5773d11d8c9c28fb8b0e3389258f548fc4717892;hp=c0f5bf006118626abe6577acf8a6b97bf8f46565;hpb=6a2944938aa39f9f4471fba348a6ab6ea5473b2b;p=m6w6%2Fext-http diff --git a/http_message_object.c b/http_message_object.c index c0f5bf0..3c90c58 100644 --- a/http_message_object.c +++ b/http_message_object.c @@ -278,8 +278,8 @@ void _http_message_object_reverse(zval *this_ptr, zval *return_value TSRMLS_DC) void _http_message_object_prepend_ex(zval *this_ptr, zval *prepend, zend_bool top TSRMLS_DC) { zval m; - http_message *save_parent_msg; - zend_object_value save_parent_obj; + http_message *save_parent_msg = NULL; + zend_object_value save_parent_obj = {0, NULL}; getObject(http_message_object, obj); getObjectEx(http_message_object, prepend_obj, prepend); @@ -596,7 +596,7 @@ static HashTable *_http_message_object_get_props(zval *object TSRMLS_DC) getObjectEx(http_message_object, obj, object); http_message *msg = obj->message; HashTable *props = OBJ_PROP(obj); - zval array; + zval array, *parent; INIT_ZARR(array, props); @@ -651,6 +651,14 @@ static HashTable *_http_message_object_get_props(zval *object TSRMLS_DC) zend_hash_copy(Z_ARRVAL_P(headers), &msg->hdrs, (copy_ctor_func_t) zval_add_ref, NULL, sizeof(zval *)); ASSOC_PROP(array, zval, "headers", headers); ASSOC_STRINGL(array, "body", PHPSTR_VAL(msg), PHPSTR_LEN(msg)); + + MAKE_STD_ZVAL(parent); + if (msg->parent) { + ZVAL_OBJVAL(parent, obj->parent, 1); + } else { + ZVAL_NULL(parent); + } + ASSOC_PROP(array, zval, "parentMessage", parent); return OBJ_PROP(obj); } @@ -745,7 +753,7 @@ PHP_METHOD(HttpMessage, getBody) { NO_ARGS; - IF_RETVAL_USED { + if (return_value_used) { getObject(http_message_object, obj); RETURN_PHPSTR(&obj->message->body, PHPSTR_FREE_NOT, 1); } @@ -782,7 +790,7 @@ PHP_METHOD(HttpMessage, getHeaders) { NO_ARGS; - IF_RETVAL_USED { + if (return_value_used) { zval headers; getObject(http_message_object, obj); @@ -854,7 +862,7 @@ PHP_METHOD(HttpMessage, getType) { NO_ARGS; - IF_RETVAL_USED { + if (return_value_used) { getObject(http_message_object, obj); RETURN_LONG(obj->message->type); } @@ -890,7 +898,7 @@ PHP_METHOD(HttpMessage, getResponseCode) { NO_ARGS; - IF_RETVAL_USED { + if (return_value_used) { getObject(http_message_object, obj); HTTP_CHECK_MESSAGE_TYPE_RESPONSE(obj->message, RETURN_FALSE); RETURN_LONG(obj->message->http.info.response.code); @@ -938,7 +946,7 @@ PHP_METHOD(HttpMessage, getResponseStatus) { NO_ARGS; - IF_RETVAL_USED { + if (return_value_used) { getObject(http_message_object, obj); HTTP_CHECK_MESSAGE_TYPE_RESPONSE(obj->message, RETURN_FALSE); RETURN_STRING(obj->message->http.info.response.status, 1); @@ -982,7 +990,7 @@ PHP_METHOD(HttpMessage, getRequestMethod) { NO_ARGS; - IF_RETVAL_USED { + if (return_value_used) { getObject(http_message_object, obj); HTTP_CHECK_MESSAGE_TYPE_REQUEST(obj->message, RETURN_FALSE); RETURN_STRING(obj->message->http.info.request.method, 1); @@ -1035,7 +1043,7 @@ PHP_METHOD(HttpMessage, getRequestUrl) { NO_ARGS; - IF_RETVAL_USED { + if (return_value_used) { getObject(http_message_object, obj); HTTP_CHECK_MESSAGE_TYPE_REQUEST(obj->message, RETURN_FALSE); RETURN_STRING(obj->message->http.info.request.url, 1); @@ -1082,7 +1090,7 @@ PHP_METHOD(HttpMessage, getHttpVersion) { NO_ARGS; - IF_RETVAL_USED { + if (return_value_used) { char ver[4] = {0}; getObject(http_message_object, obj); @@ -1125,10 +1133,10 @@ PHP_METHOD(HttpMessage, setHttpVersion) /* {{{ proto HttpMessage HttpMessage::getParentMessage() * * Get parent Message. - * + * * Returns the parent HttpMessage on success, or NULL if there's none. * - * Throws HttpMessageException. + * Throws HttpRuntimeException. */ PHP_METHOD(HttpMessage, getParentMessage) { @@ -1139,7 +1147,7 @@ PHP_METHOD(HttpMessage, getParentMessage) if (obj->message->parent) { RETVAL_OBJVAL(obj->parent, 1); } else { - http_error(HE_WARNING, HTTP_E_MESSAGE, "HttpMessage does not have a parent message"); + http_error(HE_WARNING, HTTP_E_RUNTIME, "HttpMessage does not have a parent message"); } } SET_EH_NORMAL(); @@ -1174,7 +1182,7 @@ PHP_METHOD(HttpMessage, send) */ PHP_METHOD(HttpMessage, toString) { - IF_RETVAL_USED { + if (return_value_used) { char *string; size_t length; zend_bool include_parent = 0; @@ -1208,7 +1216,7 @@ PHP_METHOD(HttpMessage, toMessageTypeObject) NO_ARGS; - IF_RETVAL_USED { + if (return_value_used) { getObject(http_message_object, obj); switch (obj->message->type) @@ -1404,11 +1412,13 @@ PHP_METHOD(HttpMessage, detach) } /* }}} */ -/* {{{ proto void HttpMessage::prepend(HttpMessage message) +/* {{{ proto void HttpMessage::prepend(HttpMessage message[, bool top = true]) * * Prepends message(s) to the HTTP message. * * Expects an HttpMessage object as parameter. + * + * Throws HttpInvalidParamException if the message is located within the same message chain. */ PHP_METHOD(HttpMessage, prepend) { @@ -1416,6 +1426,20 @@ PHP_METHOD(HttpMessage, prepend) zend_bool top = 1; if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O|b", &prepend, http_message_object_ce, &top)) { + http_message *msg[2]; + getObject(http_message_object, obj); + getObjectEx(http_message_object, prepend_obj, prepend); + + /* safety check */ + for (msg[0] = obj->message; msg[0]; msg[0] = msg[0]->parent) { + for (msg[1] = prepend_obj->message; msg[1]; msg[1] = msg[1]->parent) { + if (msg[0] == msg[1]) { + http_error(HE_THROW, HTTP_E_INVALID_PARAM, "Cannot prepend a message located within the same message chain"); + return; + } + } + } + http_message_object_prepend_ex(getThis(), prepend, top); } }