add php_http_message_zip(): merge request/response messages for history
[m6w6/ext-http] / php_http_message.c
index f1169d01b8418412f9e55dd7f935801a8aac255c..04e87060445a5d19b5af91d39242d91c8d030450 100644 (file)
@@ -277,27 +277,12 @@ PHP_HTTP_API void php_http_message_set_info(php_http_message_t *message, php_htt
        }
 }
 
-static inline void message_headers(php_http_message_t *msg, php_http_buffer_t *str)
+PHP_HTTP_API void php_http_message_update_headers(php_http_message_t *msg)
 {
-       php_http_array_hashkey_t key = php_http_array_hashkey_init(0);
-       HashPosition pos1;
-       zval **header, *h;
+       zval *h;
        size_t size;
        TSRMLS_FETCH_FROM_CTX(msg->ts);
 
-       switch (msg->type) {
-               case PHP_HTTP_REQUEST:
-                       php_http_buffer_appendf(str, PHP_HTTP_INFO_REQUEST_FMT_ARGS(&msg->http, PHP_HTTP_CRLF));
-                       break;
-
-               case PHP_HTTP_RESPONSE:
-                       php_http_buffer_appendf(str, PHP_HTTP_INFO_RESPONSE_FMT_ARGS(&msg->http, PHP_HTTP_CRLF));
-                       break;
-
-               default:
-                       break;
-       }
-
        if ((size = php_http_message_body_size(&msg->body))) {
                MAKE_STD_ZVAL(h);
                ZVAL_LONG(h, size);
@@ -321,6 +306,28 @@ static inline void message_headers(php_http_message_t *msg, php_http_buffer_t *s
                        }
                }
        }
+}
+static inline void message_headers(php_http_message_t *msg, php_http_buffer_t *str)
+{
+       php_http_array_hashkey_t key = php_http_array_hashkey_init(0);
+       HashPosition pos1;
+       zval **header;
+       TSRMLS_FETCH_FROM_CTX(msg->ts);
+
+       switch (msg->type) {
+               case PHP_HTTP_REQUEST:
+                       php_http_buffer_appendf(str, PHP_HTTP_INFO_REQUEST_FMT_ARGS(&msg->http, PHP_HTTP_CRLF));
+                       break;
+
+               case PHP_HTTP_RESPONSE:
+                       php_http_buffer_appendf(str, PHP_HTTP_INFO_RESPONSE_FMT_ARGS(&msg->http, PHP_HTTP_CRLF));
+                       break;
+
+               default:
+                       break;
+       }
+
+       php_http_message_update_headers(msg);
 
        FOREACH_HASH_KEYVAL(pos1, &msg->hdrs, key, header) {
                if (key.type == HASH_KEY_IS_STRING) {
@@ -455,6 +462,24 @@ PHP_HTTP_API php_http_message_t *php_http_message_reverse(php_http_message_t *ms
        return msg;
 }
 
+PHP_HTTP_API php_http_message_t *php_http_message_zip(php_http_message_t *one, php_http_message_t *two)
+{
+       php_http_message_t *dst = php_http_message_copy(one, NULL), *src = php_http_message_copy(two, NULL), *tmp_dst, *tmp_src, *ret = dst;
+
+       while(dst && src) {
+               tmp_dst = dst->parent;
+               tmp_src = src->parent;
+               dst->parent = src;
+               if (tmp_dst) {
+                       src->parent = tmp_dst;
+               }
+               src = tmp_src;
+               dst = tmp_dst;
+       }
+
+       return ret;
+}
+
 PHP_HTTP_API php_http_message_t *php_http_message_copy_ex(php_http_message_t *from, php_http_message_t *to, zend_bool parents)
 {
        php_http_message_t *temp, *copy = NULL;
@@ -978,7 +1003,7 @@ void php_http_message_object_prepend(zval *this_ptr, zval *prepend, zend_bool to
 
 STATUS php_http_message_object_set_body(php_http_message_object_t *msg_obj, zval *zbody TSRMLS_DC)
 {
-       zval *tmp;
+       zval *tmp = NULL;
        php_stream *s;
        zend_object_value ov;
        php_http_message_body_t *body;
@@ -995,12 +1020,13 @@ STATUS php_http_message_object_set_body(php_http_message_object_t *msg_obj, zval
                        is_resource:
 
                        body = php_http_message_body_init(NULL, s TSRMLS_CC);
-                       if (SUCCESS != php_http_new(&ov, php_http_message_body_get_class_entry(), php_http_message_body_object_new_ex, NULL, body, NULL TSRMLS_CC)) {
+                       if (SUCCESS != php_http_new(&ov, php_http_message_body_get_class_entry(), (php_http_new_t) php_http_message_body_object_new_ex, NULL, body, NULL TSRMLS_CC)) {
                                php_http_message_body_free(&body);
                                return FAILURE;
                        }
-                       MAKE_STD_ZVAL(zbody);
-                       ZVAL_OBJVAL(zbody, ov, 0);
+                       MAKE_STD_ZVAL(tmp);
+                       ZVAL_OBJVAL(tmp, ov, 0);
+                       zbody = tmp;
                        break;
 
                case IS_OBJECT:
@@ -1015,6 +1041,7 @@ STATUS php_http_message_object_set_body(php_http_message_object_t *msg_obj, zval
                        s = php_stream_temp_new();
                        php_stream_write(s, Z_STRVAL_P(tmp), Z_STRLEN_P(tmp));
                        zval_ptr_dtor(&tmp);
+                       tmp = NULL;
                        goto is_resource;
 
        }
@@ -1029,6 +1056,10 @@ STATUS php_http_message_object_set_body(php_http_message_object_t *msg_obj, zval
        php_http_message_body_copy(body_obj->body, &msg_obj->message->body, 0);
        msg_obj->body = Z_OBJVAL_P(zbody);
 
+       if (tmp) {
+               zval_ptr_dtor(&tmp);
+       }
+
        return SUCCESS;
 }