X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-http;a=blobdiff_plain;f=http_message_api.c;h=59fb327f25acc9276547b6270a7de834d5395b0d;hp=915469248187e0119070235d60d6956883545bea;hb=669d2e6a8bdc642b6b52693f4593f199ddd7e8d2;hpb=b22d34f60b6694a8fed24cff66a28fd638309928 diff --git a/http_message_api.c b/http_message_api.c index 9154692..59fb327 100644 --- a/http_message_api.c +++ b/http_message_api.c @@ -137,7 +137,7 @@ PHP_HTTP_API http_message *_http_message_parse_ex(http_message *msg, const char msg = http_message_init_rel(msg, 0); - if (SUCCESS != http_parse_headers_cb(message, &msg->hdrs, 1, (http_info_callback) http_message_info_callback, (void **) &msg)) { + if (SUCCESS != http_parse_headers_cb(message, &msg->hdrs, 1, (http_info_callback) http_message_info_callback, (void *) &msg)) { if (free_msg) { http_message_free(&msg); } @@ -250,7 +250,7 @@ PHP_HTTP_API http_message *_http_message_parse_ex(http_message *msg, const char ZVAL_ADDREF(c); zend_hash_add(&msg->hdrs, "X-Original-Content-Encoding", sizeof("X-Original-Content-Encoding"), (void *) &c, sizeof(zval *), NULL); zend_hash_del(&msg->hdrs, "Content-Encoding", sizeof("Content-Encoding")); - if (SUCCESS == zend_hash_find(&msg->hdrs, "Content-Length", sizeof("Content-Length"), (void **) &original_len)) { + if (SUCCESS == zend_hash_find(&msg->hdrs, "Content-Length", sizeof("Content-Length"), (void *) &original_len)) { ZVAL_ADDREF(*original_len); zend_hash_add(&msg->hdrs, "X-Original-Content-Length", sizeof("X-Original-Content-Length"), (void *) original_len, sizeof(zval *), NULL); zend_hash_update(&msg->hdrs, "Content-Length", sizeof("Content-Length"), (void *) &len, sizeof(zval *), NULL); @@ -528,7 +528,7 @@ PHP_HTTP_API STATUS _http_message_send(http_message *message TSRMLS_DC) add_assoc_zval(&options, "headers", &headers); /* check host header */ - if (SUCCESS == zend_hash_find(&message->hdrs, "Host", sizeof("Host"), (void **) &zhost)) { + if (SUCCESS == zend_hash_find(&message->hdrs, "Host", sizeof("Host"), (void *) &zhost)) { char *colon = NULL; php_url parts, *url = php_url_parse(message->http.info.request.url); @@ -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)