http\Env::parseParams()
[m6w6/ext-http] / php_http_request.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-2010, Michael Wallner <mike@php.net> |
10 +--------------------------------------------------------------------+
11 */
12
13 /* $Id: php_http_request_api.h 292841 2009-12-31 08:48:57Z mike $ */
14
15 #ifndef PHP_HTTP_REQUEST_H
16 #define PHP_HTTP_REQUEST_H
17
18 #include "php_http_message_body.h"
19 #include "php_http_message_parser.h"
20 #include "php_http_request_method.h"
21
22 typedef struct php_http_request_progress_state {
23 struct {
24 double now;
25 double total;
26 } ul;
27 struct {
28 double now;
29 double total;
30 } dl;
31 const char *info;
32 unsigned started:1;
33 unsigned finished:1;
34 } php_http_request_progress_state_t;
35
36 #define PHP_HTTP_REQUEST_PROGRESS_CALLBACK_USER 0
37 #define PHP_HTTP_REQUEST_PROGRESS_CALLBACK_INTERN 1
38 typedef struct php_http_request_progress_callback {
39 union {
40 zval *user;
41 void (*intern)(php_http_request_progress_state_t* TSRMLS_DC);
42 } func;
43 unsigned type:1;
44 unsigned pass_state:1;
45 } php_http_request_progress_callback_t;
46
47 typedef struct php_http_request_progress {
48 php_http_request_progress_state_t state;
49 php_http_request_progress_callback_t *callback;
50 unsigned in_cb:1;
51 } php_http_request_progress_t;
52
53 static inline void php_http_request_progress_dtor(php_http_request_progress_t *progress TSRMLS_DC)
54 {
55 if (progress->callback) {
56 if (progress->callback->type == PHP_HTTP_REQUEST_PROGRESS_CALLBACK_USER) {
57 zval_ptr_dtor(&progress->callback->func.user);
58 }
59 efree(progress->callback);
60 }
61 memset(progress, 0, sizeof(*progress));
62 }
63
64 static inline void php_http_request_progress_notify(php_http_request_progress_t *progress TSRMLS_DC)
65 {
66 if (progress->callback) {
67 zval retval;
68
69 INIT_PZVAL(&retval);
70 ZVAL_NULL(&retval);
71
72 with_error_handling(EH_NORMAL, NULL) {
73 switch (progress->callback->type) {
74 case PHP_HTTP_REQUEST_PROGRESS_CALLBACK_USER:
75 if (progress->callback->pass_state) {
76 zval *param;
77
78 MAKE_STD_ZVAL(param);
79 array_init(param);
80 add_assoc_bool(param, "started", progress->state.started);
81 add_assoc_bool(param, "finished", progress->state.finished);
82 add_assoc_string(param, "info", estrdup(progress->state.info), 0);
83 add_assoc_double(param, "dltotal", progress->state.dl.total);
84 add_assoc_double(param, "dlnow", progress->state.dl.now);
85 add_assoc_double(param, "ultotal", progress->state.ul.total);
86 add_assoc_double(param, "ulnow", progress->state.ul.now);
87
88 progress->in_cb = 1;
89 call_user_function(EG(function_table), NULL, progress->callback->func.user, &retval, 1, &param TSRMLS_CC);
90 progress->in_cb = 0;
91
92 zval_ptr_dtor(&param);
93 } else {
94 progress->in_cb = 1;
95 call_user_function(EG(function_table), NULL, progress->callback->func.user, &retval, 0, NULL TSRMLS_CC);
96 progress->in_cb = 0;
97 }
98 break;
99 case PHP_HTTP_REQUEST_PROGRESS_CALLBACK_INTERN:
100 progress->callback->func.intern(progress->callback->pass_state ? &progress->state : NULL TSRMLS_CC);
101 break;
102 default:
103 break;
104 }
105 } end_error_handling();
106
107 zval_dtor(&retval);
108 }
109 }
110
111 typedef enum php_http_request_setopt_opt {
112 PHP_HTTP_REQUEST_OPT_SETTINGS, /* HashTable* */
113 PHP_HTTP_REQUEST_OPT_PROGRESS_CALLBACK, /* php_http_request_progress_callback_t* */
114 PHP_HTTP_REQUEST_OPT_COOKIES_ENABLE, /* - */
115 PHP_HTTP_REQUEST_OPT_COOKIES_RESET, /* - */
116 PHP_HTTP_REQUEST_OPT_COOKIES_RESET_SESSION, /* - */
117 PHP_HTTP_REQUEST_OPT_COOKIES_FLUSH, /* - */
118 } php_http_request_setopt_opt_t;
119
120 typedef enum php_http_request_getopt_opt {
121 PHP_HTTP_REQUEST_OPT_PROGRESS_INFO, /* php_http_request_progress_t** */
122 PHP_HTTP_REQUEST_OPT_TRANSFER_INFO, /* HashTable* */
123 } php_http_request_getopt_opt_t;
124
125 typedef struct php_http_request php_http_request_t;
126
127 typedef php_http_request_t *(*php_http_request_init_func_t)(php_http_request_t *h, void *arg);
128 typedef php_http_request_t *(*php_http_request_copy_func_t)(php_http_request_t *from, php_http_request_t *to);
129 typedef void (*php_http_request_dtor_func_t)(php_http_request_t *h);
130 typedef STATUS (*php_http_request_exec_func_t)(php_http_request_t *h, php_http_request_method_t meth, const char *url, php_http_message_body_t *body);
131 typedef STATUS (*php_http_request_reset_func_t)(php_http_request_t *h);
132 typedef STATUS (*php_http_request_setopt_func_t)(php_http_request_t *h, php_http_request_setopt_opt_t opt, void *arg);
133 typedef STATUS (*php_http_request_getopt_func_t)(php_http_request_t *h, php_http_request_getopt_opt_t opt, void *arg);
134
135 typedef struct php_http_request_ops {
136 php_http_resource_factory_ops_t *rsrc;
137 php_http_request_init_func_t init;
138 php_http_request_copy_func_t copy;
139 php_http_request_dtor_func_t dtor;
140 php_http_request_reset_func_t reset;
141 php_http_request_exec_func_t exec;
142 php_http_request_setopt_func_t setopt;
143 php_http_request_getopt_func_t getopt;
144 } php_http_request_ops_t;
145
146 PHP_HTTP_API php_http_request_ops_t *php_http_request_get_default_ops(TSRMLS_D);
147
148 struct php_http_request {
149 void *ctx;
150 php_http_resource_factory_t *rf;
151 php_http_request_ops_t *ops;
152 php_http_message_parser_t *parser;
153 php_http_message_t *message;
154 php_http_buffer_t *buffer;
155 zval *persistent_handle_id;
156 #ifdef ZTS
157 void ***ts;
158 #endif
159 };
160
161 PHP_HTTP_API php_http_request_t *php_http_request_init(php_http_request_t *h, php_http_request_ops_t *ops, php_http_resource_factory_t *rf, void *init_arg TSRMLS_DC);
162 PHP_HTTP_API php_http_request_t *php_http_request_copy(php_http_request_t *from, php_http_request_t *to);
163 PHP_HTTP_API STATUS php_http_request_exec(php_http_request_t *h, php_http_request_method_t meth, const char *url, php_http_message_body_t *body);
164 PHP_HTTP_API STATUS php_http_request_reset(php_http_request_t *h);
165 PHP_HTTP_API STATUS php_http_request_setopt(php_http_request_t *h, php_http_request_setopt_opt_t opt, void *arg);
166 PHP_HTTP_API STATUS php_http_request_getopt(php_http_request_t *h, php_http_request_getopt_opt_t opt, void *arg);
167 PHP_HTTP_API void php_http_request_dtor(php_http_request_t *h);
168 PHP_HTTP_API void php_http_request_free(php_http_request_t **h);
169
170 typedef struct php_http_request_object {
171 zend_object zo;
172 php_http_request_t *request;
173 } php_http_request_object_t;
174
175 extern zend_class_entry *php_http_request_class_entry;
176 extern zend_function_entry php_http_request_method_entry[];
177
178 extern zend_object_value php_http_request_object_new(zend_class_entry *ce TSRMLS_DC);
179 extern zend_object_value php_http_request_object_new_ex(zend_class_entry *ce, php_http_request_t *r, php_http_request_object_t **ptr TSRMLS_DC);
180 extern zend_object_value php_http_request_object_clone(zval *zobject TSRMLS_DC);
181 extern void php_http_request_object_free(void *object TSRMLS_DC);
182
183 extern STATUS php_http_request_object_requesthandler(php_http_request_object_t *obj, zval *this_ptr, php_http_request_method_t *meth, char **url, php_http_message_body_t **body TSRMLS_DC);
184 extern STATUS php_http_request_object_responsehandler(php_http_request_object_t *obj, zval *this_ptr TSRMLS_DC);
185
186 PHP_METHOD(HttpRequest, __construct);
187 PHP_METHOD(HttpRequest, getObservers);
188 PHP_METHOD(HttpRequest, notify);
189 PHP_METHOD(HttpRequest, attach);
190 PHP_METHOD(HttpRequest, detach);
191 PHP_METHOD(HttpRequest, getProgress);
192 PHP_METHOD(HttpRequest, getTransferInfo);
193 PHP_METHOD(HttpRequest, setOptions);
194 PHP_METHOD(HttpRequest, getOptions);
195 PHP_METHOD(HttpRequest, addSslOptions);
196 PHP_METHOD(HttpRequest, setSslOptions);
197 PHP_METHOD(HttpRequest, getSslOptions);
198 PHP_METHOD(HttpRequest, addHeaders);
199 PHP_METHOD(HttpRequest, getHeaders);
200 PHP_METHOD(HttpRequest, setHeaders);
201 PHP_METHOD(HttpRequest, addCookies);
202 PHP_METHOD(HttpRequest, getCookies);
203 PHP_METHOD(HttpRequest, setCookies);
204 PHP_METHOD(HttpRequest, enableCookies);
205 PHP_METHOD(HttpRequest, resetCookies);
206 PHP_METHOD(HttpRequest, flushCookies);
207 PHP_METHOD(HttpRequest, setMethod);
208 PHP_METHOD(HttpRequest, getMethod);
209 PHP_METHOD(HttpRequest, setUrl);
210 PHP_METHOD(HttpRequest, getUrl);
211 PHP_METHOD(HttpRequest, setContentType);
212 PHP_METHOD(HttpRequest, getContentType);
213 PHP_METHOD(HttpRequest, setQueryData);
214 PHP_METHOD(HttpRequest, getQueryData);
215 PHP_METHOD(HttpRequest, addQueryData);
216 PHP_METHOD(HttpRequest, getBody);
217 PHP_METHOD(HttpRequest, setBody);
218 PHP_METHOD(HttpRequest, addBody);
219 PHP_METHOD(HttpRequest, send);
220 PHP_METHOD(HttpRequest, getResponseData);
221 PHP_METHOD(HttpRequest, getResponseHeader);
222 PHP_METHOD(HttpRequest, getResponseCookies);
223 PHP_METHOD(HttpRequest, getResponseCode);
224 PHP_METHOD(HttpRequest, getResponseStatus);
225 PHP_METHOD(HttpRequest, getResponseBody);
226 PHP_METHOD(HttpRequest, getResponseMessage);
227 PHP_METHOD(HttpRequest, getRawResponseMessage);
228 PHP_METHOD(HttpRequest, getRequestMessage);
229 PHP_METHOD(HttpRequest, getRawRequestMessage);
230 PHP_METHOD(HttpRequest, getHistory);
231 PHP_METHOD(HttpRequest, clearHistory);
232 PHP_METHOD(HttpRequest, getMessageClass);
233 PHP_METHOD(HttpRequest, setMessageClass);
234
235 extern PHP_MINIT_FUNCTION(http_request);
236
237 #endif
238
239 /*
240 * Local variables:
241 * tab-width: 4
242 * c-basic-offset: 4
243 * End:
244 * vim600: noet sw=4 ts=4 fdm=marker
245 * vim<600: noet sw=4 ts=4
246 */
247