push a load of changes before holidays
[m6w6/ext-http] / php_http_request_pool.h
index f7cedb66e37cf2640ffc0d95149e9ae3b87149fd..f75c01dde3801282cd99e937d8d978c7f2bd5fe6 100644 (file)
@@ -2,51 +2,69 @@
 #ifndef PHP_HTTP_REQUESTPOOL_H
 #define PHP_HTTP_REQUESTPOOL_H
 
-struct php_http_request_pool_globals {
-       void *event_base;
-};
+#include "php_http_request.h"
 
-typedef struct php_http_request_pool {
-       CURLM *ch;
-       zend_llist finished;
-       zend_llist handles;
-       int unfinished; /* int because of curl_multi_perform() */
-#ifdef ZTS
-       void ***ts;
-#endif
-#ifdef PHP_HTTP_HAVE_EVENT
-       struct event *timeout;
-       unsigned useevents:1;
-       unsigned runsocket:1;
-#endif
-} php_http_request_pool_t;
+typedef enum php_http_request_pool_setopt_opt {
+       PHP_HTTP_REQUEST_POOL_OPT_ENABLE_PIPELINING,
+       PHP_HTTP_REQUEST_POOL_OPT_USE_EVENTS,
+} php_http_request_pool_setopt_opt_t;
 
-typedef int (*php_http_request_pool_apply_func_t)(php_http_request_pool_t *pool, zval *request);
-typedef int (*php_http_request_pool_apply_with_arg_func_t)(php_http_request_pool_t *pool, zval *request, void *arg);
+typedef struct php_http_request_pool php_http_request_pool_t;
 
-#ifdef PHP_HTTP_HAVE_EVENT
-PHP_RINIT_FUNCTION(php_http_request_pool);
-#endif
+typedef php_http_request_pool_t *(*php_http_request_pool_init_func_t)(php_http_request_pool_t *p, void *arg);
+typedef php_http_request_pool_t *(*php_http_request_pool_copy_func_t)(php_http_request_pool_t *from, php_http_request_pool_t *to);
+typedef void (*php_http_request_pool_dtor_func_t)(php_http_request_pool_t *p);
+typedef void (*php_http_request_pool_reset_func_t)(php_http_request_pool_t *p);
+typedef STATUS (*php_http_request_pool_exec_func_t)(php_http_request_pool_t *p);
+typedef STATUS (*php_http_request_pool_wait_func_t)(php_http_request_pool_t *p, struct timeval *custom_timeout);
+typedef int (*php_http_request_pool_once_func_t)(php_http_request_pool_t *p);
+typedef STATUS (*php_http_request_pool_attach_func_t)(php_http_request_pool_t *p, php_http_request_t *r, php_http_request_method_t m, const char *url, php_http_message_body_t *body);
+typedef STATUS (*php_http_request_pool_detach_func_t)(php_http_request_pool_t *p, php_http_request_t *r);
+typedef STATUS (*php_http_request_pool_setopt_func_t)(php_http_request_pool_t *p, php_http_request_pool_setopt_opt_t opt, void *arg);
 
-extern struct timeval *php_http_request_pool_timeout(php_http_request_pool_t *pool, struct timeval *timeout);
-extern void php_http_request_pool_responsehandler(php_http_request_pool_t *pool);
-extern int php_http_request_pool_apply_responsehandler(php_http_request_pool_t *pool, zval *req, void *ch);
+typedef struct php_http_request_pool_ops {
+       php_http_request_pool_init_func_t init;
+       php_http_request_pool_copy_func_t copy;
+       php_http_request_pool_dtor_func_t dtor;
+       php_http_request_pool_reset_func_t reset;
+       php_http_request_pool_exec_func_t exec;
+       php_http_request_pool_wait_func_t wait;
+       php_http_request_pool_once_func_t once;
+       php_http_request_pool_attach_func_t attach;
+       php_http_request_pool_detach_func_t detach;
+       php_http_request_pool_setopt_func_t setopt;
+} php_http_request_pool_ops_t;
 
-PHP_HTTP_API php_http_request_pool_t *php_http_request_pool_init(php_http_request_pool_t *pool TSRMLS_DC);
-PHP_HTTP_API STATUS php_http_request_pool_attach(php_http_request_pool_t *pool, zval *request);
-PHP_HTTP_API STATUS php_http_request_pool_detach(php_http_request_pool_t *pool, zval *request);
-PHP_HTTP_API void php_http_request_pool_apply(php_http_request_pool_t *pool, php_http_request_pool_apply_func_t cb);
-PHP_HTTP_API void php_http_request_pool_apply_with_arg(php_http_request_pool_t *pool, php_http_request_pool_apply_with_arg_func_t cb, void *arg);
-PHP_HTTP_API void php_http_request_pool_detach_all(php_http_request_pool_t *pool);
-PHP_HTTP_API STATUS php_http_request_pool_send(php_http_request_pool_t *pool);
-PHP_HTTP_API STATUS php_http_request_pool_select(php_http_request_pool_t *pool, struct timeval *custom_timeout);
-PHP_HTTP_API int php_http_request_pool_perform(php_http_request_pool_t *pool);
+struct php_http_request_pool {
+       void *ctx;
+       php_http_request_pool_ops_t *ops;
+
+       struct {
+               zend_llist attached;
+               zend_llist finished;
+       } requests;
+
+#ifdef ZTS
+       void ***ts;
+#endif
+};
+
+PHP_HTTP_API php_http_request_pool_t *php_http_request_pool_init(php_http_request_pool_t *pool, php_http_request_pool_ops_t *ops, void *init_arg TSRMLS_DC);
+PHP_HTTP_API php_http_request_pool_t *php_http_request_pool_copy(php_http_request_pool_t *from, php_http_request_pool_t *to);
 PHP_HTTP_API void php_http_request_pool_dtor(php_http_request_pool_t *pool);
 PHP_HTTP_API void php_http_request_pool_free(php_http_request_pool_t **pool);
+PHP_HTTP_API void php_http_request_pool_reset(php_http_request_pool_t *pool);
+PHP_HTTP_API STATUS php_http_request_pool_exec(php_http_request_pool_t *pool);
+PHP_HTTP_API STATUS php_http_request_pool_wait(php_http_request_pool_t *pool, struct timeval *custom_timeout);
+PHP_HTTP_API STATUS php_http_request_pool_once(php_http_request_pool_t *pool);
+PHP_HTTP_API STATUS php_http_request_pool_attach(php_http_request_pool_t *pool, zval *request);
+PHP_HTTP_API STATUS php_http_request_pool_detach(php_http_request_pool_t *pool, zval *request);
+PHP_HTTP_API STATUS php_http_request_pool_setopt(php_http_request_pool_t *pool, php_http_request_pool_setopt_opt_t opt, void *arg);
+PHP_HTTP_API void php_http_request_pool_requests(php_http_request_pool_t *h, zval ***attached, zval ***finished);
 
 typedef struct php_http_request_pool_object {
        zend_object zo;
-       php_http_request_pool_t pool;
+       php_http_request_pool_t *pool;
        struct {
                long pos;
        } iterator;
@@ -56,6 +74,7 @@ extern zend_class_entry *php_http_request_pool_class_entry;
 extern zend_function_entry php_http_request_pool_method_entry[];
 
 extern zend_object_value php_http_request_pool_object_new(zend_class_entry *ce TSRMLS_DC);
+extern zend_object_value php_http_request_pool_object_new_ex(zend_class_entry *ce, php_http_request_pool_t *p, php_http_request_pool_object_t **ptr TSRMLS_DC);
 extern void php_http_request_pool_object_free(void *object TSRMLS_DC);
 
 PHP_METHOD(HttpRequestPool, __construct);
@@ -64,8 +83,8 @@ PHP_METHOD(HttpRequestPool, attach);
 PHP_METHOD(HttpRequestPool, detach);
 PHP_METHOD(HttpRequestPool, send);
 PHP_METHOD(HttpRequestPool, reset);
-PHP_METHOD(HttpRequestPool, socketPerform);
-PHP_METHOD(HttpRequestPool, socketSelect);
+PHP_METHOD(HttpRequestPool, once);
+PHP_METHOD(HttpRequestPool, wait);
 PHP_METHOD(HttpRequestPool, valid);
 PHP_METHOD(HttpRequestPool, current);
 PHP_METHOD(HttpRequestPool, key);
@@ -78,6 +97,5 @@ PHP_METHOD(HttpRequestPool, enablePipelining);
 PHP_METHOD(HttpRequestPool, enableEvents);
 
 PHP_MINIT_FUNCTION(http_request_pool);
-PHP_RINIT_FUNCTION(http_request_pool);
 
 #endif /* PHP_HTTP_REQUESTPOOL_H */