8e3d8b46e6bb71d9e82a39a63ed95c406a82d7c9
[m6w6/ext-http] / php_http_client.h
1 /*
2 +--------------------------------------------------------------------+
3 | PECL :: http |
4 +--------------------------------------------------------------------+
5 | Redistribution and use in source and binary forms, with or without |
6 | modification, are permitted provided that the conditions mentioned |
7 | in the accompanying LICENSE file are met. |
8 +--------------------------------------------------------------------+
9 | Copyright (c) 2004-2011, Michael Wallner <mike@php.net> |
10 +--------------------------------------------------------------------+
11 */
12
13 #ifndef PHP_HTTP_CLIENT_H
14 #define PHP_HTTP_CLIENT_H
15
16 #include "php_http_message_body.h"
17 #include "php_http_message_parser.h"
18
19 typedef struct php_http_client_progress_state {
20 struct {
21 double now;
22 double total;
23 } ul;
24 struct {
25 double now;
26 double total;
27 } dl;
28 const char *info;
29 unsigned started:1;
30 unsigned finished:1;
31 } php_http_client_progress_state_t;
32
33 #define PHP_HTTP_CLIENT_PROGRESS_CALLBACK_USER 0
34 #define PHP_HTTP_CLIENT_PROGRESS_CALLBACK_INTERN 1
35 typedef struct php_http_client_progress_callback {
36 union {
37 zval *user;
38 void (*intern)(php_http_client_progress_state_t* TSRMLS_DC);
39 } func;
40 unsigned type:1;
41 unsigned pass_state:1;
42 } php_http_client_progress_callback_t;
43
44 typedef struct php_http_client_progress {
45 php_http_client_progress_state_t state;
46 php_http_client_progress_callback_t *callback;
47 unsigned in_cb:1;
48 } php_http_client_progress_t;
49
50 static inline void php_http_client_progress_dtor(php_http_client_progress_t *progress TSRMLS_DC)
51 {
52 if (progress->callback) {
53 if (progress->callback->type == PHP_HTTP_CLIENT_PROGRESS_CALLBACK_USER) {
54 zval_ptr_dtor(&progress->callback->func.user);
55 }
56 efree(progress->callback);
57 }
58 memset(progress, 0, sizeof(*progress));
59 }
60
61 static inline void php_http_client_progress_notify(php_http_client_progress_t *progress TSRMLS_DC)
62 {
63 if (progress->callback) {
64 zval retval;
65
66 INIT_PZVAL(&retval);
67 ZVAL_NULL(&retval);
68
69 with_error_handling(EH_NORMAL, NULL) {
70 switch (progress->callback->type) {
71 case PHP_HTTP_CLIENT_PROGRESS_CALLBACK_USER:
72 if (progress->callback->pass_state) {
73 zval *param;
74
75 MAKE_STD_ZVAL(param);
76 array_init(param);
77 add_assoc_bool(param, "started", progress->state.started);
78 add_assoc_bool(param, "finished", progress->state.finished);
79 add_assoc_string(param, "info", estrdup(progress->state.info), 0);
80 add_assoc_double(param, "dltotal", progress->state.dl.total);
81 add_assoc_double(param, "dlnow", progress->state.dl.now);
82 add_assoc_double(param, "ultotal", progress->state.ul.total);
83 add_assoc_double(param, "ulnow", progress->state.ul.now);
84
85 progress->in_cb = 1;
86 call_user_function(EG(function_table), NULL, progress->callback->func.user, &retval, 1, &param TSRMLS_CC);
87 progress->in_cb = 0;
88
89 zval_ptr_dtor(&param);
90 } else {
91 progress->in_cb = 1;
92 call_user_function(EG(function_table), NULL, progress->callback->func.user, &retval, 0, NULL TSRMLS_CC);
93 progress->in_cb = 0;
94 }
95 break;
96 case PHP_HTTP_CLIENT_PROGRESS_CALLBACK_INTERN:
97 progress->callback->func.intern(progress->callback->pass_state ? &progress->state : NULL TSRMLS_CC);
98 break;
99 default:
100 break;
101 }
102 } end_error_handling();
103
104 zval_dtor(&retval);
105 }
106 }
107
108 typedef enum php_http_client_setopt_opt {
109 PHP_HTTP_CLIENT_OPT_SETTINGS, /* HashTable* */
110 PHP_HTTP_CLIENT_OPT_PROGRESS_CALLBACK, /* php_http_client_progress_callback_t* */
111 PHP_HTTP_CLIENT_OPT_COOKIES_ENABLE, /* - */
112 PHP_HTTP_CLIENT_OPT_COOKIES_RESET, /* - */
113 PHP_HTTP_CLIENT_OPT_COOKIES_RESET_SESSION, /* - */
114 PHP_HTTP_CLIENT_OPT_COOKIES_FLUSH, /* - */
115 } php_http_client_setopt_opt_t;
116
117 typedef enum php_http_client_getopt_opt {
118 PHP_HTTP_CLIENT_OPT_PROGRESS_INFO, /* php_http_client_progress_t** */
119 PHP_HTTP_CLIENT_OPT_TRANSFER_INFO, /* HashTable* */
120 } php_http_client_getopt_opt_t;
121
122 typedef struct php_http_client *(*php_http_client_init_func_t)(struct php_http_client *h, void *arg);
123 typedef struct php_http_client *(*php_http_client_copy_func_t)(struct php_http_client *from, struct php_http_client *to);
124 typedef void (*php_http_client_dtor_func_t)(struct php_http_client *h);
125 typedef STATUS (*php_http_client_exec_func_t)(struct php_http_client *h, php_http_message_t *msg);
126 typedef STATUS (*php_http_client_reset_func_t)(struct php_http_client *h);
127 typedef STATUS (*php_http_client_setopt_func_t)(struct php_http_client *h, php_http_client_setopt_opt_t opt, void *arg);
128 typedef STATUS (*php_http_client_getopt_func_t)(struct php_http_client *h, php_http_client_getopt_opt_t opt, void *arg);
129
130 typedef struct php_http_client_ops {
131 php_http_resource_factory_ops_t *rsrc;
132 php_http_client_init_func_t init;
133 php_http_client_copy_func_t copy;
134 php_http_client_dtor_func_t dtor;
135 php_http_client_reset_func_t reset;
136 php_http_client_exec_func_t exec;
137 php_http_client_setopt_func_t setopt;
138 php_http_client_getopt_func_t getopt;
139 php_http_new_t create_object;
140 zend_class_entry *(*class_entry)(void);
141 } php_http_client_ops_t;
142
143 typedef struct php_http_client {
144 void *ctx;
145 php_http_resource_factory_t *rf;
146 php_http_client_ops_t *ops;
147 struct {
148 php_http_message_parser_t *parser;
149 php_http_message_t *message;
150 php_http_buffer_t *buffer;
151 } request;
152 struct {
153 php_http_message_parser_t *parser;
154 php_http_message_t *message;
155 php_http_buffer_t *buffer;
156 } response;
157 #ifdef ZTS
158 void ***ts;
159 #endif
160 } php_http_client_t;
161
162 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);
163 PHP_HTTP_API php_http_client_t *php_http_client_copy(php_http_client_t *from, php_http_client_t *to);
164 PHP_HTTP_API STATUS php_http_client_exec(php_http_client_t *h, php_http_message_t *msg);
165 PHP_HTTP_API STATUS php_http_client_reset(php_http_client_t *h);
166 PHP_HTTP_API STATUS php_http_client_setopt(php_http_client_t *h, php_http_client_setopt_opt_t opt, void *arg);
167 PHP_HTTP_API STATUS php_http_client_getopt(php_http_client_t *h, php_http_client_getopt_opt_t opt, void *arg);
168 PHP_HTTP_API void php_http_client_dtor(php_http_client_t *h);
169 PHP_HTTP_API void php_http_client_free(php_http_client_t **h);
170
171 typedef struct php_http_client_object {
172 zend_object zo;
173 php_http_client_t *client;
174 } php_http_client_object_t;
175
176 zend_object_value php_http_client_object_new(zend_class_entry *ce TSRMLS_DC);
177 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);
178 zend_object_value php_http_client_object_clone(zval *zobject TSRMLS_DC);
179 void php_http_client_object_free(void *object TSRMLS_DC);
180
181 zend_class_entry *php_http_client_get_class_entry(void);
182 zend_object_handlers *php_http_client_get_object_handlers(void);
183
184 STATUS php_http_client_object_handle_request(zval *zclient, zval **zreq TSRMLS_DC);
185 STATUS php_http_client_object_handle_response(zval *zclient TSRMLS_DC);
186
187 void php_http_client_options_set(zval *this_ptr, zval *opts TSRMLS_DC);
188 void php_http_client_options_set_subr(zval *this_ptr, char *key, size_t len, zval *opts, int overwrite TSRMLS_DC);
189 void php_http_client_options_get_subr(zval *this_ptr, char *key, size_t len, zval *return_value TSRMLS_DC);
190
191 PHP_METHOD(HttpClient, __construct);
192 PHP_METHOD(HttpClient, getObservers);
193 PHP_METHOD(HttpClient, notify);
194 PHP_METHOD(HttpClient, attach);
195 PHP_METHOD(HttpClient, detach);
196 PHP_METHOD(HttpClient, getProgress);
197 PHP_METHOD(HttpClient, getTransferInfo);
198 PHP_METHOD(HttpClient, setOptions);
199 PHP_METHOD(HttpClient, getOptions);
200 PHP_METHOD(HttpClient, addSslOptions);
201 PHP_METHOD(HttpClient, setSslOptions);
202 PHP_METHOD(HttpClient, getSslOptions);
203 PHP_METHOD(HttpClient, addCookies);
204 PHP_METHOD(HttpClient, getCookies);
205 PHP_METHOD(HttpClient, setCookies);
206 PHP_METHOD(HttpClient, enableCookies);
207 PHP_METHOD(HttpClient, resetCookies);
208 PHP_METHOD(HttpClient, flushCookies);
209 PHP_METHOD(HttpClient, setRequest);
210 PHP_METHOD(HttpClient, getRequest);
211 PHP_METHOD(HttpClient, send);
212 PHP_METHOD(HttpClient, request);
213 PHP_METHOD(HttpClient, getResponseMessage);
214 PHP_METHOD(HttpClient, getRequestMessage);
215 PHP_METHOD(HttpClient, getHistory);
216 PHP_METHOD(HttpClient, clearHistory);
217 PHP_METHOD(HttpClient, getResponseMessageClass);
218 PHP_METHOD(HttpClient, setResponseMessageClass);
219
220 PHP_MINIT_FUNCTION(http_client);
221
222 #endif
223
224 /*
225 * Local variables:
226 * tab-width: 4
227 * c-basic-offset: 4
228 * End:
229 * vim600: noet sw=4 ts=4 fdm=marker
230 * vim<600: noet sw=4 ts=4
231 */
232