fb2b84c770c5ad92652b198b278822b457cd4756
[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 *ctype;
84 int ct_len;
85
86 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &ctype, &ct_len)) {
87 int invalid = 0;
88
89 if (ct_len) {
90 PHP_HTTP_CHECK_CONTENT_TYPE(ctype, invalid = 1);
91 }
92
93 if (!invalid) {
94 zend_update_property_stringl(php_http_client_request_class_entry, getThis(), ZEND_STRL("contentType"), ctype, ct_len TSRMLS_CC);
95 }
96 }
97 RETVAL_ZVAL(getThis(), 1, 0);
98 }
99
100 PHP_METHOD(HttpClientRequest, getContentType)
101 {
102 if (SUCCESS == zend_parse_parameters_none()) {
103 RETURN_PROP(php_http_client_request_class_entry, "contentType");
104 }
105 RETURN_FALSE;
106 }
107
108 PHP_METHOD(HttpClientRequest, setQuery)
109 {
110 zval *qdata = NULL;
111
112 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z!", &qdata)) {
113 if ((!qdata) || Z_TYPE_P(qdata) == IS_NULL) {
114 zend_update_property_stringl(php_http_client_request_class_entry, getThis(), ZEND_STRL("query"), "", 0 TSRMLS_CC);
115 } else if ((Z_TYPE_P(qdata) == IS_ARRAY) || (Z_TYPE_P(qdata) == IS_OBJECT)) {
116 char *query_data_str = NULL;
117 size_t query_data_len;
118
119 if (SUCCESS == php_http_url_encode_hash(HASH_OF(qdata), NULL, 0, &query_data_str, &query_data_len TSRMLS_CC)) {
120 zend_update_property_stringl(php_http_client_request_class_entry, getThis(), ZEND_STRL("query"), query_data_str, query_data_len TSRMLS_CC);
121 efree(query_data_str);
122 }
123 } else {
124 zval *data = php_http_ztyp(IS_STRING, qdata);
125
126 zend_update_property_stringl(php_http_client_request_class_entry, getThis(), ZEND_STRL("query"), Z_STRVAL_P(data), Z_STRLEN_P(data) TSRMLS_CC);
127 zval_ptr_dtor(&data);
128 }
129 }
130 RETVAL_ZVAL(getThis(), 1, 0);
131 }
132
133 PHP_METHOD(HttpClientRequest, getQuery)
134 {
135 if (SUCCESS == zend_parse_parameters_none()) {
136 RETURN_PROP(php_http_client_request_class_entry, "query");
137 }
138 RETURN_FALSE;
139 }
140
141 PHP_METHOD(HttpClientRequest, addQuery)
142 {
143 zval *qdata;
144
145 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "a/", &qdata)) {
146 char *query_data_str = NULL;
147 size_t query_data_len = 0;
148 zval *old_qdata = php_http_ztyp(IS_STRING, zend_read_property(php_http_client_request_class_entry, getThis(), ZEND_STRL("query"), 0 TSRMLS_CC));
149
150 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)) {
151 zend_update_property_stringl(php_http_client_request_class_entry, getThis(), ZEND_STRL("query"), query_data_str, query_data_len TSRMLS_CC);
152 efree(query_data_str);
153 }
154
155 zval_ptr_dtor(&old_qdata);
156 }
157 RETVAL_ZVAL(getThis(), 1, 0);
158
159 }
160
161
162 zend_class_entry *php_http_client_request_class_entry;
163 zend_function_entry php_http_client_request_method_entry[] = {
164 PHP_HTTP_CLIENT_REQUEST_ME(__construct, ZEND_ACC_PUBLIC|ZEND_ACC_CTOR)
165 PHP_HTTP_CLIENT_REQUEST_ME(getQuery, ZEND_ACC_PUBLIC)
166 PHP_HTTP_CLIENT_REQUEST_ME(setQuery, ZEND_ACC_PUBLIC)
167 PHP_HTTP_CLIENT_REQUEST_ME(addQuery, ZEND_ACC_PUBLIC)
168 PHP_HTTP_CLIENT_REQUEST_ME(getContentType, ZEND_ACC_PUBLIC)
169 PHP_HTTP_CLIENT_REQUEST_ME(setContentType, ZEND_ACC_PUBLIC)
170 EMPTY_FUNCTION_ENTRY
171 };
172
173 PHP_MINIT_FUNCTION(http_client_request)
174 {
175 PHP_HTTP_REGISTER_CLASS(http\\Client, Request, http_client_request, php_http_message_class_entry, 0);
176
177 zend_declare_property_string(php_http_client_request_class_entry, ZEND_STRL("query"), "", ZEND_ACC_PROTECTED TSRMLS_CC);
178 zend_declare_property_string(php_http_client_request_class_entry, ZEND_STRL("contentType"), "", ZEND_ACC_PROTECTED TSRMLS_CC);
179
180 return SUCCESS;
181 }
182
183 /*
184 * Local variables:
185 * tab-width: 4
186 * c-basic-offset: 4
187 * End:
188 * vim600: noet sw=4 ts=4 fdm=marker
189 * vim<600: noet sw=4 ts=4
190 */
191