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