no need for separate property
[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 if ((!qdata) || Z_TYPE_P(qdata) == IS_NULL) {
122 zend_update_property_stringl(php_http_client_request_class_entry, getThis(), ZEND_STRL("query"), "", 0 TSRMLS_CC);
123 } else if ((Z_TYPE_P(qdata) == IS_ARRAY) || (Z_TYPE_P(qdata) == IS_OBJECT)) {
124 char *query_data_str = NULL;
125 size_t query_data_len;
126
127 if (SUCCESS == php_http_url_encode_hash(HASH_OF(qdata), NULL, 0, &query_data_str, &query_data_len TSRMLS_CC)) {
128 zend_update_property_stringl(php_http_client_request_class_entry, getThis(), ZEND_STRL("query"), query_data_str, query_data_len TSRMLS_CC);
129 efree(query_data_str);
130 }
131 } else {
132 zval *data = php_http_ztyp(IS_STRING, qdata);
133
134 zend_update_property_stringl(php_http_client_request_class_entry, getThis(), ZEND_STRL("query"), Z_STRVAL_P(data), Z_STRLEN_P(data) TSRMLS_CC);
135 zval_ptr_dtor(&data);
136 }
137 }
138 RETVAL_ZVAL(getThis(), 1, 0);
139 }
140
141 PHP_METHOD(HttpClientRequest, getQuery)
142 {
143 if (SUCCESS == zend_parse_parameters_none()) {
144 RETURN_PROP(php_http_client_request_class_entry, "query");
145 }
146 RETURN_FALSE;
147 }
148
149 PHP_METHOD(HttpClientRequest, addQuery)
150 {
151 zval *qdata;
152
153 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "a/", &qdata)) {
154 char *query_data_str = NULL;
155 size_t query_data_len = 0;
156 zval *old_qdata = php_http_ztyp(IS_STRING, zend_read_property(php_http_client_request_class_entry, getThis(), ZEND_STRL("query"), 0 TSRMLS_CC));
157
158 if (SUCCESS == php_http_url_encode_hash(Z_ARRVAL_P(qdata), Z_STRVAL_P(old_qdata), Z_STRLEN_P(old_qdata), &query_data_str, &query_data_len TSRMLS_CC)) {
159 zend_update_property_stringl(php_http_client_request_class_entry, getThis(), ZEND_STRL("query"), query_data_str, query_data_len TSRMLS_CC);
160 efree(query_data_str);
161 }
162
163 zval_ptr_dtor(&old_qdata);
164 }
165 RETVAL_ZVAL(getThis(), 1, 0);
166
167 }
168
169
170 zend_class_entry *php_http_client_request_class_entry;
171 zend_function_entry php_http_client_request_method_entry[] = {
172 PHP_HTTP_CLIENT_REQUEST_ME(__construct, ZEND_ACC_PUBLIC|ZEND_ACC_CTOR)
173 PHP_HTTP_CLIENT_REQUEST_ME(getQuery, ZEND_ACC_PUBLIC)
174 PHP_HTTP_CLIENT_REQUEST_ME(setQuery, ZEND_ACC_PUBLIC)
175 PHP_HTTP_CLIENT_REQUEST_ME(addQuery, ZEND_ACC_PUBLIC)
176 PHP_HTTP_CLIENT_REQUEST_ME(getContentType, ZEND_ACC_PUBLIC)
177 PHP_HTTP_CLIENT_REQUEST_ME(setContentType, ZEND_ACC_PUBLIC)
178 EMPTY_FUNCTION_ENTRY
179 };
180
181 PHP_MINIT_FUNCTION(http_client_request)
182 {
183 PHP_HTTP_REGISTER_CLASS(http\\Client, Request, http_client_request, php_http_message_class_entry, 0);
184
185 zend_declare_property_string(php_http_client_request_class_entry, ZEND_STRL("query"), "", ZEND_ACC_PROTECTED TSRMLS_CC);
186
187 return SUCCESS;
188 }
189
190 /*
191 * Local variables:
192 * tab-width: 4
193 * c-basic-offset: 4
194 * End:
195 * vim600: noet sw=4 ts=4 fdm=marker
196 * vim<600: noet sw=4 ts=4
197 */
198