X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-http;a=blobdiff_plain;f=php_http_client.h;h=4008e874f8ae095e24f842d2b785466e28616de3;hp=24067a98ea8daf28ec7f83060e104a890cfccfd9;hb=refs%2Fheads%2Fv2.3.x;hpb=6cc24086f57aa1e8f4d6a2c12361635e7c24f60f diff --git a/php_http_client.h b/php_http_client.h index 24067a9..4008e87 100644 --- a/php_http_client.h +++ b/php_http_client.h @@ -6,206 +6,148 @@ | modification, are permitted provided that the conditions mentioned | | in the accompanying LICENSE file are met. | +--------------------------------------------------------------------+ - | Copyright (c) 2004-2011, Michael Wallner | + | Copyright (c) 2004-2014, Michael Wallner | +--------------------------------------------------------------------+ */ #ifndef PHP_HTTP_CLIENT_H #define PHP_HTTP_CLIENT_H -#include "php_http_message_body.h" -#include "php_http_message_parser.h" - -typedef struct php_http_client_progress_state { - struct { - double now; - double total; - } ul; - struct { - double now; - double total; - } dl; - const char *info; - unsigned started:1; - unsigned finished:1; -} php_http_client_progress_state_t; - -#define PHP_HTTP_CLIENT_PROGRESS_CALLBACK_USER 0 -#define PHP_HTTP_CLIENT_PROGRESS_CALLBACK_INTERN 1 -typedef struct php_http_client_progress_callback { - union { - zval *user; - void (*intern)(php_http_client_progress_state_t* TSRMLS_DC); - } func; - unsigned type:1; - unsigned pass_state:1; -} php_http_client_progress_callback_t; - -typedef struct php_http_client_progress { - php_http_client_progress_state_t state; - php_http_client_progress_callback_t *callback; - unsigned in_cb:1; -} php_http_client_progress_t; - -static inline void php_http_client_progress_dtor(php_http_client_progress_t *progress TSRMLS_DC) -{ - if (progress->callback) { - if (progress->callback->type == PHP_HTTP_CLIENT_PROGRESS_CALLBACK_USER) { - zval_ptr_dtor(&progress->callback->func.user); - } - efree(progress->callback); - } - memset(progress, 0, sizeof(*progress)); -} - -static inline void php_http_client_progress_notify(php_http_client_progress_t *progress TSRMLS_DC) -{ - if (progress->callback) { - zval retval; - - INIT_PZVAL(&retval); - ZVAL_NULL(&retval); - - with_error_handling(EH_NORMAL, NULL) { - switch (progress->callback->type) { - case PHP_HTTP_CLIENT_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_CLIENT_PROGRESS_CALLBACK_INTERN: - progress->callback->func.intern(progress->callback->pass_state ? &progress->state : NULL TSRMLS_CC); - break; - default: - break; - } - } end_error_handling(); - - zval_dtor(&retval); - } -} - typedef enum php_http_client_setopt_opt { - PHP_HTTP_CLIENT_OPT_SETTINGS, /* HashTable* */ - PHP_HTTP_CLIENT_OPT_PROGRESS_CALLBACK, /* php_http_client_progress_callback_t* */ - PHP_HTTP_CLIENT_OPT_COOKIES_ENABLE, /* - */ - PHP_HTTP_CLIENT_OPT_COOKIES_RESET, /* - */ - PHP_HTTP_CLIENT_OPT_COOKIES_RESET_SESSION, /* - */ - PHP_HTTP_CLIENT_OPT_COOKIES_FLUSH, /* - */ + PHP_HTTP_CLIENT_OPT_ENABLE_PIPELINING, + PHP_HTTP_CLIENT_OPT_USE_EVENTS, + PHP_HTTP_CLIENT_OPT_CONFIGURATION, } php_http_client_setopt_opt_t; typedef enum php_http_client_getopt_opt { - PHP_HTTP_CLIENT_OPT_PROGRESS_INFO, /* php_http_client_progress_t** */ - PHP_HTTP_CLIENT_OPT_TRANSFER_INFO, /* HashTable* */ + PHP_HTTP_CLIENT_OPT_PROGRESS_INFO, /* php_http_client_enqueue_t*, php_http_client_progress_state_t** */ + PHP_HTTP_CLIENT_OPT_TRANSFER_INFO, /* php_http_client_enqueue_t*, HashTable* */ + PHP_HTTP_CLIENT_OPT_AVAILABLE_OPTIONS, /* NULL, HashTable* */ + PHP_HTTP_CLIENT_OPT_AVAILABLE_CONFIGURATION,/* NULL, HashTable */ } php_http_client_getopt_opt_t; -typedef struct php_http_client *(*php_http_client_init_func_t)(struct php_http_client *h, void *arg); +typedef struct php_http_client_enqueue { + php_http_message_t *request; /* unique */ + HashTable *options; + void (*dtor)(struct php_http_client_enqueue *); + void *opaque; + struct { + zend_fcall_info fci; + zend_fcall_info_cache fcc; + } closure; +} php_http_client_enqueue_t; + +typedef struct php_http_client *(*php_http_client_init_func_t)(struct php_http_client *p, void *init_arg); typedef struct php_http_client *(*php_http_client_copy_func_t)(struct php_http_client *from, struct php_http_client *to); -typedef void (*php_http_client_dtor_func_t)(struct php_http_client *h); -typedef STATUS (*php_http_client_exec_func_t)(struct php_http_client *h, php_http_message_t *msg); -typedef STATUS (*php_http_client_reset_func_t)(struct php_http_client *h); -typedef STATUS (*php_http_client_setopt_func_t)(struct php_http_client *h, php_http_client_setopt_opt_t opt, void *arg); -typedef STATUS (*php_http_client_getopt_func_t)(struct php_http_client *h, php_http_client_getopt_opt_t opt, void *arg); +typedef void (*php_http_client_dtor_func_t)(struct php_http_client *p); +typedef void (*php_http_client_reset_func_t)(struct php_http_client *p); +typedef STATUS (*php_http_client_exec_func_t)(struct php_http_client *p); +typedef int (*php_http_client_once_func_t)(struct php_http_client *p); +typedef STATUS (*php_http_client_wait_func_t)(struct php_http_client *p, struct timeval *custom_timeout); +typedef STATUS (*php_http_client_enqueue_func_t)(struct php_http_client *p, php_http_client_enqueue_t *enqueue); +typedef STATUS (*php_http_client_dequeue_func_t)(struct php_http_client *p, php_http_client_enqueue_t *enqueue); +typedef STATUS (*php_http_client_setopt_func_t)(struct php_http_client *p, php_http_client_setopt_opt_t opt, void *arg); +typedef STATUS (*php_http_client_getopt_func_t)(struct php_http_client *h, php_http_client_getopt_opt_t opt, void *arg, void **res); typedef struct php_http_client_ops { - php_http_resource_factory_ops_t *rsrc; + php_resource_factory_ops_t *rsrc; php_http_client_init_func_t init; php_http_client_copy_func_t copy; php_http_client_dtor_func_t dtor; php_http_client_reset_func_t reset; php_http_client_exec_func_t exec; + php_http_client_wait_func_t wait; + php_http_client_once_func_t once; + php_http_client_enqueue_func_t enqueue; + php_http_client_dequeue_func_t dequeue; php_http_client_setopt_func_t setopt; php_http_client_getopt_func_t getopt; } php_http_client_ops_t; +typedef struct php_http_client_driver { + const char *name_str; + size_t name_len; + php_http_client_ops_t *client_ops; +} php_http_client_driver_t; + +PHP_HTTP_API STATUS php_http_client_driver_add(php_http_client_driver_t *driver); +PHP_HTTP_API STATUS php_http_client_driver_get(const char *name_str, size_t name_len, php_http_client_driver_t *driver); + +typedef struct php_http_client_progress_state { + struct { + double now; + double total; + } ul; + struct { + double now; + double total; + } dl; + const char *info; + unsigned started:1; + unsigned finished:1; +} php_http_client_progress_state_t; + +typedef STATUS (*php_http_client_response_callback_t)(void *arg, struct php_http_client *client, php_http_client_enqueue_t *e, php_http_message_t **response); +typedef void (*php_http_client_progress_callback_t)(void *arg, struct php_http_client *client, php_http_client_enqueue_t *e, php_http_client_progress_state_t *state); + typedef struct php_http_client { void *ctx; - php_http_resource_factory_t *rf; + php_resource_factory_t *rf; php_http_client_ops_t *ops; - php_http_message_parser_t *parser; - php_http_message_t *message; - php_http_buffer_t *buffer; + + struct { + struct { + php_http_client_response_callback_t func; + void *arg; + } response; + struct { + php_http_client_progress_callback_t func; + void *arg; + } progress; + } callback; + + zend_llist requests; + zend_llist responses; + #ifdef ZTS void ***ts; #endif } php_http_client_t; -PHP_HTTP_API php_http_client_t *php_http_client_init(php_http_client_t *h, php_http_client_ops_t *ops, php_http_resource_factory_t *rf, void *init_arg TSRMLS_DC); -PHP_HTTP_API php_http_client_t *php_http_client_copy(php_http_client_t *from, php_http_client_t *to); -PHP_HTTP_API STATUS php_http_client_exec(php_http_client_t *h, php_http_message_t *msg); -PHP_HTTP_API STATUS php_http_client_reset(php_http_client_t *h); -PHP_HTTP_API STATUS php_http_client_setopt(php_http_client_t *h, php_http_client_setopt_opt_t opt, void *arg); -PHP_HTTP_API STATUS php_http_client_getopt(php_http_client_t *h, php_http_client_getopt_opt_t opt, void *arg); -PHP_HTTP_API void php_http_client_dtor(php_http_client_t *h); -PHP_HTTP_API void php_http_client_free(php_http_client_t **h); +PHP_HTTP_API zend_class_entry *php_http_client_class_entry; typedef struct php_http_client_object { zend_object zo; + zend_object_value zv; php_http_client_t *client; + long iterator; + php_http_object_method_t *update; + php_http_object_method_t notify; } php_http_client_object_t; -extern zend_class_entry *php_http_client_class_entry; -extern zend_function_entry php_http_client_method_entry[]; - -extern zend_object_value php_http_client_object_new(zend_class_entry *ce TSRMLS_DC); -extern zend_object_value php_http_client_object_new_ex(zend_class_entry *ce, php_http_client_t *r, php_http_client_object_t **ptr TSRMLS_DC); -extern zend_object_value php_http_client_object_clone(zval *zobject TSRMLS_DC); -extern void php_http_client_object_free(void *object TSRMLS_DC); - -extern zend_object_handlers *php_http_client_get_object_handlers(void); - -extern STATUS php_http_client_object_requesthandler(php_http_client_object_t *obj, zval *this_ptr, char **meth, char **url, php_http_message_body_t **body TSRMLS_DC); -extern STATUS php_http_client_object_responsehandler(php_http_client_object_t *obj, zval *this_ptr TSRMLS_DC); - -PHP_METHOD(HttpClient, __construct); -PHP_METHOD(HttpClient, getObservers); -PHP_METHOD(HttpClient, notify); -PHP_METHOD(HttpClient, attach); -PHP_METHOD(HttpClient, detach); -PHP_METHOD(HttpClient, getProgress); -PHP_METHOD(HttpClient, getTransferInfo); -PHP_METHOD(HttpClient, setOptions); -PHP_METHOD(HttpClient, getOptions); -PHP_METHOD(HttpClient, addSslOptions); -PHP_METHOD(HttpClient, setSslOptions); -PHP_METHOD(HttpClient, getSslOptions); -PHP_METHOD(HttpClient, addCookies); -PHP_METHOD(HttpClient, getCookies); -PHP_METHOD(HttpClient, setCookies); -PHP_METHOD(HttpClient, enableCookies); -PHP_METHOD(HttpClient, resetCookies); -PHP_METHOD(HttpClient, flushCookies); -PHP_METHOD(HttpClient, send); -PHP_METHOD(HttpClient, getResponseMessage); -PHP_METHOD(HttpClient, getRawResponseMessage); -PHP_METHOD(HttpClient, getRequestMessage); -PHP_METHOD(HttpClient, getRawRequestMessage); -PHP_METHOD(HttpClient, getHistory); -PHP_METHOD(HttpClient, clearHistory); -PHP_METHOD(HttpClient, getMessageClass); -PHP_METHOD(HttpClient, setMessageClass); - -extern PHP_MINIT_FUNCTION(http_client); +PHP_HTTP_API php_http_client_t *php_http_client_init(php_http_client_t *h, php_http_client_ops_t *ops, php_resource_factory_t *rf, void *init_arg TSRMLS_DC); +PHP_HTTP_API php_http_client_t *php_http_client_copy(php_http_client_t *from, php_http_client_t *to); +PHP_HTTP_API void php_http_client_dtor(php_http_client_t *h); +PHP_HTTP_API void php_http_client_free(php_http_client_t **h); + +PHP_HTTP_API STATUS php_http_client_enqueue(php_http_client_t *h, php_http_client_enqueue_t *enqueue); +PHP_HTTP_API STATUS php_http_client_dequeue(php_http_client_t *h, php_http_message_t *request); + +PHP_HTTP_API STATUS php_http_client_wait(php_http_client_t *h, struct timeval *custom_timeout); +PHP_HTTP_API int php_http_client_once(php_http_client_t *h); + +PHP_HTTP_API STATUS php_http_client_exec(php_http_client_t *h); +PHP_HTTP_API void php_http_client_reset(php_http_client_t *h); + +PHP_HTTP_API STATUS php_http_client_setopt(php_http_client_t *h, php_http_client_setopt_opt_t opt, void *arg); +PHP_HTTP_API STATUS php_http_client_getopt(php_http_client_t *h, php_http_client_getopt_opt_t opt, void *arg, void *res_ptr); + +typedef int (*php_http_client_enqueue_cmp_func_t)(php_http_client_enqueue_t *cmp, void *arg); +/* compare with request message pointer if compare_func is NULL */ +PHP_HTTP_API php_http_client_enqueue_t *php_http_client_enqueued(php_http_client_t *h, void *compare_arg, php_http_client_enqueue_cmp_func_t compare_func); + +PHP_MINIT_FUNCTION(http_client); +PHP_MSHUTDOWN_FUNCTION(http_client); #endif @@ -217,4 +159,3 @@ extern PHP_MINIT_FUNCTION(http_client); * vim600: noet sw=4 ts=4 fdm=marker * vim<600: noet sw=4 ts=4 */ -