- unroll http_message_dup()
[m6w6/ext-http] / http_message_api.c
index 399650ea591975a4fdf998ee686e11923113e359..402d3dd4ea8e782eebe526ce121defcd42b80994 100644 (file)
@@ -404,9 +404,7 @@ PHP_HTTP_API http_message *_http_message_reverse(http_message *msg)
 
 PHP_HTTP_API http_message *_http_message_interconnect(http_message *m1, http_message *m2)
 {
-       if (!m1) {
-               return NULL;
-       } else if (m2) {
+       if (m1 && m2) {
                int i = 0, c1, c2;
                http_message *t1 = m1, *t2 = m2, *p1, *p2;
                
@@ -424,6 +422,8 @@ PHP_HTTP_API http_message *_http_message_interconnect(http_message *m1, http_mes
                        t1 = p1;
                        t2 = p2;
                }
+       } else if (!m1 && m2) {
+               m1 = m2;
        }
        return m1;
 }
@@ -579,19 +579,35 @@ PHP_HTTP_API STATUS _http_message_send(http_message *message TSRMLS_DC)
        return rs;
 }
 
-PHP_HTTP_API http_message *_http_message_dup(http_message *msg TSRMLS_DC)
+PHP_HTTP_API http_message *_http_message_dup(http_message *orig TSRMLS_DC)
 {
-       /*
-        * TODO: unroll
-        */
-       http_message *new;
-       char *serialized_data;
-       size_t serialized_length;
-
-       http_message_serialize(msg, &serialized_data, &serialized_length);
-       new = http_message_parse(serialized_data, serialized_length);
-       efree(serialized_data);
-       return new;
+       http_message *temp, *copy = NULL;
+       http_info info;
+       
+       if (orig) {
+               info.type = orig->type;
+               info.http = orig->http;
+               
+               copy = temp = http_message_new();
+               http_message_set_info(temp, &info);
+               zend_hash_copy(&temp->hdrs, &orig->hdrs, (copy_ctor_func_t) zval_add_ref, NULL, sizeof(zval *));
+               phpstr_append(&temp->body, orig->body.data, orig->body.used);
+       
+               while (orig->parent) {
+                       info.type = orig->parent->type;
+                       info.http = orig->parent->http;
+               
+                       temp->parent = http_message_new();
+                       http_message_set_info(temp->parent, &info);
+                       zend_hash_copy(&temp->parent->hdrs, &orig->parent->hdrs, (copy_ctor_func_t) zval_add_ref, NULL, sizeof(zval *));
+                       phpstr_append(&temp->parent->body, orig->parent->body.data, orig->parent->body.used);
+               
+                       temp = temp->parent;
+                       orig = orig->parent;
+               }
+       }
+       
+       return copy;
 }
 
 PHP_HTTP_API void _http_message_dtor(http_message *message)