X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=php_http_message.c;h=04e87060445a5d19b5af91d39242d91c8d030450;hb=287edcbfb698ff402588f7057dae0bc994d6e8e4;hp=f8b3a4d6a67bcf60efabb352a0d0854564fb3699;hpb=bd80b17b026a00a254ee8693cd7bacf1ebdec4cf;p=m6w6%2Fext-http diff --git a/php_http_message.c b/php_http_message.c index f8b3a4d..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; @@ -823,13 +848,7 @@ static void php_http_message_object_prophandler_get_body(php_http_message_object } } static void php_http_message_object_prophandler_set_body(php_http_message_object_t *obj, zval *value TSRMLS_DC) { - if (Z_TYPE_P(value) == IS_OBJECT && instanceof_function(Z_OBJCE_P(value), php_http_message_body_get_class_entry() TSRMLS_CC)) { - if (obj->body.handle) { - zend_objects_store_del_ref_by_handle(obj->body.handle TSRMLS_CC); - } - Z_OBJ_ADDREF_P(value); - obj->body = Z_OBJVAL_P(value); - } + php_http_message_object_set_body(obj, value TSRMLS_CC); } static void php_http_message_object_prophandler_get_parent_message(php_http_message_object_t *obj, zval *return_value TSRMLS_DC) { if (obj->message->parent) { @@ -982,6 +1001,68 @@ 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 = NULL; + php_stream *s; + zend_object_value ov; + php_http_message_body_t *body; + php_http_message_body_object_t *body_obj; + + switch (Z_TYPE_P(zbody)) { + case IS_RESOURCE: + php_stream_from_zval_no_verify(s, &zbody); + if (!s) { + php_http_error(HE_THROW, PHP_HTTP_E_CLIENT, "not a valid stream resource"); + return FAILURE; + } + + 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_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(tmp); + ZVAL_OBJVAL(tmp, ov, 0); + zbody = tmp; + break; + + case IS_OBJECT: + if (instanceof_function(Z_OBJCE_P(zbody), php_http_message_body_get_class_entry() TSRMLS_CC)) { + Z_OBJ_ADDREF_P(zbody); + break; + } + /* no break */ + + default: + tmp = php_http_ztyp(IS_STRING, zbody); + 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; + + } + + body_obj = zend_object_store_get_object(zbody TSRMLS_CC); + + if (msg_obj->body.handle) { + zend_objects_store_del_ref_by_handle(msg_obj->body.handle TSRMLS_CC); + php_http_message_body_dtor(&msg_obj->message->body); + } + + 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; +} + zend_object_value php_http_message_object_new(zend_class_entry *ce TSRMLS_DC) { return php_http_message_object_new_ex(ce, NULL, NULL TSRMLS_CC); @@ -1257,11 +1338,7 @@ PHP_METHOD(HttpMessage, setBody) if (!obj->message) { obj->message = php_http_message_init(NULL, 0 TSRMLS_CC); } - - php_http_message_body_dtor(&obj->message->body); - php_http_message_body_copy(body_obj->body, &obj->message->body, 0); - Z_OBJ_ADDREF_P(zbody); - obj->body = Z_OBJVAL_P(zbody); + php_http_message_object_prophandler_set_body(obj, zbody TSRMLS_CC); } RETVAL_ZVAL(getThis(), 1, 0); }