| modification, are permitted provided that the conditions mentioned |
| in the accompanying LICENSE file are met. |
+--------------------------------------------------------------------+
- | Copyright (c) 2004-2010, Michael Wallner <mike@php.net> |
+ | Copyright (c) 2004-2011, Michael Wallner <mike@php.net> |
+--------------------------------------------------------------------+
*/
-/* $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 {
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) {
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();
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, /* - */
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;
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;
#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);