client test and fixes
[m6w6/ext-http] / php_http_client.h
1 #ifndef PHP_HTTP_CLIENT_H
2 #define PHP_HTTP_CLIENT_H
3
4 typedef enum php_http_client_setopt_opt {
5 PHP_HTTP_CLIENT_OPT_ENABLE_PIPELINING,
6 PHP_HTTP_CLIENT_OPT_USE_EVENTS,
7 } php_http_client_setopt_opt_t;
8
9 typedef enum php_http_client_getopt_opt {
10 PHP_HTTP_CLIENT_OPT_PROGRESS_INFO, /* php_http_client_progress_state_t** */
11 PHP_HTTP_CLIENT_OPT_TRANSFER_INFO, /* HashTable* */
12 } php_http_client_getopt_opt_t;
13
14 typedef struct php_http_client_enqueue {
15 php_http_message_t *request; /* unique */
16 HashTable *options;
17 void (*dtor)(struct php_http_client_enqueue *);
18 void *opaque;
19 struct {
20 zend_fcall_info fci;
21 zend_fcall_info_cache fcc;
22 } closure;
23 } php_http_client_enqueue_t;
24
25 typedef struct php_http_client *(*php_http_client_init_func_t)(struct php_http_client *p, void *init_arg);
26 typedef struct php_http_client *(*php_http_client_copy_func_t)(struct php_http_client *from, struct php_http_client *to);
27 typedef void (*php_http_client_dtor_func_t)(struct php_http_client *p);
28 typedef void (*php_http_client_reset_func_t)(struct php_http_client *p);
29 typedef STATUS (*php_http_client_exec_func_t)(struct php_http_client *p);
30 typedef int (*php_http_client_once_func_t)(struct php_http_client *p);
31 typedef STATUS (*php_http_client_wait_func_t)(struct php_http_client *p, struct timeval *custom_timeout);
32 typedef STATUS (*php_http_client_enqueue_func_t)(struct php_http_client *p, php_http_client_enqueue_t *enqueue);
33 typedef STATUS (*php_http_client_dequeue_func_t)(struct php_http_client *p, php_http_client_enqueue_t *enqueue);
34 typedef STATUS (*php_http_client_setopt_func_t)(struct php_http_client *p, php_http_client_setopt_opt_t opt, void *arg);
35 typedef STATUS (*php_http_client_getopt_func_t)(struct php_http_client *h, php_http_client_getopt_opt_t opt, void *arg, void **res);
36
37 typedef struct php_http_client_ops {
38 php_resource_factory_ops_t *rsrc;
39 php_http_client_init_func_t init;
40 php_http_client_copy_func_t copy;
41 php_http_client_dtor_func_t dtor;
42 php_http_client_reset_func_t reset;
43 php_http_client_exec_func_t exec;
44 php_http_client_wait_func_t wait;
45 php_http_client_once_func_t once;
46 php_http_client_enqueue_func_t enqueue;
47 php_http_client_dequeue_func_t dequeue;
48 php_http_client_setopt_func_t setopt;
49 php_http_client_getopt_func_t getopt;
50 } php_http_client_ops_t;
51
52 typedef struct php_http_client_driver {
53 const char *name_str;
54 size_t name_len;
55 php_http_client_ops_t *client_ops;
56 } php_http_client_driver_t;
57
58 PHP_HTTP_API STATUS php_http_client_driver_add(php_http_client_driver_t *driver);
59 PHP_HTTP_API STATUS php_http_client_driver_get(const char *name_str, size_t name_len, php_http_client_driver_t *driver);
60
61 typedef struct php_http_client_progress_state {
62 struct {
63 double now;
64 double total;
65 } ul;
66 struct {
67 double now;
68 double total;
69 } dl;
70 const char *info;
71 unsigned started:1;
72 unsigned finished:1;
73 } php_http_client_progress_state_t;
74
75 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 **request, php_http_message_t **response);
76 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);
77
78 typedef struct php_http_client {
79 void *ctx;
80 php_resource_factory_t *rf;
81 php_http_client_ops_t *ops;
82
83 struct {
84 struct {
85 php_http_client_response_callback_t func;
86 void *arg;
87 } response;
88 struct {
89 php_http_client_progress_callback_t func;
90 void *arg;
91 } progress;
92 } callback;
93
94 zend_llist requests;
95 zend_llist responses;
96
97 #ifdef ZTS
98 void ***ts;
99 #endif
100 } php_http_client_t;
101
102 zend_class_entry *php_http_client_class_entry;
103
104 typedef struct php_http_client_object {
105 zend_object zo;
106 zend_object_value zv;
107 php_http_client_t *client;
108 long iterator;
109 } php_http_client_object_t;
110
111 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);
112 PHP_HTTP_API php_http_client_t *php_http_client_copy(php_http_client_t *from, php_http_client_t *to);
113 PHP_HTTP_API void php_http_client_dtor(php_http_client_t *h);
114 PHP_HTTP_API void php_http_client_free(php_http_client_t **h);
115
116 PHP_HTTP_API STATUS php_http_client_enqueue(php_http_client_t *h, php_http_client_enqueue_t *enqueue);
117 PHP_HTTP_API STATUS php_http_client_dequeue(php_http_client_t *h, php_http_message_t *request);
118
119 PHP_HTTP_API STATUS php_http_client_wait(php_http_client_t *h, struct timeval *custom_timeout);
120 PHP_HTTP_API int php_http_client_once(php_http_client_t *h);
121
122 PHP_HTTP_API STATUS php_http_client_exec(php_http_client_t *h);
123 PHP_HTTP_API void php_http_client_reset(php_http_client_t *h);
124
125 PHP_HTTP_API STATUS php_http_client_setopt(php_http_client_t *h, php_http_client_setopt_opt_t opt, void *arg);
126 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);
127
128 typedef int (*php_http_client_enqueue_cmp_func_t)(php_http_client_enqueue_t *cmp, void *arg);
129 /* compare with request message pointer if compare_func is NULL */
130 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);
131
132 PHP_MINIT_FUNCTION(http_client);
133 PHP_MSHUTDOWN_FUNCTION(http_client);
134
135 #endif