split off property proxy
[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 } php_http_client_progress_callback_t;
42
43 typedef struct php_http_client_progress {
44 php_http_client_progress_state_t state;
45 php_http_client_progress_callback_t *callback;
46 unsigned in_cb:1;
47 } php_http_client_progress_t;
48
49 static inline void php_http_client_progress_dtor(php_http_client_progress_t *progress TSRMLS_DC)
50 {
51 if (progress->callback) {
52 if (progress->callback->type == PHP_HTTP_CLIENT_PROGRESS_CALLBACK_USER) {
53 zval_ptr_dtor(&progress->callback->func.user);
54 }
55 efree(progress->callback);
56 }
57 memset(progress, 0, sizeof(*progress));
58 }
59
60 static inline void php_http_client_progress_notify(php_http_client_progress_t *progress TSRMLS_DC)
61 {
62 if (progress->callback) {
63 zval retval;
64
65 INIT_PZVAL(&retval);
66 ZVAL_NULL(&retval);
67
68 with_error_handling(EH_NORMAL, NULL) {
69 switch (progress->callback->type) {
70 case PHP_HTTP_CLIENT_PROGRESS_CALLBACK_USER:
71 progress->in_cb = 1;
72 call_user_function(EG(function_table), NULL, progress->callback->func.user, &retval, 0, NULL TSRMLS_CC);
73 progress->in_cb = 0;
74 break;
75 case PHP_HTTP_CLIENT_PROGRESS_CALLBACK_INTERN:
76 progress->callback->func.intern(&progress->state TSRMLS_CC);
77 break;
78 default:
79 break;
80 }
81 } end_error_handling();
82
83 zval_dtor(&retval);
84 }
85 }
86
87 typedef enum php_http_client_setopt_opt {
88 PHP_HTTP_CLIENT_OPT_SETTINGS, /* HashTable* */
89 PHP_HTTP_CLIENT_OPT_PROGRESS_CALLBACK, /* php_http_client_progress_callback_t* */
90 PHP_HTTP_CLIENT_OPT_COOKIES_ENABLE, /* - */
91 PHP_HTTP_CLIENT_OPT_COOKIES_RESET, /* - */
92 PHP_HTTP_CLIENT_OPT_COOKIES_RESET_SESSION, /* - */
93 PHP_HTTP_CLIENT_OPT_COOKIES_FLUSH, /* - */
94 } php_http_client_setopt_opt_t;
95
96 typedef enum php_http_client_getopt_opt {
97 PHP_HTTP_CLIENT_OPT_PROGRESS_INFO, /* php_http_client_progress_t** */
98 PHP_HTTP_CLIENT_OPT_TRANSFER_INFO, /* HashTable* */
99 } php_http_client_getopt_opt_t;
100
101 typedef struct php_http_client *(*php_http_client_init_func_t)(struct php_http_client *h, void *arg);
102 typedef struct php_http_client *(*php_http_client_copy_func_t)(struct php_http_client *from, struct php_http_client *to);
103 typedef void (*php_http_client_dtor_func_t)(struct php_http_client *h);
104 typedef STATUS (*php_http_client_exec_func_t)(struct php_http_client *h, php_http_message_t *msg);
105 typedef STATUS (*php_http_client_reset_func_t)(struct php_http_client *h);
106 typedef STATUS (*php_http_client_setopt_func_t)(struct php_http_client *h, php_http_client_setopt_opt_t opt, void *arg);
107 typedef STATUS (*php_http_client_getopt_func_t)(struct php_http_client *h, php_http_client_getopt_opt_t opt, void *arg);
108
109 typedef struct php_http_client_ops {
110 php_resource_factory_ops_t *rsrc;
111 php_http_client_init_func_t init;
112 php_http_client_copy_func_t copy;
113 php_http_client_dtor_func_t dtor;
114 php_http_client_reset_func_t reset;
115 php_http_client_exec_func_t exec;
116 php_http_client_setopt_func_t setopt;
117 php_http_client_getopt_func_t getopt;
118 php_http_new_t create_object;
119 zend_class_entry *(*class_entry)(void);
120 } php_http_client_ops_t;
121
122 typedef struct php_http_client {
123 void *ctx;
124 php_resource_factory_t *rf;
125 php_http_client_ops_t *ops;
126 struct {
127 php_http_message_parser_t *parser;
128 php_http_message_t *message;
129 php_http_buffer_t *buffer;
130 } request;
131 struct {
132 php_http_message_parser_t *parser;
133 php_http_message_t *message;
134 php_http_buffer_t *buffer;
135 } response;
136 #ifdef ZTS
137 void ***ts;
138 #endif
139 } php_http_client_t;
140
141 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);
142 PHP_HTTP_API php_http_client_t *php_http_client_copy(php_http_client_t *from, php_http_client_t *to);
143 PHP_HTTP_API STATUS php_http_client_exec(php_http_client_t *h, php_http_message_t *msg);
144 PHP_HTTP_API STATUS php_http_client_reset(php_http_client_t *h);
145 PHP_HTTP_API STATUS php_http_client_setopt(php_http_client_t *h, php_http_client_setopt_opt_t opt, void *arg);
146 PHP_HTTP_API STATUS php_http_client_getopt(php_http_client_t *h, php_http_client_getopt_opt_t opt, void *arg);
147 PHP_HTTP_API void php_http_client_dtor(php_http_client_t *h);
148 PHP_HTTP_API void php_http_client_free(php_http_client_t **h);
149
150 typedef struct php_http_client_object {
151 zend_object zo;
152 php_http_client_t *client;
153 } php_http_client_object_t;
154
155 zend_object_value php_http_client_object_new(zend_class_entry *ce TSRMLS_DC);
156 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);
157 zend_object_value php_http_client_object_clone(zval *zobject TSRMLS_DC);
158 void php_http_client_object_free(void *object TSRMLS_DC);
159
160 zend_class_entry *php_http_client_get_class_entry(void);
161 zend_object_handlers *php_http_client_get_object_handlers(void);
162
163 STATUS php_http_client_object_handle_request(zval *zclient, zval **zreq TSRMLS_DC);
164 STATUS php_http_client_object_handle_response(zval *zclient TSRMLS_DC);
165
166 void php_http_client_options_set(zval *this_ptr, zval *opts TSRMLS_DC);
167 void php_http_client_options_set_subr(zval *this_ptr, char *key, size_t len, zval *opts, int overwrite TSRMLS_DC);
168 void php_http_client_options_get_subr(zval *this_ptr, char *key, size_t len, zval *return_value TSRMLS_DC);
169
170 PHP_METHOD(HttpClient, __construct);
171 PHP_METHOD(HttpClient, getObservers);
172 PHP_METHOD(HttpClient, notify);
173 PHP_METHOD(HttpClient, attach);
174 PHP_METHOD(HttpClient, detach);
175 PHP_METHOD(HttpClient, getProgress);
176 PHP_METHOD(HttpClient, getTransferInfo);
177 PHP_METHOD(HttpClient, setOptions);
178 PHP_METHOD(HttpClient, getOptions);
179 PHP_METHOD(HttpClient, addSslOptions);
180 PHP_METHOD(HttpClient, setSslOptions);
181 PHP_METHOD(HttpClient, getSslOptions);
182 PHP_METHOD(HttpClient, addCookies);
183 PHP_METHOD(HttpClient, getCookies);
184 PHP_METHOD(HttpClient, setCookies);
185 PHP_METHOD(HttpClient, enableCookies);
186 PHP_METHOD(HttpClient, resetCookies);
187 PHP_METHOD(HttpClient, flushCookies);
188 PHP_METHOD(HttpClient, setRequest);
189 PHP_METHOD(HttpClient, getRequest);
190 PHP_METHOD(HttpClient, send);
191 PHP_METHOD(HttpClient, request);
192 PHP_METHOD(HttpClient, getResponseMessage);
193 PHP_METHOD(HttpClient, getRequestMessage);
194 PHP_METHOD(HttpClient, getHistory);
195 PHP_METHOD(HttpClient, clearHistory);
196 PHP_METHOD(HttpClient, getResponseMessageClass);
197 PHP_METHOD(HttpClient, setResponseMessageClass);
198
199 PHP_MINIT_FUNCTION(http_client);
200
201 #endif
202
203 /*
204 * Local variables:
205 * tab-width: 4
206 * c-basic-offset: 4
207 * End:
208 * vim600: noet sw=4 ts=4 fdm=marker
209 * vim<600: noet sw=4 ts=4
210 */
211