fixes for windows and 5.3 compatibility
[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;
131
132 obj->message = php_http_message_init_env(obj->message, PHP_HTTP_REQUEST TSRMLS_CC);
133 obj->body.handle = 0;
134
135 if ((zsg = php_http_env_get_superglobal(ZEND_STRL("_GET") TSRMLS_CC))) {
136 zval *zquery;
137
138 MAKE_STD_ZVAL(zquery);
139 object_init_ex(zquery, php_http_querystring_get_class_entry());
140 if (SUCCESS == php_http_querystring_ctor(zquery, zsg TSRMLS_CC)) {
141 zend_update_property(php_http_env_request_class_entry, getThis(), ZEND_STRL("query"), zquery TSRMLS_CC);
142 }
143 zval_ptr_dtor(&zquery);
144 }
145 if ((zsg = php_http_env_get_superglobal(ZEND_STRL("_POST") TSRMLS_CC))) {
146 zval *zpost;
147
148 MAKE_STD_ZVAL(zpost);
149 object_init_ex(zpost, php_http_querystring_get_class_entry());
150 if (SUCCESS == php_http_querystring_ctor(zpost, zsg TSRMLS_CC)) {
151 zend_update_property(php_http_env_request_class_entry, getThis(), ZEND_STRL("form"), zpost TSRMLS_CC);
152 }
153 zval_ptr_dtor(&zpost);
154 }
155 if ((zsg = php_http_env_get_superglobal(ZEND_STRL("_FILES") TSRMLS_CC))) {
156 zval *zfiles;
157
158 MAKE_STD_ZVAL(zfiles);
159 array_init(zfiles);
160 zend_hash_apply_with_arguments(Z_ARRVAL_P(zsg) TSRMLS_CC, grab_files, 1, zfiles);
161
162 zend_update_property(php_http_env_request_class_entry, getThis(), ZEND_STRL("files"), zfiles TSRMLS_CC);
163 zval_ptr_dtor(&zfiles);
164 }
165 }
166 } end_error_handling();
167 }
168
169 PHP_METHOD(HttpEnvRequest, getForm)
170 {
171 if (SUCCESS == zend_parse_parameters_none()) {
172 RETURN_PROP(php_http_env_request_class_entry, "form");
173 }
174 }
175
176 PHP_METHOD(HttpEnvRequest, getQuery)
177 {
178 if (SUCCESS == zend_parse_parameters_none()) {
179 RETURN_PROP(php_http_env_request_class_entry, "query");
180 }
181 }
182
183 PHP_METHOD(HttpEnvRequest, getFiles)
184 {
185 if (SUCCESS == zend_parse_parameters_none()) {
186 RETURN_PROP(php_http_env_request_class_entry, "files");
187 }
188 }
189
190
191 PHP_MINIT_FUNCTION(http_env_request)
192 {
193 PHP_HTTP_REGISTER_CLASS(http\\Env, Request, http_env_request, php_http_message_get_class_entry(), 0);
194 zend_declare_property_null(php_http_env_request_class_entry, ZEND_STRL("query"), ZEND_ACC_PROTECTED TSRMLS_CC);
195 zend_declare_property_null(php_http_env_request_class_entry, ZEND_STRL("form"), ZEND_ACC_PROTECTED TSRMLS_CC);
196 zend_declare_property_null(php_http_env_request_class_entry, ZEND_STRL("files"), ZEND_ACC_PROTECTED TSRMLS_CC);
197
198 return SUCCESS;
199 }
200
201
202 /*
203 * Local variables:
204 * tab-width: 4
205 * c-basic-offset: 4
206 * End:
207 * vim600: noet sw=4 ts=4 fdm=marker
208 * vim<600: noet sw=4 ts=4
209 */