ensure these properties are always set
[m6w6/ext-http] / php_http_env_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
16 #undef PHP_HTTP_BEGIN_ARGS
17 #undef PHP_HTTP_EMPTY_ARGS
18 #define PHP_HTTP_BEGIN_ARGS(method, req_args) PHP_HTTP_BEGIN_ARGS_EX(HttpEnvRequest, method, 0, req_args)
19 #define PHP_HTTP_EMPTY_ARGS(method) PHP_HTTP_EMPTY_ARGS_EX(HttpEnvRequest, method, 0)
20 #define PHP_HTTP_ENV_REQUEST_ME(method, visibility) PHP_ME(HttpEnvRequest, method, PHP_HTTP_ARGS(HttpEnvRequest, method), visibility)
21
22 PHP_HTTP_EMPTY_ARGS(__construct);
23 PHP_HTTP_EMPTY_ARGS(getForm);
24 PHP_HTTP_EMPTY_ARGS(getQuery);
25 PHP_HTTP_EMPTY_ARGS(getFiles);
26
27 static zend_class_entry *php_http_env_request_class_entry;
28
29 zend_class_entry *php_http_env_request_get_class_entry(void)
30 {
31 return php_http_env_request_class_entry;
32 }
33
34 zend_function_entry php_http_env_request_method_entry[] = {
35 PHP_HTTP_ENV_REQUEST_ME(__construct, ZEND_ACC_PUBLIC|ZEND_ACC_CTOR)
36 PHP_HTTP_ENV_REQUEST_ME(getForm, ZEND_ACC_PUBLIC)
37 PHP_HTTP_ENV_REQUEST_ME(getQuery, ZEND_ACC_PUBLIC)
38 PHP_HTTP_ENV_REQUEST_ME(getFiles, ZEND_ACC_PUBLIC)
39
40 EMPTY_FUNCTION_ENTRY
41 };
42
43 static int grab_file(void *zpp TSRMLS_DC, int argc, va_list argv, zend_hash_key *key)
44 {
45 zval *zfiles, **name, **zname, **error, **zerror, **type, **ztype, **size, **zsize, **tmp_name = zpp;
46 zend_hash_key *file_key;
47
48 zfiles = (zval *) va_arg(argv, zval *);
49 file_key = (zend_hash_key *) va_arg(argv, zend_hash_key *);
50 name = (zval **) va_arg(argv, zval **);
51 size = (zval **) va_arg(argv, zval **);
52 type = (zval **) va_arg(argv, zval **);
53 error = (zval **) va_arg(argv, zval **);
54
55 if (SUCCESS == zend_hash_index_find(Z_ARRVAL_PP(name), key->h, (void *) &zname)
56 && SUCCESS == zend_hash_index_find(Z_ARRVAL_PP(size), key->h, (void *) &zsize)
57 && SUCCESS == zend_hash_index_find(Z_ARRVAL_PP(type), key->h, (void *) &ztype)
58 && SUCCESS == zend_hash_index_find(Z_ARRVAL_PP(error), key->h, (void *) &zerror)
59 ) {
60 zval *entry;
61
62 MAKE_STD_ZVAL(entry);
63 array_init(entry);
64
65 Z_ADDREF_PP(tmp_name);
66 add_assoc_zval_ex(entry, ZEND_STRS("file"), *tmp_name);
67 Z_ADDREF_PP(zname);
68 add_assoc_zval_ex(entry, ZEND_STRS("name"), *zname);
69 Z_ADDREF_PP(zsize);
70 add_assoc_zval_ex(entry, ZEND_STRS("size"), *zsize);
71 Z_ADDREF_PP(ztype);
72 add_assoc_zval_ex(entry, ZEND_STRS("type"), *ztype);
73 Z_ADDREF_PP(zerror);
74 add_assoc_zval_ex(entry, ZEND_STRS("error"), *zerror);
75
76 zend_hash_quick_update(Z_ARRVAL_P(zfiles), file_key->arKey, file_key->nKeyLength, file_key->h, (void *) &entry, sizeof(zval *), NULL);
77 }
78
79 return ZEND_HASH_APPLY_KEEP;
80 }
81
82 static int grab_files(void *zpp TSRMLS_DC, int argc, va_list argv, zend_hash_key *key)
83 {
84 zval *zfiles, **name, **tmp_name, **error, **type, **size, **val = zpp;
85
86 zfiles = (zval *) va_arg(argv, zval *);
87
88 if (Z_TYPE_PP(val) == IS_ARRAY
89 && SUCCESS == zend_hash_find(Z_ARRVAL_PP(val), ZEND_STRS("tmp_name"), (void *) &tmp_name)
90 && SUCCESS == zend_hash_find(Z_ARRVAL_PP(val), ZEND_STRS("name"), (void *) &name)
91 && SUCCESS == zend_hash_find(Z_ARRVAL_PP(val), ZEND_STRS("size"), (void *) &size)
92 && SUCCESS == zend_hash_find(Z_ARRVAL_PP(val), ZEND_STRS("type"), (void *) &type)
93 && SUCCESS == zend_hash_find(Z_ARRVAL_PP(val), ZEND_STRS("error"), (void *) &error)
94 ) {
95 int count;
96
97 if (Z_TYPE_PP(tmp_name) == IS_ARRAY && (count = zend_hash_num_elements(Z_ARRVAL_PP(tmp_name))) > 1) {
98 if (count == zend_hash_num_elements(Z_ARRVAL_PP(name))
99 && count == zend_hash_num_elements(Z_ARRVAL_PP(size))
100 && count == zend_hash_num_elements(Z_ARRVAL_PP(type))
101 && count == zend_hash_num_elements(Z_ARRVAL_PP(error))
102 ) {
103 zend_hash_apply_with_arguments(Z_ARRVAL_PP(tmp_name) TSRMLS_CC, grab_file, 6, zfiles, key, name, size, type, error);
104 } else {
105 /* wat?! */
106 return ZEND_HASH_APPLY_STOP;
107 }
108 } else {
109 zval *cpy, **tmp;
110
111 MAKE_STD_ZVAL(cpy);
112 MAKE_COPY_ZVAL(val, cpy);
113 if (SUCCESS == zend_hash_find(Z_ARRVAL_P(cpy), ZEND_STRS("tmp_name"), (void *) &tmp)) {
114 Z_ADDREF_PP(tmp);
115 add_assoc_zval_ex(cpy, ZEND_STRS("file"), *tmp);
116 zend_hash_del_key_or_index(Z_ARRVAL_P(cpy), ZEND_STRS("tmp_name"), 0, HASH_DEL_KEY);
117 }
118 zend_hash_quick_update(Z_ARRVAL_P(zfiles), key->arKey, key->nKeyLength, key->h, (void *) &cpy, sizeof(zval *), NULL);
119 }
120 }
121
122 return ZEND_HASH_APPLY_KEEP;
123 }
124
125 PHP_METHOD(HttpEnvRequest, __construct)
126 {
127 with_error_handling(EH_THROW, php_http_exception_get_class_entry()) {
128 if (SUCCESS == zend_parse_parameters_none()) {
129 php_http_message_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
130 zval *zsg, *zqs;
131
132 obj->message = php_http_message_init_env(obj->message, PHP_HTTP_REQUEST TSRMLS_CC);
133 obj->body.handle = 0;
134
135 zsg = php_http_env_get_superglobal(ZEND_STRL("_GET") TSRMLS_CC);
136 MAKE_STD_ZVAL(zqs);
137 object_init_ex(zqs, php_http_querystring_get_class_entry());
138 if (SUCCESS == php_http_querystring_ctor(zqs, zsg TSRMLS_CC)) {
139 zend_update_property(php_http_env_request_class_entry, getThis(), ZEND_STRL("query"), zqs TSRMLS_CC);
140 }
141 zval_ptr_dtor(&zqs);
142
143 zsg = php_http_env_get_superglobal(ZEND_STRL("_POST") TSRMLS_CC);
144 MAKE_STD_ZVAL(zqs);
145 object_init_ex(zqs, php_http_querystring_get_class_entry());
146 if (SUCCESS == php_http_querystring_ctor(zqs, zsg TSRMLS_CC)) {
147 zend_update_property(php_http_env_request_class_entry, getThis(), ZEND_STRL("form"), zqs TSRMLS_CC);
148 }
149 zval_ptr_dtor(&zqs);
150
151 MAKE_STD_ZVAL(zqs);
152 array_init(zqs);
153 if ((zsg = php_http_env_get_superglobal(ZEND_STRL("_FILES") TSRMLS_CC))) {
154 zend_hash_apply_with_arguments(Z_ARRVAL_P(zsg) TSRMLS_CC, grab_files, 1, zqs);
155 }
156
157 zend_update_property(php_http_env_request_class_entry, getThis(), ZEND_STRL("files"), zqs TSRMLS_CC);
158 zval_ptr_dtor(&zqs);
159 }
160 } end_error_handling();
161 }
162
163 PHP_METHOD(HttpEnvRequest, getForm)
164 {
165 if (SUCCESS == zend_parse_parameters_none()) {
166 RETURN_PROP(php_http_env_request_class_entry, "form");
167 }
168 }
169
170 PHP_METHOD(HttpEnvRequest, getQuery)
171 {
172 if (SUCCESS == zend_parse_parameters_none()) {
173 RETURN_PROP(php_http_env_request_class_entry, "query");
174 }
175 }
176
177 PHP_METHOD(HttpEnvRequest, getFiles)
178 {
179 if (SUCCESS == zend_parse_parameters_none()) {
180 RETURN_PROP(php_http_env_request_class_entry, "files");
181 }
182 }
183
184
185 PHP_MINIT_FUNCTION(http_env_request)
186 {
187 PHP_HTTP_REGISTER_CLASS(http\\Env, Request, http_env_request, php_http_message_get_class_entry(), 0);
188 zend_declare_property_null(php_http_env_request_class_entry, ZEND_STRL("query"), ZEND_ACC_PROTECTED TSRMLS_CC);
189 zend_declare_property_null(php_http_env_request_class_entry, ZEND_STRL("form"), ZEND_ACC_PROTECTED TSRMLS_CC);
190 zend_declare_property_null(php_http_env_request_class_entry, ZEND_STRL("files"), ZEND_ACC_PROTECTED TSRMLS_CC);
191
192 return SUCCESS;
193 }
194
195
196 /*
197 * Local variables:
198 * tab-width: 4
199 * c-basic-offset: 4
200 * End:
201 * vim600: noet sw=4 ts=4 fdm=marker
202 * vim<600: noet sw=4 ts=4
203 */