X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=php_http_request.h;h=d535dc4998be130c1b02f56a18dda9b98f4021da;hb=f2f85ecef84a1dfc7982f9fd9b10f5a0dadb2540;hp=b8486123a5d2f48ba7dcb7a6c502c86082115c63;hpb=df06e2dbf48a3b0d96f2c62071c1b5fc907a98d0;p=m6w6%2Fext-http diff --git a/php_http_request.h b/php_http_request.h index b848612..d535dc4 100644 --- a/php_http_request.h +++ b/php_http_request.h @@ -6,18 +6,15 @@ | 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_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 +25,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 +67,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 +107,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, /* - */ @@ -96,12 +124,13 @@ typedef struct php_http_request php_http_request_t; typedef php_http_request_t *(*php_http_request_init_func_t)(php_http_request_t *h, void *arg); typedef php_http_request_t *(*php_http_request_copy_func_t)(php_http_request_t *from, php_http_request_t *to); typedef void (*php_http_request_dtor_func_t)(php_http_request_t *h); -typedef STATUS (*php_http_request_exec_func_t)(php_http_request_t *h, php_http_request_method_t meth, const char *url, php_http_message_body_t *body); +typedef STATUS (*php_http_request_exec_func_t)(php_http_request_t *h, const char *meth, const char *url, php_http_message_body_t *body); typedef STATUS (*php_http_request_reset_func_t)(php_http_request_t *h); typedef STATUS (*php_http_request_setopt_func_t)(php_http_request_t *h, php_http_request_setopt_opt_t opt, void *arg); 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,6 +144,7 @@ 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; @@ -124,9 +154,9 @@ struct php_http_request { #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_exec(php_http_request_t *h, const char *meth, const char *url, php_http_message_body_t *body); PHP_HTTP_API STATUS php_http_request_reset(php_http_request_t *h); PHP_HTTP_API STATUS php_http_request_setopt(php_http_request_t *h, php_http_request_setopt_opt_t opt, void *arg); PHP_HTTP_API STATUS php_http_request_getopt(php_http_request_t *h, php_http_request_getopt_opt_t opt, void *arg); @@ -146,7 +176,7 @@ extern zend_object_value php_http_request_object_new_ex(zend_class_entry *ce, ph extern zend_object_value php_http_request_object_clone(zval *zobject TSRMLS_DC); extern void php_http_request_object_free(void *object TSRMLS_DC); -extern STATUS php_http_request_object_requesthandler(php_http_request_object_t *obj, zval *this_ptr, php_http_request_method_t *meth, char **url, php_http_message_body_t **body TSRMLS_DC); +extern STATUS php_http_request_object_requesthandler(php_http_request_object_t *obj, zval *this_ptr, char **meth, char **url, php_http_message_body_t **body TSRMLS_DC); extern STATUS php_http_request_object_responsehandler(php_http_request_object_t *obj, zval *this_ptr TSRMLS_DC); PHP_METHOD(HttpRequest, __construct);