--crashes; ++leaks;
[m6w6/ext-http] / src / php_http_message.c
index 078ae4cea4f90fa28a478fc837f920f0546ad06c..413edab57711604aa5350a5b4a4cd506e58a43dc 100644 (file)
@@ -330,24 +330,14 @@ void php_http_message_update_headers(php_http_message_t *msg)
 static void message_headers(php_http_message_t *msg, php_http_buffer_t *str)
 {
        char *tmp = NULL;
+       size_t len = 0;
 
-       switch (msg->type) {
-               case PHP_HTTP_REQUEST:
-                       php_http_buffer_appendf(str, PHP_HTTP_INFO_REQUEST_FMT_ARGS(&msg->http, tmp, PHP_HTTP_CRLF));
-                       PTR_FREE(tmp);
-                       break;
-
-               case PHP_HTTP_RESPONSE:
-                       php_http_buffer_appendf(str, PHP_HTTP_INFO_RESPONSE_FMT_ARGS(&msg->http, tmp, PHP_HTTP_CRLF));
-                       PTR_FREE(tmp);
-                       break;
-
-               default:
-                       break;
-       }
-
+       php_http_info_to_string((php_http_info_t *) msg, &tmp, &len, PHP_HTTP_CRLF TSRMLS_CC);
        php_http_message_update_headers(msg);
+
+       php_http_buffer_append(str, tmp, len);
        php_http_header_to_string(str, &msg->hdrs);
+       PTR_FREE(tmp);
 }
 
 void php_http_message_to_callback(php_http_message_t *msg, php_http_pass_callback_t cb, void *cb_arg)
@@ -415,7 +405,7 @@ php_http_message_t *php_http_message_reverse(php_http_message_t *msg)
        if (c > 1) {
                php_http_message_t *tmp = msg, **arr;
 
-               arr = ecalloc(c, sizeof(**arr));
+               arr = ecalloc(c, sizeof(*arr));
                for (i = 0; i < c; ++i) {
                        arr[i] = tmp;
                        tmp = tmp->parent;
@@ -626,18 +616,18 @@ static void php_http_message_object_prophandler_get_headers(php_http_message_obj
        array_copy(&obj->message->hdrs, Z_ARRVAL_P(return_value));
 }
 static void php_http_message_object_prophandler_set_headers(php_http_message_object_t *obj, zval *value) {
-       HashTable *headers;
-       zval *orig_value = value;
+       int converted = 0;
 
        if (Z_TYPE_P(value) != IS_ARRAY && Z_TYPE_P(value) != IS_OBJECT) {
-               convert_to_array_ex(value);
+               converted = 1;
+               SEPARATE_ZVAL(value);
+               convert_to_array(value);
        }
-       headers = HASH_OF(value);
 
        zend_hash_clean(&obj->message->hdrs);
-       array_copy(headers, &obj->message->hdrs);
+       array_copy(HASH_OF(value), &obj->message->hdrs);
 
-       if (orig_value != value) {
+       if (converted) {
                zval_ptr_dtor(value);
        }
 }
@@ -693,7 +683,7 @@ void php_http_message_object_reverse(zval *zmsg, zval *return_value)
                php_http_message_object_t **objects;
                int last;
 
-               objects = ecalloc(i, sizeof(**objects));
+               objects = ecalloc(i, sizeof(*objects));
 
                /* we are the first message */
                objects[0] = obj;
@@ -795,6 +785,7 @@ ZEND_RESULT_CODE php_http_message_object_set_body(php_http_message_object_t *msg
 
        if (!body_obj->body) {
                body_obj->body = php_http_message_body_init(NULL, NULL);
+               php_stream_to_zval(php_http_message_body_stream(body_obj->body), body_obj->gc);
        }
        if (msg_obj->body) {
                zend_object_release(&msg_obj->body->zo);
@@ -892,12 +883,13 @@ static zval *php_http_message_object_read_prop(zval *object, zval *member, int t
 
                if (handler) {
                        php_http_message_object_t *obj = PHP_HTTP_OBJ(NULL, object);
+                       zval tmp2;
 
                        PHP_HTTP_MESSAGE_OBJECT_INIT(obj);
-                       handler->read(obj, tmp);
+                       handler->read(obj, &tmp2);
 
                        zval_ptr_dtor(return_value);
-                       ZVAL_COPY_VALUE(return_value, tmp);
+                       ZVAL_COPY_VALUE(return_value, &tmp2);
                }
                zend_string_release(member_name);
                return return_value;
@@ -1112,7 +1104,6 @@ static PHP_METHOD(HttpMessage, getBody)
 
        if (!obj->body) {
                php_http_message_object_init_body_object(obj);
-
        }
        if (obj->body) {
                RETVAL_OBJECT(&obj->body->zo, 1);
@@ -1375,25 +1366,12 @@ ZEND_END_ARG_INFO();
 static PHP_METHOD(HttpMessage, getInfo)
 {
        if (SUCCESS == zend_parse_parameters_none()) {
-               char *str, *tmp = NULL;
-               size_t len;
+               char *str = NULL;
+               size_t len = 0;
                php_http_message_object_t *obj = PHP_HTTP_OBJ(NULL, getThis());
 
                PHP_HTTP_MESSAGE_OBJECT_INIT(obj);
-
-               switch (obj->message->type) {
-                       case PHP_HTTP_REQUEST:
-                               len = spprintf(&str, 0, PHP_HTTP_INFO_REQUEST_FMT_ARGS(&obj->message->http, tmp, ""));
-                               PTR_FREE(tmp);
-                               break;
-                       case PHP_HTTP_RESPONSE:
-                               len = spprintf(&str, 0, PHP_HTTP_INFO_RESPONSE_FMT_ARGS(&obj->message->http, tmp, ""));
-                               PTR_FREE(tmp);
-                               break;
-                       default:
-                               RETURN_NULL();
-                               break;
-               }
+               php_http_info_to_string((php_http_info_t *) obj->message, &str, &len, "");
 
                RETVAL_STR(php_http_cs2zs(str, len));
        }