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