X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=http_message_api.c;h=402d3dd4ea8e782eebe526ce121defcd42b80994;hb=fc720d489914964ae837d7acbcdf9dc74b5a0f29;hp=399650ea591975a4fdf998ee686e11923113e359;hpb=79b54baf2c7fa5b37a4ed96a21d29c3574c1270b;p=m6w6%2Fext-http diff --git a/http_message_api.c b/http_message_api.c index 399650e..402d3dd 100644 --- a/http_message_api.c +++ b/http_message_api.c @@ -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)