operate directly on the querystring of the request url
[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-2011, Michael Wallner <mike@php.net> |
10 +--------------------------------------------------------------------+
11 */
12
13 #include "php_http_api.h"
14
15 #define PHP_HTTP_BEGIN_ARGS(method, req_args) PHP_HTTP_BEGIN_ARGS_EX(HttpClientRequest, method, 0, req_args)
16 #define PHP_HTTP_EMPTY_ARGS(method) PHP_HTTP_EMPTY_ARGS_EX(HttpClientRequest, method, 0)
17 #define PHP_HTTP_CLIENT_REQUEST_ME(method, visibility) PHP_ME(HttpClientRequest, method, PHP_HTTP_ARGS(HttpClientRequest, method), visibility)
18 #define PHP_HTTP_CLIENT_REQUEST_ALIAS(method, func) PHP_HTTP_STATIC_ME_ALIAS(method, func, PHP_HTTP_ARGS(HttpClientRequest, method))
19 #define PHP_HTTP_CLIENT_REQUEST_MALIAS(me, al, vis) ZEND_FENTRY(me, ZEND_MN(HttpClientRequest_##al), PHP_HTTP_ARGS(HttpClientRequest, al), vis)
20
21 PHP_HTTP_BEGIN_ARGS(__construct, 0)
22 PHP_HTTP_ARG_VAL(method, 0)
23 PHP_HTTP_ARG_VAL(url, 0)
24 PHP_HTTP_ARG_ARR(headers, 1, 0)
25 PHP_HTTP_ARG_OBJ(http\\Message\\Body, body, 1)
26 PHP_HTTP_END_ARGS;
27
28 PHP_HTTP_EMPTY_ARGS(getContentType);
29 PHP_HTTP_BEGIN_ARGS(setContentType, 1)
30 PHP_HTTP_ARG_VAL(content_type, 0)
31 PHP_HTTP_END_ARGS;
32
33 PHP_HTTP_EMPTY_ARGS(getQuery);
34 PHP_HTTP_BEGIN_ARGS(setQuery, 0)
35 PHP_HTTP_ARG_VAL(query_data, 0)
36 PHP_HTTP_END_ARGS;
37
38 PHP_HTTP_BEGIN_ARGS(addQuery, 1)
39 PHP_HTTP_ARG_VAL(query_data, 0)
40 PHP_HTTP_END_ARGS;
41
42
43 PHP_METHOD(HttpClientRequest, __construct)
44 {
45 char *meth_str = NULL, *url_str = NULL;
46 int meth_len = 0, url_len = 0;
47 zval *zheaders = NULL, *zbody = NULL;
48
49 with_error_handling(EH_THROW, php_http_exception_class_entry) {
50 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)) {
51 php_http_message_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
52
53 if (obj->message) {
54 php_http_message_set_type(obj->message, PHP_HTTP_REQUEST);
55 } else {
56 obj->message = php_http_message_init(NULL, PHP_HTTP_REQUEST TSRMLS_CC);
57 }
58
59 if (meth_str && meth_len) {
60 PHP_HTTP_INFO(obj->message).request.method = estrndup(meth_str, meth_len);
61 }
62 if (url_str && url_len) {
63 PHP_HTTP_INFO(obj->message).request.url = estrndup(url_str, url_len);
64 }
65 if (zheaders) {
66 array_copy(Z_ARRVAL_P(zheaders), &obj->message->hdrs);
67 }
68 if (zbody) {
69 php_http_message_body_object_t *body_obj = zend_object_store_get_object(zbody TSRMLS_CC);
70
71 php_http_message_body_dtor(&obj->message->body);
72 php_http_message_body_copy(body_obj->body, &obj->message->body, 0);
73 Z_OBJ_ADDREF_P(zbody);
74 obj->body = Z_OBJVAL_P(zbody);
75 }
76 }
77 } end_error_handling();
78 }
79
80
81 PHP_METHOD(HttpClientRequest, setContentType)
82 {
83 char *ct_str;
84 int ct_len;
85
86 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &ct_str, &ct_len)) {
87 int invalid = 0;
88
89 if (ct_len) {
90 PHP_HTTP_CHECK_CONTENT_TYPE(ct_str, invalid = 1);
91 }
92
93 if (!invalid) {
94 php_http_message_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
95 zval *zct;
96
97 MAKE_STD_ZVAL(zct);
98 ZVAL_STRINGL(zct, ct_str, ct_len, 1);
99 zend_hash_update(&obj->message->hdrs, "Content-Type", sizeof("Content-Type"), (void *) &zct, sizeof(void *), NULL);
100 }
101 }
102 RETVAL_ZVAL(getThis(), 1, 0);
103 }
104
105 PHP_METHOD(HttpClientRequest, getContentType)
106 {
107 if (SUCCESS == zend_parse_parameters_none()) {
108 php_http_message_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
109 zval *zct = php_http_message_header(obj->message, ZEND_STRL("Content-Type"), 1);
110
111 RETURN_ZVAL(zct, 0, 0);
112 }
113 RETURN_FALSE;
114 }
115
116 PHP_METHOD(HttpClientRequest, setQuery)
117 {
118 zval *qdata = NULL;
119
120 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z!", &qdata)) {
121 php_http_message_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
122 php_url *old_url = NULL, new_url = {NULL};
123 char empty[] = "";
124
125 if (qdata) {
126 zval arr, str;
127
128 INIT_PZVAL(&arr);
129 array_init(&arr);
130 INIT_PZVAL(&str);
131 ZVAL_NULL(&str);
132
133 php_http_querystring_update(&arr, qdata, &str TSRMLS_CC);
134 new_url.query = Z_STRVAL(str);
135 zval_dtor(&arr);
136 } else {
137 new_url.query = &empty[0];
138 }
139
140 if (obj->message->http.info.request.url) {
141 old_url = php_url_parse(obj->message->http.info.request.url);
142 efree(obj->message->http.info.request.url);
143 }
144
145 php_http_url(PHP_HTTP_URL_REPLACE, old_url, &new_url, NULL, &obj->message->http.info.request.url, NULL TSRMLS_CC);
146
147 if (old_url) {
148 php_url_free(old_url);
149 }
150 if (new_url.query != &empty[0]) {
151 STR_FREE(new_url.query);
152 }
153 }
154 RETVAL_ZVAL(getThis(), 1, 0);
155 }
156
157 PHP_METHOD(HttpClientRequest, getQuery)
158 {
159 if (SUCCESS == zend_parse_parameters_none()) {
160 php_http_message_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
161
162 if (obj->message->http.info.request.url) {
163 php_url *purl = php_url_parse(obj->message->http.info.request.url);
164
165 if (purl) {
166 if (purl->query) {
167 RETVAL_STRING(purl->query, 0);
168 purl->query = NULL;
169 }
170 php_url_free(purl);
171 }
172 }
173 }
174 }
175
176 PHP_METHOD(HttpClientRequest, addQuery)
177 {
178 zval *qdata;
179
180 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &qdata)) {
181 php_http_message_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
182 php_url *old_url = NULL, new_url = {NULL};
183 char empty[] = "";
184
185 zval arr, str;
186
187 INIT_PZVAL(&arr);
188 array_init(&arr);
189 INIT_PZVAL(&str);
190 ZVAL_NULL(&str);
191
192 php_http_querystring_update(&arr, qdata, &str TSRMLS_CC);
193 new_url.query = Z_STRVAL(str);
194 zval_dtor(&arr);
195
196 if (obj->message->http.info.request.url) {
197 old_url = php_url_parse(obj->message->http.info.request.url);
198 efree(obj->message->http.info.request.url);
199 }
200
201 php_http_url(PHP_HTTP_URL_JOIN_QUERY, old_url, &new_url, NULL, &obj->message->http.info.request.url, NULL TSRMLS_CC);
202
203 if (old_url) {
204 php_url_free(old_url);
205 }
206 STR_FREE(new_url.query);
207 }
208 RETVAL_ZVAL(getThis(), 1, 0);
209 }
210
211
212 zend_class_entry *php_http_client_request_class_entry;
213 zend_function_entry php_http_client_request_method_entry[] = {
214 PHP_HTTP_CLIENT_REQUEST_ME(__construct, ZEND_ACC_PUBLIC|ZEND_ACC_CTOR)
215 PHP_HTTP_CLIENT_REQUEST_ME(getQuery, ZEND_ACC_PUBLIC)
216 PHP_HTTP_CLIENT_REQUEST_ME(setQuery, ZEND_ACC_PUBLIC)
217 PHP_HTTP_CLIENT_REQUEST_ME(addQuery, ZEND_ACC_PUBLIC)
218 PHP_HTTP_CLIENT_REQUEST_ME(getContentType, ZEND_ACC_PUBLIC)
219 PHP_HTTP_CLIENT_REQUEST_ME(setContentType, ZEND_ACC_PUBLIC)
220 EMPTY_FUNCTION_ENTRY
221 };
222
223 PHP_MINIT_FUNCTION(http_client_request)
224 {
225 PHP_HTTP_REGISTER_CLASS(http\\Client, Request, http_client_request, php_http_message_class_entry, 0);
226
227 return SUCCESS;
228 }
229
230 /*
231 * Local variables:
232 * tab-width: 4
233 * c-basic-offset: 4
234 * End:
235 * vim600: noet sw=4 ts=4 fdm=marker
236 * vim<600: noet sw=4 ts=4
237 */
238