X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-http;a=blobdiff_plain;f=php_http_request.h;h=6c0c0c9469cdebabe41b7d94247c66251d322d95;hp=543271563b215c41fa4cbaaed17add2949c2839d;hb=4d68865693332389b875e4466f8b5368c0876e15;hpb=c5c580f24e24e8032a0554a2e39e38c496144bc2 diff --git a/php_http_request.h b/php_http_request.h index 5432715..6c0c0c9 100644 --- a/php_http_request.h +++ b/php_http_request.h @@ -6,133 +6,188 @@ | 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_request_pool.h" - -extern PHP_MINIT_FUNCTION(http_request); -extern PHP_MSHUTDOWN_FUNCTION(http_request); - -typedef struct php_http_request_progress_state_counter { - double now; - double total; -} php_http_request_progress_state_counter_t; +#include "php_http_message_body.h" +#include "php_http_message_parser.h" typedef struct php_http_request_progress_state { - php_http_request_progress_state_counter_t ul; - php_http_request_progress_state_counter_t dl; -} php_http_request_progress_state_t; - -typedef struct php_http_request { - CURL *ch; - char *url; - php_http_request_method_t meth; - php_http_message_body_t *body; - struct { - php_http_message_parser_t *ctx; - php_http_message_t *msg; - php_http_buffer_t *buf; - } parser; - struct { - php_http_buffer_t cookies; - HashTable options; - struct curl_slist *headers; - } _cache; - + double now; + double total; + } ul; struct { - uint count; - double delay; - } _retry; - - struct { - struct { - struct { - double now; - double total; - } ul; - struct { - double now; - double total; - } dl; - } state; - zval *callback; - unsigned in_cb:1; - } _progress; - -#ifdef ZTS - void ***ts; -#endif - -} php_http_request_t; - -/* CURLOPT_PRIVATE storage living as long as a CURL handle */ -typedef struct php_http_request_storage { - char *url; - char *cookiestore; - char errorbuffer[CURL_ERROR_SIZE]; -} php_http_request_storage_t; - + double now; + double total; + } dl; + const char *info; + unsigned started:1; + unsigned finished:1; +} php_http_request_progress_state_t; -static inline php_http_request_storage_t *php_http_request_storage_get(CURL *ch) +#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; + php_http_request_progress_callback_t *callback; + unsigned in_cb:1; +} php_http_request_progress_t; + +static inline void php_http_request_progress_dtor(php_http_request_progress_t *progress TSRMLS_DC) { - php_http_request_storage_t *st = NULL; - curl_easy_getinfo(ch, CURLINFO_PRIVATE, &st); - return st; + 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)); } -PHP_HTTP_API CURL *php_http_curl_init(CURL *ch, php_http_request_t *request TSRMLS_DC); -PHP_HTTP_API void php_http_curl_free(CURL **ch TSRMLS_DC); -PHP_HTTP_API CURL *php_http_curl_copy(CURL *ch TSRMLS_DC); - -#define PHP_HTTP_CHECK_CURL_INIT(ch, init, action) \ - if ((!(ch)) && (!((ch) = init))) { \ - php_http_error(HE_WARNING, PHP_HTTP_E_REQUEST, "Could not initialize curl"); \ - action; \ +static inline void php_http_request_progress_notify(php_http_request_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_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(); + + zval_dtor(&retval); } +} +typedef enum php_http_request_setopt_opt { + PHP_HTTP_REQUEST_OPT_SETTINGS, /* HashTable* */ + 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, /* - */ + PHP_HTTP_REQUEST_OPT_COOKIES_FLUSH, /* - */ +} php_http_request_setopt_opt_t; + +typedef enum php_http_request_getopt_opt { + PHP_HTTP_REQUEST_OPT_PROGRESS_INFO, /* php_http_request_progress_t** */ + PHP_HTTP_REQUEST_OPT_TRANSFER_INFO, /* HashTable* */ +} php_http_request_getopt_opt_t; + +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_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; + php_http_request_reset_func_t reset; + php_http_request_exec_func_t exec; + php_http_request_setopt_func_t setopt; + php_http_request_getopt_func_t getopt; +} php_http_request_ops_t; + +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 *request, CURL *ch, php_http_request_method_t meth, const char *url TSRMLS_DC); -PHP_HTTP_API void php_http_request_dtor(php_http_request_t *request); -PHP_HTTP_API void php_http_request_free(php_http_request_t **request); -PHP_HTTP_API void php_http_request_reset(php_http_request_t *r); -PHP_HTTP_API STATUS php_http_request_enable_cookies(php_http_request_t *request); -PHP_HTTP_API STATUS php_http_request_reset_cookies(php_http_request_t *request, int session_only); -PHP_HTTP_API STATUS php_http_request_flush_cookies(php_http_request_t *request); -PHP_HTTP_API void php_http_request_defaults(php_http_request_t *request); -PHP_HTTP_API STATUS php_http_request_prepare(php_http_request_t *request, HashTable *options); -PHP_HTTP_API void php_http_request_exec(php_http_request_t *request); -PHP_HTTP_API void php_http_request_info(php_http_request_t *request, HashTable *info); -PHP_HTTP_API void php_http_request_set_progress_callback(php_http_request_t *request, zval *cb); - +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); +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); +PHP_HTTP_API void php_http_request_dtor(php_http_request_t *h); +PHP_HTTP_API void php_http_request_free(php_http_request_t **h); typedef struct php_http_request_object { zend_object zo; php_http_request_t *request; - php_http_request_pool_t *pool; - php_http_request_datashare_t *share; } php_http_request_object_t; extern zend_class_entry *php_http_request_class_entry; extern zend_function_entry php_http_request_method_entry[]; extern zend_object_value php_http_request_object_new(zend_class_entry *ce TSRMLS_DC); -extern zend_object_value php_http_request_object_new_ex(zend_class_entry *ce, CURL *ch, php_http_request_object_t **ptr TSRMLS_DC); +extern zend_object_value php_http_request_object_new_ex(zend_class_entry *ce, php_http_request_t *r, php_http_request_object_t **ptr TSRMLS_DC); 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 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_responsehandler(php_http_request_object_t *obj, zval *this_ptr TSRMLS_DC); PHP_METHOD(HttpRequest, __construct); +PHP_METHOD(HttpRequest, getObservers); +PHP_METHOD(HttpRequest, notify); +PHP_METHOD(HttpRequest, attach); +PHP_METHOD(HttpRequest, detach); +PHP_METHOD(HttpRequest, getProgress); +PHP_METHOD(HttpRequest, getTransferInfo); PHP_METHOD(HttpRequest, setOptions); PHP_METHOD(HttpRequest, getOptions); PHP_METHOD(HttpRequest, addSslOptions); @@ -166,7 +221,6 @@ PHP_METHOD(HttpRequest, getResponseCookies); PHP_METHOD(HttpRequest, getResponseCode); PHP_METHOD(HttpRequest, getResponseStatus); PHP_METHOD(HttpRequest, getResponseBody); -PHP_METHOD(HttpRequest, getResponseInfo); PHP_METHOD(HttpRequest, getResponseMessage); PHP_METHOD(HttpRequest, getRawResponseMessage); PHP_METHOD(HttpRequest, getRequestMessage); @@ -176,6 +230,8 @@ PHP_METHOD(HttpRequest, clearHistory); PHP_METHOD(HttpRequest, getMessageClass); PHP_METHOD(HttpRequest, setMessageClass); +extern PHP_MINIT_FUNCTION(http_request); + #endif /*