X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=http_message_api.c;h=402d3dd4ea8e782eebe526ce121defcd42b80994;hb=30f23d359aff10b458f036226a8e10bceb0a2da9;hp=27f3d78228273ec502f2297387f60513e464043e;hpb=d5930114b227ce9c9ce71d3930291f333750c192;p=m6w6%2Fext-http diff --git a/http_message_api.c b/http_message_api.c index 27f3d78..402d3dd 100644 --- a/http_message_api.c +++ b/http_message_api.c @@ -108,19 +108,20 @@ PHP_HTTP_API void _http_message_set_info(http_message *message, http_info *info) { message->http.version = info->http.version; - switch (info->type) + switch (message->type = info->type) { case IS_HTTP_REQUEST: - message->type = HTTP_MSG_REQUEST; HTTP_INFO(message).request.url = estrdup(HTTP_INFO(info).request.url); STR_SET(HTTP_INFO(message).request.method, estrdup(HTTP_INFO(info).request.method)); - break; + break; case IS_HTTP_RESPONSE: - message->type = HTTP_MSG_RESPONSE; HTTP_INFO(message).response.code = HTTP_INFO(info).response.code; STR_SET(HTTP_INFO(message).response.status, estrdup(HTTP_INFO(info).response.status)); - break; + break; + + default: + break; } } @@ -376,6 +377,57 @@ PHP_HTTP_API void _http_message_serialize(http_message *message, char **string, phpstr_dtor(&str); } +PHP_HTTP_API http_message *_http_message_reverse(http_message *msg) +{ + int i, c; + + http_message_count(c, msg); + + if (c > 1) { + http_message *tmp = msg, **arr = ecalloc(c, sizeof(http_message *)); + + for (i = 0; i < c; ++i) { + arr[i] = tmp; + tmp = tmp->parent; + } + arr[0]->parent = NULL; + for (i = 0; i < c-1; ++i) { + arr[i+1]->parent = arr[i]; + } + + msg = arr[c-1]; + efree(arr); + } + + return msg; +} + +PHP_HTTP_API http_message *_http_message_interconnect(http_message *m1, http_message *m2) +{ + if (m1 && m2) { + int i = 0, c1, c2; + http_message *t1 = m1, *t2 = m2, *p1, *p2; + + http_message_count(c1, m1); + http_message_count(c2, m2); + + while (i++ < (c1 - c2)) { + t1 = t1->parent; + } + while (i++ <= c1) { + p1 = t1->parent; + p2 = t2->parent; + t1->parent = t2; + t2->parent = p1; + t1 = p1; + t2 = p2; + } + } else if (!m1 && m2) { + m1 = m2; + } + return m1; +} + PHP_HTTP_API void _http_message_tostruct_recursive(http_message *msg, zval *obj TSRMLS_DC) { zval strct; @@ -490,7 +542,7 @@ PHP_HTTP_API STATUS _http_message_send(http_message *message TSRMLS_DC) parts.host = estrndup(Z_STRVAL_PP(zhost), Z_STRLEN_PP(zhost)); } - http_build_url(url, &parts, NULL, &uri, NULL); + http_build_url(HTTP_URL_REPLACE, url, &parts, NULL, &uri, NULL); php_url_free(url); efree(parts.host); } else { @@ -527,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)