- adjust ini entry names to those of the globals struct
[m6w6/ext-http] / http_message_object.c
index 3d2e72714ba5e818b1426691c9fa984af69194e3..5e03e1e07c79ea2b751ae9ef9dfed5356400ed29 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);
                
@@ -410,24 +410,24 @@ static zval *_http_message_object_read_prop(zval *object, zval *member, int type
                case HTTP_MSG_PROPHASH_TYPE:
                case HTTP_MSG_CHILD_PROPHASH_TYPE:
                        RETVAL_LONG(msg->type);
-               break;
+                       break;
 
                case HTTP_MSG_PROPHASH_HTTP_VERSION:
                case HTTP_MSG_CHILD_PROPHASH_HTTP_VERSION:
                        RETVAL_DOUBLE(msg->http.version);
-               break;
+                       break;
 
                case HTTP_MSG_PROPHASH_BODY:
                case HTTP_MSG_CHILD_PROPHASH_BODY:
                        phpstr_fix(PHPSTR(msg));
                        RETVAL_PHPSTR(PHPSTR(msg), 0, 1);
-               break;
+                       break;
 
                case HTTP_MSG_PROPHASH_HEADERS:
                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;
+                       break;
 
                case HTTP_MSG_PROPHASH_PARENT_MESSAGE:
                case HTTP_MSG_CHILD_PROPHASH_PARENT_MESSAGE:
@@ -436,7 +436,7 @@ static zval *_http_message_object_read_prop(zval *object, zval *member, int type
                        } else {
                                RETVAL_NULL();
                        }
-               break;
+                       break;
 
                case HTTP_MSG_PROPHASH_REQUEST_METHOD:
                case HTTP_MSG_CHILD_PROPHASH_REQUEST_METHOD:
@@ -445,7 +445,7 @@ static zval *_http_message_object_read_prop(zval *object, zval *member, int type
                        } else {
                                RETVAL_NULL();
                        }
-               break;
+                       break;
 
                case HTTP_MSG_PROPHASH_REQUEST_URL:
                case HTTP_MSG_CHILD_PROPHASH_REQUEST_URL:
@@ -454,7 +454,7 @@ static zval *_http_message_object_read_prop(zval *object, zval *member, int type
                        } else {
                                RETVAL_NULL();
                        }
-               break;
+                       break;
 
                case HTTP_MSG_PROPHASH_RESPONSE_CODE:
                case HTTP_MSG_CHILD_PROPHASH_RESPONSE_CODE:
@@ -463,7 +463,7 @@ static zval *_http_message_object_read_prop(zval *object, zval *member, int type
                        } else {
                                RETVAL_NULL();
                        }
-               break;
+                       break;
                
                case HTTP_MSG_PROPHASH_RESPONSE_STATUS:
                case HTTP_MSG_CHILD_PROPHASH_RESPONSE_STATUS:
@@ -472,7 +472,7 @@ static zval *_http_message_object_read_prop(zval *object, zval *member, int type
                        } else {
                                RETVAL_NULL();
                        }
-               break;
+                       break;
                
                default:
 #ifdef WONKY
@@ -480,7 +480,6 @@ static zval *_http_message_object_read_prop(zval *object, zval *member, int type
 #else
                        RETVAL_NULL();
 #endif
-               break;
        }
 
        return return_value;
@@ -514,27 +513,27 @@ static void _http_message_object_write_prop(zval *object, zval *member, zval *va
                case HTTP_MSG_CHILD_PROPHASH_TYPE:
                        convert_to_long(cpy);
                        http_message_set_type(msg, Z_LVAL_P(cpy));
-               break;
+                       break;
 
                case HTTP_MSG_PROPHASH_HTTP_VERSION:
                case HTTP_MSG_CHILD_PROPHASH_HTTP_VERSION:
                        convert_to_double(cpy);
                        msg->http.version = Z_DVAL_P(cpy);
-               break;
+                       break;
 
                case HTTP_MSG_PROPHASH_BODY:
                case HTTP_MSG_CHILD_PROPHASH_BODY:
                        convert_to_string(cpy);
                        phpstr_dtor(PHPSTR(msg));
                        phpstr_from_string_ex(PHPSTR(msg), Z_STRVAL_P(cpy), Z_STRLEN_P(cpy));
-               break;
+                       break;
 
                case HTTP_MSG_PROPHASH_HEADERS:
                case HTTP_MSG_CHILD_PROPHASH_HEADERS:
                        convert_to_array(cpy);
                        zend_hash_clean(&msg->hdrs);
                        zend_hash_copy(&msg->hdrs, Z_ARRVAL_P(cpy), (copy_ctor_func_t) zval_add_ref, NULL, sizeof(zval *));
-               break;
+                       break;
 
                case HTTP_MSG_PROPHASH_PARENT_MESSAGE:
                case HTTP_MSG_CHILD_PROPHASH_PARENT_MESSAGE:
@@ -547,7 +546,7 @@ static void _http_message_object_write_prop(zval *object, zval *member, zval *va
                                Z_OBJ_ADDREF_P(value);
                                obj->parent = value->value.obj;
                        }
-               break;
+                       break;
 
                case HTTP_MSG_PROPHASH_REQUEST_METHOD:
                case HTTP_MSG_CHILD_PROPHASH_REQUEST_METHOD:
@@ -555,7 +554,7 @@ static void _http_message_object_write_prop(zval *object, zval *member, zval *va
                                convert_to_string(cpy);
                                STR_SET(msg->http.info.request.method, estrndup(Z_STRVAL_P(cpy), Z_STRLEN_P(cpy)));
                        }
-               break;
+                       break;
 
                case HTTP_MSG_PROPHASH_REQUEST_URL:
                case HTTP_MSG_CHILD_PROPHASH_REQUEST_URL:
@@ -563,7 +562,7 @@ static void _http_message_object_write_prop(zval *object, zval *member, zval *va
                                convert_to_string(cpy);
                                STR_SET(msg->http.info.request.url, estrndup(Z_STRVAL_P(cpy), Z_STRLEN_P(cpy)));
                        }
-               break;
+                       break;
 
                case HTTP_MSG_PROPHASH_RESPONSE_CODE:
                case HTTP_MSG_CHILD_PROPHASH_RESPONSE_CODE:
@@ -571,7 +570,7 @@ static void _http_message_object_write_prop(zval *object, zval *member, zval *va
                                convert_to_long(cpy);
                                msg->http.info.response.code = Z_LVAL_P(cpy);
                        }
-               break;
+                       break;
                
                case HTTP_MSG_PROPHASH_RESPONSE_STATUS:
                case HTTP_MSG_CHILD_PROPHASH_RESPONSE_STATUS:
@@ -579,13 +578,13 @@ static void _http_message_object_write_prop(zval *object, zval *member, zval *va
                                convert_to_string(cpy);
                                STR_SET(msg->http.info.response.status, estrndup(Z_STRVAL_P(cpy), Z_STRLEN_P(cpy)));
                        }
-               break;
+                       break;
                
                default:
 #ifdef WONKY
                        zend_get_std_object_handlers()->write_property(object, member, value TSRMLS_CC);
 #endif
-               break;
+                       break;
        }
        zval_free(&cpy);
 }
@@ -596,7 +595,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);
 
@@ -621,21 +620,20 @@ static HashTable *_http_message_object_get_props(zval *object TSRMLS_DC)
        ASSOC_PROP(array, long, "type", msg->type);
        ASSOC_PROP(array, double, "httpVersion", msg->http.version);
 
-       switch (msg->type)
-       {
+       switch (msg->type) {
                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);
-               break;
+                       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_STRINGL(array, "requestMethod", "", 0);
                        ASSOC_STRINGL(array, "requestUrl", "", 0);
-               break;
+                       break;
 
                case HTTP_MSG_NONE:
                default:
@@ -643,7 +641,7 @@ static HashTable *_http_message_object_get_props(zval *object TSRMLS_DC)
                        ASSOC_STRINGL(array, "responseStatus", "", 0);
                        ASSOC_STRINGL(array, "requestMethod", "", 0);
                        ASSOC_STRINGL(array, "requestUrl", "", 0);
-               break;
+                       break;
        }
 
        MAKE_STD_ZVAL(headers);
@@ -651,6 +649,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 +751,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 +788,7 @@ PHP_METHOD(HttpMessage, getHeaders)
 {
        NO_ARGS;
 
-       IF_RETVAL_USED {
+       if (return_value_used) {
                zval headers;
                getObject(http_message_object, obj);
 
@@ -854,7 +860,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 +896,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 +944,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 +988,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);
@@ -1014,8 +1020,8 @@ PHP_METHOD(HttpMessage, setRequestMethod)
                http_error(HE_WARNING, HTTP_E_INVALID_PARAM, "Cannot set HttpMessage::requestMethod to an empty string");
                RETURN_FALSE;
        }
-       if (SUCCESS != http_check_method(method)) {
-               http_error_ex(HE_WARNING, HTTP_E_REQUEST_METHOD, "Unkown request method: %s", method);
+       if (!http_request_method_exists(1, 0, method)) {
+               http_error_ex(HE_WARNING, HTTP_E_REQUEST_METHOD, "Unknown request method: %s", method);
                RETURN_FALSE;
        }
 
@@ -1035,7 +1041,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 +1088,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 +1131,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)
 {
@@ -1174,7 +1180,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,11 +1214,10 @@ PHP_METHOD(HttpMessage, toMessageTypeObject)
        
        NO_ARGS;
        
-       IF_RETVAL_USED {
+       if (return_value_used) {
                getObject(http_message_object, obj);
                
-               switch (obj->message->type)
-               {
+               switch (obj->message->type) {
                        case HTTP_MSG_REQUEST:
                        {
 #ifdef HTTP_HAVE_CURL
@@ -1255,8 +1260,8 @@ PHP_METHOD(HttpMessage, toMessageTypeObject)
 #else
                                http_error(HE_WARNING, HTTP_E_RUNTIME, "Cannot transform HttpMessage to HttpRequest (missing curl support)");
 #endif
+                               break;
                        }
-                       break;
                        
                        case HTTP_MSG_RESPONSE:
                        {
@@ -1280,8 +1285,7 @@ PHP_METHOD(HttpMessage, toMessageTypeObject)
                                                INIT_PZVAL(&zkey);
                                                ZVAL_STRINGL(&zkey, key, key_len, 0);
                                                
-                                               switch (Z_TYPE_PP(header))
-                                               {
+                                               switch (Z_TYPE_PP(header)) {
                                                        case IS_ARRAY:
                                                        case IS_OBJECT:
                                                                FOREACH_HASH_VAL(pos2, HASH_OF(*header), h) {
@@ -1289,13 +1293,13 @@ PHP_METHOD(HttpMessage, toMessageTypeObject)
                                                                        zend_call_method_with_2_params(&return_value, http_response_object_ce, NULL, "setheader", NULL, &zkey, *h);
                                                                        zval_ptr_dtor(h);
                                                                }
-                                                       break;
+                                                               break;
                                                        
                                                        default:
                                                                ZVAL_ADDREF(*header);
                                                                zend_call_method_with_2_params(&return_value, http_response_object_ce, NULL, "setheader", NULL, &zkey, *header);
                                                                zval_ptr_dtor(header);
-                                                       break;
+                                                               break;
                                                }
                                                key = NULL;
                                        }
@@ -1308,12 +1312,12 @@ PHP_METHOD(HttpMessage, toMessageTypeObject)
 #else
                                http_error(HE_WARNING, HTTP_E_RUNTIME, "Cannot transform HttpMessage to HttpResponse (need PHP 5.1+)");
 #endif
+                               break;
                        }
-                       break;
                        
                        default:
                                http_error(HE_WARNING, HTTP_E_MESSAGE_TYPE, "HttpMessage is neither of type HttpMessage::TYPE_REQUEST nor HttpMessage::TYPE_RESPONSE");
-                       break;
+                               break;
                }
        }
        SET_EH_NORMAL();
@@ -1404,11 +1408,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 +1422,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);
        }
 }