X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-http;a=blobdiff_plain;f=php_http_request.h;h=6c0c0c9469cdebabe41b7d94247c66251d322d95;hp=b8486123a5d2f48ba7dcb7a6c502c86082115c63;hb=4d68865693332389b875e4466f8b5368c0876e15;hpb=df06e2dbf48a3b0d96f2c62071c1b5fc907a98d0 diff --git a/php_http_request.h b/php_http_request.h index b848612..6c0c0c9 100644 --- a/php_http_request.h +++ b/php_http_request.h @@ -6,18 +6,16 @@ | modification, are permitted provided that the conditions mentioned | | in the accompanying LICENSE file are met. | +--------------------------------------------------------------------+ - | Copyright (c) 2004-2010, Michael Wallner | + | Copyright (c) 2004-2011, Michael Wallner | +--------------------------------------------------------------------+ */ -/* $Id: php_http_request_api.h 292841 2009-12-31 08:48:57Z mike $ */ - #ifndef PHP_HTTP_REQUEST_H #define PHP_HTTP_REQUEST_H +#include "php_http_request_method.h" #include "php_http_message_body.h" #include "php_http_message_parser.h" -#include "php_http_request_method.h" typedef struct php_http_request_progress_state { struct { @@ -28,17 +26,39 @@ typedef struct php_http_request_progress_state { double now; double total; } dl; + const char *info; unsigned started:1; unsigned finished:1; } php_http_request_progress_state_t; +#define PHP_HTTP_REQUEST_PROGRESS_CALLBACK_USER 0 +#define PHP_HTTP_REQUEST_PROGRESS_CALLBACK_INTERN 1 +typedef struct php_http_request_progress_callback { + union { + zval *user; + void (*intern)(php_http_request_progress_state_t* TSRMLS_DC); + } func; + unsigned type:1; + unsigned pass_state:1; +} php_http_request_progress_callback_t; + typedef struct php_http_request_progress { php_http_request_progress_state_t state; - zval *callback; + php_http_request_progress_callback_t *callback; unsigned in_cb:1; - unsigned pass_state:1; } php_http_request_progress_t; +static inline void php_http_request_progress_dtor(php_http_request_progress_t *progress TSRMLS_DC) +{ + if (progress->callback) { + if (progress->callback->type == PHP_HTTP_REQUEST_PROGRESS_CALLBACK_USER) { + zval_ptr_dtor(&progress->callback->func.user); + } + efree(progress->callback); + } + memset(progress, 0, sizeof(*progress)); +} + static inline void php_http_request_progress_notify(php_http_request_progress_t *progress TSRMLS_DC) { if (progress->callback) { @@ -48,27 +68,37 @@ static inline void php_http_request_progress_notify(php_http_request_progress_t ZVAL_NULL(&retval); with_error_handling(EH_NORMAL, NULL) { - if (progress->pass_state) { - zval *param; - - MAKE_STD_ZVAL(param); - array_init(param); - add_assoc_bool(param, "started", progress->state.started); - add_assoc_bool(param, "finished", progress->state.finished); - add_assoc_double(param, "dltotal", progress->state.dl.total); - add_assoc_double(param, "dlnow", progress->state.dl.now); - add_assoc_double(param, "ultotal", progress->state.ul.total); - add_assoc_double(param, "ulnow", progress->state.ul.now); - - progress->in_cb = 1; - call_user_function(EG(function_table), NULL, progress->callback, &retval, 1, ¶m TSRMLS_CC); - progress->in_cb = 0; - - zval_ptr_dtor(¶m); - } else { - progress->in_cb = 1; - call_user_function(EG(function_table), NULL, progress->callback, &retval, 0, NULL TSRMLS_CC); - progress->in_cb = 0; + switch (progress->callback->type) { + case PHP_HTTP_REQUEST_PROGRESS_CALLBACK_USER: + if (progress->callback->pass_state) { + zval *param; + + MAKE_STD_ZVAL(param); + array_init(param); + add_assoc_bool(param, "started", progress->state.started); + add_assoc_bool(param, "finished", progress->state.finished); + add_assoc_string(param, "info", estrdup(progress->state.info), 0); + add_assoc_double(param, "dltotal", progress->state.dl.total); + add_assoc_double(param, "dlnow", progress->state.dl.now); + add_assoc_double(param, "ultotal", progress->state.ul.total); + add_assoc_double(param, "ulnow", progress->state.ul.now); + + progress->in_cb = 1; + call_user_function(EG(function_table), NULL, progress->callback->func.user, &retval, 1, ¶m TSRMLS_CC); + progress->in_cb = 0; + + zval_ptr_dtor(¶m); + } else { + progress->in_cb = 1; + call_user_function(EG(function_table), NULL, progress->callback->func.user, &retval, 0, NULL TSRMLS_CC); + progress->in_cb = 0; + } + break; + case PHP_HTTP_REQUEST_PROGRESS_CALLBACK_INTERN: + progress->callback->func.intern(progress->callback->pass_state ? &progress->state : NULL TSRMLS_CC); + break; + default: + break; } } end_error_handling(); @@ -78,8 +108,7 @@ static inline void php_http_request_progress_notify(php_http_request_progress_t typedef enum php_http_request_setopt_opt { PHP_HTTP_REQUEST_OPT_SETTINGS, /* HashTable* */ - PHP_HTTP_REQUEST_OPT_PROGRESS_CALLBACK, /* zval* */ - PHP_HTTP_REQUEST_OPT_PROGRESS_CALLBACK_WANTS_STATE, /* int* */ + PHP_HTTP_REQUEST_OPT_PROGRESS_CALLBACK, /* php_http_request_progress_callback_t* */ PHP_HTTP_REQUEST_OPT_COOKIES_ENABLE, /* - */ PHP_HTTP_REQUEST_OPT_COOKIES_RESET, /* - */ PHP_HTTP_REQUEST_OPT_COOKIES_RESET_SESSION, /* - */ @@ -102,6 +131,7 @@ typedef STATUS (*php_http_request_setopt_func_t)(php_http_request_t *h, php_http typedef STATUS (*php_http_request_getopt_func_t)(php_http_request_t *h, php_http_request_getopt_opt_t opt, void *arg); typedef struct php_http_request_ops { + php_http_resource_factory_ops_t *rsrc; php_http_request_init_func_t init; php_http_request_copy_func_t copy; php_http_request_dtor_func_t dtor; @@ -115,16 +145,18 @@ PHP_HTTP_API php_http_request_ops_t *php_http_request_get_default_ops(TSRMLS_D); struct php_http_request { void *ctx; + php_http_resource_factory_t *rf; php_http_request_ops_t *ops; php_http_message_parser_t *parser; php_http_message_t *message; php_http_buffer_t *buffer; + zval *persistent_handle_id; #ifdef ZTS void ***ts; #endif }; -PHP_HTTP_API php_http_request_t *php_http_request_init(php_http_request_t *h, php_http_request_ops_t *ops, void *init_arg TSRMLS_DC); +PHP_HTTP_API php_http_request_t *php_http_request_init(php_http_request_t *h, php_http_request_ops_t *ops, php_http_resource_factory_t *rf, void *init_arg TSRMLS_DC); PHP_HTTP_API php_http_request_t *php_http_request_copy(php_http_request_t *from, php_http_request_t *to); PHP_HTTP_API STATUS php_http_request_exec(php_http_request_t *h, php_http_request_method_t meth, const char *url, php_http_message_body_t *body); PHP_HTTP_API STATUS php_http_request_reset(php_http_request_t *h);