back to dev
[m6w6/ext-http] / php_http_client.h
index 93a910c3737e63255d3143d645b6b38e42778322..4008e874f8ae095e24f842d2b785466e28616de3 100644 (file)
     | modification, are permitted provided that the conditions mentioned |
     | in the accompanying LICENSE file are met.                          |
     +--------------------------------------------------------------------+
-    | Copyright (c) 2004-2011, Michael Wallner <mike@php.net>            |
+    | Copyright (c) 2004-2014, Michael Wallner <mike@php.net>            |
     +--------------------------------------------------------------------+
 */
 
 #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, &param TSRMLS_CC);
-                                               progress->in_cb = 0;
-
-                                               zval_ptr_dtor(&param);
-                                       } 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_new_t create_object;
-       zend_class_entry *(*class_entry)(void);
 } 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;
 
-zend_object_value php_http_client_object_new(zend_class_entry *ce TSRMLS_DC);
-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);
-zend_object_value php_http_client_object_clone(zval *zobject TSRMLS_DC);
-void php_http_client_object_free(void *object TSRMLS_DC);
-
-zend_class_entry *php_http_client_get_class_entry(void);
-zend_object_handlers *php_http_client_get_object_handlers(void);
-
-STATUS php_http_client_object_handle_request(zval *zclient, zval **zreq TSRMLS_DC);
-STATUS php_http_client_object_handle_response(zval *zclient TSRMLS_DC);
-
-void php_http_client_options_set(zval *this_ptr, zval *opts TSRMLS_DC);
-void php_http_client_options_set_subr(zval *this_ptr, char *key, size_t len, zval *opts, int overwrite TSRMLS_DC);
-void php_http_client_options_get_subr(zval *this_ptr, char *key, size_t len, zval *return_value 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, setRequest);
-PHP_METHOD(HttpClient, getRequest);
-PHP_METHOD(HttpClient, send);
-PHP_METHOD(HttpClient, request);
-PHP_METHOD(HttpClient, getResponseMessage);
-PHP_METHOD(HttpClient, getRequestMessage);
-PHP_METHOD(HttpClient, getHistory);
-PHP_METHOD(HttpClient, clearHistory);
-PHP_METHOD(HttpClient, getResponseMessageClass);
-PHP_METHOD(HttpClient, setResponseMessageClass);
+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
 
@@ -222,4 +159,3 @@ PHP_MINIT_FUNCTION(http_client);
  * vim600: noet sw=4 ts=4 fdm=marker
  * vim<600: noet sw=4 ts=4
  */
-