- add HttpMessage::setRaw(), ::getBody(), ::getHeaders()
authorMichael Wallner <mike@php.net>
Tue, 12 Apr 2005 15:28:44 +0000 (15:28 +0000)
committerMichael Wallner <mike@php.net>
Tue, 12 Apr 2005 15:28:44 +0000 (15:28 +0000)
- using a global tmp zval for the property avoids memleaks

http.c
http_message_object.c
http_methods.c
php_http.h
php_http_message_object.h

diff --git a/http.c b/http.c
index 50f387b81363d3b98eeaf69d2669483e4b742631..9aa6878561b580a09a9111250246b8d363f52d22 100644 (file)
--- a/http.c
+++ b/http.c
@@ -283,6 +283,8 @@ PHP_RSHUTDOWN_FUNCTION(http)
        phpstr_dtor(&HTTP_G(curlbuf));
 #endif
 
+       zval_dtor(&HTTP_G(message_object_tmp_property));
+
        return SUCCESS;
 }
 /* }}} */
index 08dc0dd61b98981615d2e0c96f4d8f73f18d2c43..17c9492b7e8a36d7304a0a900f5742c193620086 100644 (file)
 
 #include "php.h"
 
+#include "php_http.h"
 #include "php_http_std_defs.h"
 #include "php_http_message_object.h"
 
 #ifdef ZEND_ENGINE_2
 
+ZEND_EXTERN_MODULE_GLOBALS(http);
+
 #define http_message_object_declare_default_properties() _http_message_object_declare_default_properties(TSRMLS_C)
 static inline void _http_message_object_declare_default_properties(TSRMLS_D);
 #define http_message_object_read_prop _http_message_object_read_prop
@@ -39,7 +42,9 @@ static HashTable *_http_message_object_get_props(zval *object TSRMLS_DC);
 zend_class_entry *http_message_object_ce;
 zend_function_entry http_message_object_fe[] = {
        PHP_ME(HttpMessage, __construct, NULL, ZEND_ACC_PUBLIC|ZEND_ACC_CTOR)
-       PHP_ME(HttpMessage, __destruct, NULL, ZEND_ACC_PUBLIC|ZEND_ACC_DTOR)
+       PHP_ME(HttpMessage, setRaw, NULL, ZEND_ACC_PUBLIC)
+       PHP_ME(HttpMessage, getBody, NULL, ZEND_ACC_PUBLIC)
+       PHP_ME(HttpMessage, getHeaders, NULL, ZEND_ACC_PUBLIC)
        {NULL, NULL, NULL}
 };
 static zend_object_handlers http_message_object_handlers;
@@ -107,15 +112,14 @@ static zval *_http_message_object_read_prop(zval *object, zval *member, int type
 {
        getObjectEx(http_message_object, obj, object);
        http_message *msg = obj->message;
-       zval *return_value;
+       zval *return_value = &HTTP_G(message_object_tmp_property);
 
        if (!EG(scope) || !instanceof_function(EG(scope), obj->zo.ce TSRMLS_CC)) {
                zend_error(E_WARNING, "Cannot access protected property %s::$%s", obj->zo.ce->name, Z_STRVAL_P(member));
                return EG(uninitialized_zval_ptr);
        }
 
-    ALLOC_ZVAL(return_value);
-    return_value->refcount = 0;
+    zval_dtor(return_value);
 
 #if 0
        fprintf(stderr, "Reading property: %s(%d==%d) (%lu)\n", Z_STRVAL_P(member), Z_STRLEN_P(member), strlen(Z_STRVAL_P(member)),
@@ -151,7 +155,7 @@ static zval *_http_message_object_read_prop(zval *object, zval *member, int type
                                if (msg->len) {
                                        RETVAL_STRINGL(msg->raw, msg->len, 1);
                                } else {
-                                       RETVAL_STRINGL(empty_string, 0, 0);
+                                       RETVAL_STRINGL(empty_string, 0, 1);
                                }
                        } else {
                                RETVAL_NULL();
@@ -164,8 +168,8 @@ static zval *_http_message_object_read_prop(zval *object, zval *member, int type
                break;
 
                case HTTP_MSG_PROPHASH_HEADERS:
-                       Z_TYPE_P(return_value) = IS_ARRAY;
-                       Z_ARRVAL_P(return_value) = &msg->hdrs;
+                       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_NESTED_MESSAGE:
index 6812d7d795af9838a4ab7959f88bb93962df924d..a6e2f2007ff3fc0453f9fc6b455c8161c2661d57 100644 (file)
@@ -523,31 +523,76 @@ PHP_METHOD(HttpResponse, send)
 
 /* {{{ HttpMessage */
 
-/* {{{ void HttpMessage::__construct([string raw_message]) */
+/* {{{ void HttpMessage::__construct([string raw_message])
+ *
+ * Instantiate a new HttpMessage object based on the optionally provided
+ * raw message.  An HTTP Message can be either a response or a request.
+ */
 PHP_METHOD(HttpMessage, __construct)
 {
        zval *message = NULL;
        int message_len;
        getObject(http_message_object, obj);
-       http_message *msg = obj->message;
 
        if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|z/", &message)) {
                return;
        }
 
        if (message) {
+               convert_to_string(message);
                SET_PROP(obj, raw, message);
        }
 }
 /* }}} */
 
-/* {{{ void HttpMessage::__destruct() */
-PHP_METHOD(HttpMessage, __destruct)
+/* {{{ void HttpMessage::setRaw(string raw_message)
+ *
+ * Parse a new raw message.
+ */
+PHP_METHOD(HttpMessage, setRaw)
 {
+       zval *message;
        getObject(http_message_object, obj);
+       
+       if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z/", &message)) {
+               return;
+       }
 
+       convert_to_string(message);
+       SET_PROP(obj, raw, message);
+}
+/* }}} */
+
+/* {{{ string HttpMessage::getBody()
+ *
+ * Get the body of the parsed Message.
+ */
+PHP_METHOD(HttpMessage, getBody)
+{
+       zval *body;
+       getObject(http_message_object, obj);
+       
        NO_ARGS;
 
+       body = GET_PROP(obj, body);
+       RETURN_STRINGL(Z_STRVAL_P(body), Z_STRLEN_P(body), 1);
+}
+/* }}} */
+
+/* {{{ array HttpMessage::getHeaders()
+ *
+ * Get Message Headers.
+ */
+PHP_METHOD(HttpMessage, getHeaders)
+{
+       zval *headers;
+       getObject(http_message_object, obj);
+       
+       NO_ARGS;
+       
+       headers = GET_PROP(obj, headers);
+       array_init(return_value);
+       array_copy(headers, return_value);
 }
 /* }}} */
 
index ca291374e2759e04f6efbc41a80fa53f5b2529dc..0c00e662093555c77117ab091e9e325738f857c3 100644 (file)
@@ -47,6 +47,7 @@ ZEND_BEGIN_MODULE_GLOBALS(http)
        char curlerr[CURL_ERROR_SIZE + 1];
 #      endif
        zend_llist to_free;
+       zval message_object_tmp_property;
 #endif /* HTTP_HAVE_CURL */
 ZEND_END_MODULE_GLOBALS(http)
 
index 1d1a5ecfe384a1b9f7c802d0df70364342b11259..399aca3c008b12d9f44128a5590de4f8473544cf 100644 (file)
@@ -47,7 +47,9 @@ extern void _http_message_object_free(zend_object *object TSRMLS_DC);
 #define HTTP_MSG_PROPHASH_RESPONSE_STATUS      3857097400LU
 
 PHP_METHOD(HttpMessage, __construct);
-PHP_METHOD(HttpMessage, __destruct);
+PHP_METHOD(HttpMessage, setRaw);
+PHP_METHOD(HttpMessage, getBody);
+PHP_METHOD(HttpMessage, getHeaders);
 
 #endif
 #endif