Line data Source code
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-2014, Michael Wallner <mike@php.net> |
10 : +--------------------------------------------------------------------+
11 : */
12 :
13 : #include "php_http_api.h"
14 :
15 : void php_http_client_options_set_subr(zval *this_ptr, char *key, size_t len, zval *opts, int overwrite TSRMLS_DC);
16 : void php_http_client_options_set(zval *this_ptr, zval *opts TSRMLS_DC);
17 : void php_http_client_options_get_subr(zval *this_ptr, char *key, size_t len, zval *return_value TSRMLS_DC);
18 :
19 : #define PHP_HTTP_CLIENT_REQUEST_OBJECT_INIT(obj) \
20 : do { \
21 : if (!obj->message) { \
22 : obj->message = php_http_message_init(NULL, PHP_HTTP_REQUEST, NULL TSRMLS_CC); \
23 : } \
24 : } while(0)
25 :
26 : ZEND_BEGIN_ARG_INFO_EX(ai_HttpClientRequest___construct, 0, 0, 0)
27 : ZEND_ARG_INFO(0, method)
28 : ZEND_ARG_INFO(0, url)
29 : ZEND_ARG_ARRAY_INFO(0, headers, 1)
30 : ZEND_ARG_OBJ_INFO(0, body, http\\Message\\Body, 1)
31 : ZEND_END_ARG_INFO();
32 40 : static PHP_METHOD(HttpClientRequest, __construct)
33 : {
34 40 : char *meth_str = NULL, *url_str = NULL;
35 40 : int meth_len = 0, url_len = 0;
36 40 : zval *zheaders = NULL, *zbody = NULL;
37 : php_http_message_object_t *obj;
38 :
39 40 : php_http_expect(SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s!s!a!O!", &meth_str, &meth_len, &url_str, &url_len, &zheaders, &zbody, php_http_message_body_class_entry), invalid_arg, return);
40 :
41 40 : obj = zend_object_store_get_object(getThis() TSRMLS_CC);
42 :
43 40 : if (obj->message) {
44 0 : php_http_message_set_type(obj->message, PHP_HTTP_REQUEST);
45 : } else {
46 40 : obj->message = php_http_message_init(NULL, PHP_HTTP_REQUEST, NULL TSRMLS_CC);
47 : }
48 :
49 40 : if (zbody) {
50 1 : php_http_expect(SUCCESS == php_http_message_object_set_body(obj, zbody TSRMLS_CC), unexpected_val, return);
51 : }
52 40 : if (meth_str && meth_len) {
53 38 : PHP_HTTP_INFO(obj->message).request.method = estrndup(meth_str, meth_len);
54 : }
55 40 : if (url_str && url_len) {
56 38 : PHP_HTTP_INFO(obj->message).request.url = estrndup(url_str, url_len);
57 : }
58 40 : if (zheaders) {
59 2 : array_copy(Z_ARRVAL_P(zheaders), &obj->message->hdrs);
60 : }
61 : }
62 :
63 : ZEND_BEGIN_ARG_INFO_EX(ai_HttpClientRequest_setContentType, 0, 0, 1)
64 : ZEND_ARG_INFO(0, content_type)
65 : ZEND_END_ARG_INFO();
66 1 : static PHP_METHOD(HttpClientRequest, setContentType)
67 : {
68 : char *ct_str;
69 : int ct_len;
70 : php_http_message_object_t *obj;
71 : zval *zct;
72 :
73 1 : php_http_expect(SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &ct_str, &ct_len), invalid_arg, return);
74 :
75 1 : if (ct_len && !strchr(ct_str, '/')) {
76 0 : php_http_throw(unexpected_val, "Content type \"%s\" does not seem to contain a primary and a secondary part", ct_str);
77 0 : return;
78 : }
79 :
80 1 : obj = zend_object_store_get_object(getThis() TSRMLS_CC);
81 :
82 1 : PHP_HTTP_CLIENT_REQUEST_OBJECT_INIT(obj);
83 :
84 1 : MAKE_STD_ZVAL(zct);
85 1 : ZVAL_STRINGL(zct, ct_str, ct_len, 1);
86 1 : zend_hash_update(&obj->message->hdrs, "Content-Type", sizeof("Content-Type"), (void *) &zct, sizeof(void *), NULL);
87 :
88 1 : RETVAL_ZVAL(getThis(), 1, 0);
89 : }
90 :
91 : ZEND_BEGIN_ARG_INFO_EX(ai_HttpClientRequest_getContentType, 0, 0, 0)
92 : ZEND_END_ARG_INFO();
93 1 : static PHP_METHOD(HttpClientRequest, getContentType)
94 : {
95 1 : if (SUCCESS == zend_parse_parameters_none()) {
96 1 : php_http_message_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
97 : zval *zct;
98 :
99 1 : PHP_HTTP_CLIENT_REQUEST_OBJECT_INIT(obj);
100 :
101 1 : php_http_message_update_headers(obj->message);
102 1 : zct = php_http_message_header(obj->message, ZEND_STRL("Content-Type"), 1);
103 1 : if (zct) {
104 1 : RETURN_ZVAL(zct, 0, 1);
105 : }
106 : }
107 : }
108 :
109 : ZEND_BEGIN_ARG_INFO_EX(ai_HttpClientRequest_setQuery, 0, 0, 0)
110 : ZEND_ARG_INFO(0, query_data)
111 : ZEND_END_ARG_INFO();
112 2 : static PHP_METHOD(HttpClientRequest, setQuery)
113 : {
114 2 : zval *qdata = NULL;
115 : php_http_message_object_t *obj;
116 2 : php_url *old_url = NULL, new_url = {NULL};
117 2 : char empty[] = "";
118 :
119 2 : php_http_expect(SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z!", &qdata), invalid_arg, return);
120 :
121 2 : obj = zend_object_store_get_object(getThis() TSRMLS_CC);
122 :
123 2 : PHP_HTTP_CLIENT_REQUEST_OBJECT_INIT(obj);
124 :
125 2 : if (qdata) {
126 : zval arr, str;
127 :
128 1 : INIT_PZVAL(&arr);
129 1 : array_init(&arr);
130 1 : INIT_PZVAL(&str);
131 1 : ZVAL_NULL(&str);
132 :
133 1 : php_http_expect(SUCCESS == php_http_querystring_update(&arr, qdata, &str TSRMLS_CC), bad_querystring,
134 : zval_dtor(&arr);
135 : return;
136 : );
137 1 : new_url.query = Z_STRVAL(str);
138 1 : zval_dtor(&arr);
139 : } else {
140 1 : new_url.query = &empty[0];
141 : }
142 :
143 2 : if (obj->message->http.info.request.url) {
144 2 : old_url = php_url_parse(obj->message->http.info.request.url);
145 2 : efree(obj->message->http.info.request.url);
146 : }
147 :
148 2 : php_http_url(PHP_HTTP_URL_REPLACE, old_url, &new_url, NULL, &obj->message->http.info.request.url, NULL TSRMLS_CC);
149 :
150 2 : if (old_url) {
151 2 : php_url_free(old_url);
152 : }
153 2 : if (new_url.query != &empty[0]) {
154 1 : STR_FREE(new_url.query);
155 : }
156 :
157 2 : RETVAL_ZVAL(getThis(), 1, 0);
158 : }
159 :
160 : ZEND_BEGIN_ARG_INFO_EX(ai_HttpClientRequest_getQuery, 0, 0, 0)
161 : ZEND_END_ARG_INFO();
162 4 : static PHP_METHOD(HttpClientRequest, getQuery)
163 : {
164 4 : if (SUCCESS == zend_parse_parameters_none()) {
165 4 : php_http_message_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
166 :
167 4 : PHP_HTTP_CLIENT_REQUEST_OBJECT_INIT(obj);
168 :
169 4 : if (obj->message->http.info.request.url) {
170 4 : php_url *purl = php_url_parse(obj->message->http.info.request.url);
171 :
172 4 : if (purl) {
173 4 : if (purl->query) {
174 2 : RETVAL_STRING(purl->query, 0);
175 2 : purl->query = NULL;
176 : }
177 4 : php_url_free(purl);
178 : }
179 : }
180 : }
181 4 : }
182 :
183 : ZEND_BEGIN_ARG_INFO_EX(ai_HttpClientRequest_addQuery, 0, 0, 1)
184 : ZEND_ARG_INFO(0, query_data)
185 : ZEND_END_ARG_INFO();
186 1 : static PHP_METHOD(HttpClientRequest, addQuery)
187 : {
188 : zval *qdata, arr, str;
189 : php_http_message_object_t *obj;
190 1 : php_url *old_url = NULL, new_url = {NULL};
191 :
192 1 : php_http_expect(SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &qdata), invalid_arg, return);
193 :
194 1 : obj = zend_object_store_get_object(getThis() TSRMLS_CC);
195 :
196 1 : PHP_HTTP_CLIENT_REQUEST_OBJECT_INIT(obj);
197 :
198 1 : INIT_PZVAL(&arr);
199 1 : array_init(&arr);
200 1 : INIT_PZVAL(&str);
201 1 : ZVAL_NULL(&str);
202 :
203 1 : php_http_expect(SUCCESS == php_http_querystring_update(&arr, qdata, &str TSRMLS_CC), bad_querystring,
204 : zval_dtor(&arr);
205 : return;
206 : );
207 1 : new_url.query = Z_STRVAL(str);
208 1 : zval_dtor(&arr);
209 :
210 1 : if (obj->message->http.info.request.url) {
211 1 : old_url = php_url_parse(obj->message->http.info.request.url);
212 1 : efree(obj->message->http.info.request.url);
213 : }
214 :
215 1 : php_http_url(PHP_HTTP_URL_JOIN_QUERY, old_url, &new_url, NULL, &obj->message->http.info.request.url, NULL TSRMLS_CC);
216 :
217 1 : if (old_url) {
218 1 : php_url_free(old_url);
219 : }
220 1 : STR_FREE(new_url.query);
221 :
222 1 : RETVAL_ZVAL(getThis(), 1, 0);
223 : }
224 :
225 : ZEND_BEGIN_ARG_INFO_EX(ai_HttpClientRequest_setOptions, 0, 0, 0)
226 : ZEND_ARG_ARRAY_INFO(0, options, 1)
227 : ZEND_END_ARG_INFO();
228 3 : static PHP_METHOD(HttpClientRequest, setOptions)
229 : {
230 3 : zval *opts = NULL;
231 :
232 6 : php_http_expect(SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|a!/", &opts), invalid_arg, return);
233 :
234 3 : php_http_client_options_set(getThis(), opts TSRMLS_CC);
235 :
236 3 : RETVAL_ZVAL(getThis(), 1, 0);
237 : }
238 :
239 : ZEND_BEGIN_ARG_INFO_EX(ai_HttpClientRequest_getOptions, 0, 0, 0)
240 : ZEND_END_ARG_INFO();
241 45 : static PHP_METHOD(HttpClientRequest, getOptions)
242 : {
243 45 : if (SUCCESS == zend_parse_parameters_none()) {
244 45 : zval *zoptions = zend_read_property(php_http_client_request_class_entry, getThis(), ZEND_STRL("options"), 0 TSRMLS_CC);
245 45 : RETURN_ZVAL(zoptions, 1, 0);
246 : }
247 : }
248 :
249 : ZEND_BEGIN_ARG_INFO_EX(ai_HttpClientRequest_setSslOptions, 0, 0, 0)
250 : ZEND_ARG_ARRAY_INFO(0, ssl_options, 1)
251 : ZEND_END_ARG_INFO();
252 1 : static PHP_METHOD(HttpClientRequest, setSslOptions)
253 : {
254 1 : zval *opts = NULL;
255 :
256 2 : php_http_expect(SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|a!/", &opts), invalid_arg, return);
257 :
258 1 : php_http_client_options_set_subr(getThis(), ZEND_STRS("ssl"), opts, 1 TSRMLS_CC);
259 :
260 1 : RETVAL_ZVAL(getThis(), 1, 0);
261 : }
262 :
263 : ZEND_BEGIN_ARG_INFO_EX(ai_HttpClientRequest_addSslOptions, 0, 0, 0)
264 : ZEND_ARG_ARRAY_INFO(0, ssl_options, 1)
265 : ZEND_END_ARG_INFO();
266 0 : static PHP_METHOD(HttpClientRequest, addSslOptions)
267 : {
268 0 : zval *opts = NULL;
269 :
270 0 : php_http_expect(SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|a!/", &opts), invalid_arg, return);
271 :
272 0 : php_http_client_options_set_subr(getThis(), ZEND_STRS("ssl"), opts, 0 TSRMLS_CC);
273 :
274 0 : RETVAL_ZVAL(getThis(), 1, 0);
275 : }
276 :
277 : ZEND_BEGIN_ARG_INFO_EX(ai_HttpClientRequest_getSslOptions, 0, 0, 0)
278 : ZEND_END_ARG_INFO();
279 1 : static PHP_METHOD(HttpClientRequest, getSslOptions)
280 : {
281 1 : if (SUCCESS == zend_parse_parameters_none()) {
282 1 : php_http_client_options_get_subr(getThis(), ZEND_STRS("ssl"), return_value TSRMLS_CC);
283 : }
284 1 : }
285 :
286 : static zend_function_entry php_http_client_request_methods[] = {
287 : PHP_ME(HttpClientRequest, __construct, ai_HttpClientRequest___construct, ZEND_ACC_PUBLIC|ZEND_ACC_CTOR)
288 : PHP_ME(HttpClientRequest, setContentType, ai_HttpClientRequest_setContentType, ZEND_ACC_PUBLIC)
289 : PHP_ME(HttpClientRequest, getContentType, ai_HttpClientRequest_getContentType, ZEND_ACC_PUBLIC)
290 : PHP_ME(HttpClientRequest, setQuery, ai_HttpClientRequest_setQuery, ZEND_ACC_PUBLIC)
291 : PHP_ME(HttpClientRequest, getQuery, ai_HttpClientRequest_getQuery, ZEND_ACC_PUBLIC)
292 : PHP_ME(HttpClientRequest, addQuery, ai_HttpClientRequest_addQuery, ZEND_ACC_PUBLIC)
293 : PHP_ME(HttpClientRequest, setOptions, ai_HttpClientRequest_setOptions, ZEND_ACC_PUBLIC)
294 : PHP_ME(HttpClientRequest, getOptions, ai_HttpClientRequest_getOptions, ZEND_ACC_PUBLIC)
295 : PHP_ME(HttpClientRequest, setSslOptions, ai_HttpClientRequest_setSslOptions, ZEND_ACC_PUBLIC)
296 : PHP_ME(HttpClientRequest, getSslOptions, ai_HttpClientRequest_getSslOptions, ZEND_ACC_PUBLIC)
297 : PHP_ME(HttpClientRequest, addSslOptions, ai_HttpClientRequest_addSslOptions, ZEND_ACC_PUBLIC)
298 : EMPTY_FUNCTION_ENTRY
299 : };
300 :
301 : zend_class_entry *php_http_client_request_class_entry;
302 :
303 408 : PHP_MINIT_FUNCTION(http_client_request)
304 : {
305 408 : zend_class_entry ce = {0};
306 :
307 408 : INIT_NS_CLASS_ENTRY(ce, "http\\Client", "Request", php_http_client_request_methods);
308 408 : php_http_client_request_class_entry = zend_register_internal_class_ex(&ce, php_http_message_class_entry, NULL TSRMLS_CC);
309 :
310 408 : zend_declare_property_null(php_http_client_request_class_entry, ZEND_STRL("options"), ZEND_ACC_PROTECTED TSRMLS_CC);
311 :
312 408 : return SUCCESS;
313 : }
314 :
315 : /*
316 : * Local variables:
317 : * tab-width: 4
318 : * c-basic-offset: 4
319 : * End:
320 : * vim600: noet sw=4 ts=4 fdm=marker
321 : * vim<600: noet sw=4 ts=4
322 : */
323 :
|