X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=php_http_message.c;h=04e87060445a5d19b5af91d39242d91c8d030450;hb=287edcbfb698ff402588f7057dae0bc994d6e8e4;hp=f1169d01b8418412f9e55dd7f935801a8aac255c;hpb=78481a961e262e97e1592ff997e384031b6f6d2c;p=m6w6%2Fext-http diff --git a/php_http_message.c b/php_http_message.c index f1169d0..04e8706 100644 --- a/php_http_message.c +++ b/php_http_message.c @@ -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; }