#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;
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);
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);
PHP_METHOD(HttpRequestPool, enableEvents);
PHP_MINIT_FUNCTION(http_request_pool);
-PHP_RINIT_FUNCTION(http_request_pool);
#endif /* PHP_HTTP_REQUESTPOOL_H */