- add HTTP_URL_STRIP_ALL constant
[m6w6/ext-http] / http_message_object.c
index c0f5bf006118626abe6577acf8a6b97bf8f46565..3c90c58d4162524684e1fe0c802684e1d69cd2cc 100644 (file)
@@ -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);
        }
 }