2 +--------------------------------------------------------------------+
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-2014, Michael Wallner <mike@php.net> |
10 +--------------------------------------------------------------------+
13 #include "php_http_api.h"
15 static int grab_file(zval
*tmp_name
, int argc
, va_list argv
, zend_hash_key
*key
)
17 zval
*zfiles
, *name
, *zname
, *error
, *zerror
, *type
, *ztype
, *size
, *zsize
;
18 zend_hash_key
*file_key
;
20 zfiles
= (zval
*) va_arg(argv
, zval
*);
21 file_key
= (zend_hash_key
*) va_arg(argv
, zend_hash_key
*);
22 name
= (zval
*) va_arg(argv
, zval
*);
23 size
= (zval
*) va_arg(argv
, zval
*);
24 type
= (zval
*) va_arg(argv
, zval
*);
25 error
= (zval
*) va_arg(argv
, zval
*);
27 if ((zname
= zend_hash_index_find(Z_ARRVAL_P(name
), key
->h
))
28 && (zsize
= zend_hash_index_find(Z_ARRVAL_P(size
), key
->h
))
29 && (ztype
= zend_hash_index_find(Z_ARRVAL_P(type
), key
->h
))
30 && (zerror
= zend_hash_index_find(Z_ARRVAL_P(error
), key
->h
))
36 Z_TRY_ADDREF_P(tmp_name
);
37 add_assoc_zval_ex(&entry
, ZEND_STRL("file"), tmp_name
);
38 Z_TRY_ADDREF_P(zname
);
39 add_assoc_zval_ex(&entry
, ZEND_STRL("name"), zname
);
40 Z_TRY_ADDREF_P(zsize
);
41 add_assoc_zval_ex(&entry
, ZEND_STRL("size"), zsize
);
42 Z_TRY_ADDREF_P(ztype
);
43 add_assoc_zval_ex(&entry
, ZEND_STRL("type"), ztype
);
44 Z_TRY_ADDREF_P(zerror
);
45 add_assoc_zval_ex(&entry
, ZEND_STRL("error"), zerror
);
47 if (file_key
->key
&& (array
= zend_hash_find(Z_ARRVAL_P(zfiles
), file_key
->key
))) {
48 add_next_index_zval(array
, &entry
);
49 } else if (!file_key
->key
&& (array
= zend_hash_index_find(Z_ARRVAL_P(zfiles
), file_key
->h
))) {
50 add_next_index_zval(array
, &entry
);
55 add_next_index_zval(&tmp
, &entry
);
57 zend_hash_update(Z_ARRVAL_P(zfiles
), file_key
->key
, &tmp
);
59 zend_hash_index_update(Z_ARRVAL_P(zfiles
), file_key
->h
, &tmp
);
64 return ZEND_HASH_APPLY_KEEP
;
67 static int grab_files(zval
*val
, int argc
, va_list argv
, zend_hash_key
*key
)
69 zval
*zfiles
, *name
, *tmp_name
, *error
, *type
, *size
;
71 zfiles
= (zval
*) va_arg(argv
, zval
*);
73 if ((Z_TYPE_P(val
) == IS_ARRAY
)
74 && (tmp_name
= zend_hash_str_find(Z_ARRVAL_P(val
), ZEND_STRL("tmp_name")))
75 && (name
= zend_hash_str_find(Z_ARRVAL_P(val
), ZEND_STRL("name")))
76 && (size
= zend_hash_str_find(Z_ARRVAL_P(val
), ZEND_STRL("size")))
77 && (type
= zend_hash_str_find(Z_ARRVAL_P(val
), ZEND_STRL("type")))
78 && (error
= zend_hash_str_find(Z_ARRVAL_P(val
), ZEND_STRL("error")))
82 if (Z_TYPE_P(tmp_name
) == IS_ARRAY
&& (count
= zend_hash_num_elements(Z_ARRVAL_P(tmp_name
))) > 1) {
83 if (count
== zend_hash_num_elements(Z_ARRVAL_P(name
))
84 && count
== zend_hash_num_elements(Z_ARRVAL_P(size
))
85 && count
== zend_hash_num_elements(Z_ARRVAL_P(type
))
86 && count
== zend_hash_num_elements(Z_ARRVAL_P(error
))
88 zend_hash_apply_with_arguments(Z_ARRVAL_P(tmp_name
), grab_file
, 6, zfiles
, key
, name
, size
, type
, error
);
91 return ZEND_HASH_APPLY_STOP
;
96 ZVAL_DUP(&entry
, val
);
97 if ((tmp
= zend_hash_str_find(Z_ARRVAL_P(val
), ZEND_STRL("tmp_name")))) {
99 add_assoc_zval_ex(&entry
, ZEND_STRL("file"), tmp
);
100 zend_hash_str_del(Z_ARRVAL(entry
), ZEND_STRL("tmp_name"));
103 zend_hash_update(Z_ARRVAL_P(zfiles
), key
->key
, &entry
);
105 zend_hash_index_update(Z_ARRVAL_P(zfiles
), key
->h
, &entry
);
110 return ZEND_HASH_APPLY_KEEP
;
113 #define PHP_HTTP_ENV_REQUEST_OBJECT_INIT(obj) \
115 if (!obj->message) { \
116 obj->message = php_http_message_init_env(NULL, PHP_HTTP_REQUEST); \
121 ZEND_BEGIN_ARG_INFO_EX(ai_HttpEnvRequest___construct
, 0, 0, 0)
123 static PHP_METHOD(HttpEnvRequest
, __construct
)
125 php_http_message_object_t
*obj
;
128 php_http_expect(SUCCESS
== zend_parse_parameters_none(), invalid_arg
, return);
130 obj
= PHP_HTTP_OBJ(NULL
, getThis());
133 php_http_expect(obj
->message
= php_http_message_init_env(obj
->message
, PHP_HTTP_REQUEST
), unexpected_val
, return);
135 zsg
= php_http_env_get_superglobal(ZEND_STRL("_GET"));
136 object_init_ex(&zqs
, php_http_querystring_class_entry
);
137 php_http_expect(SUCCESS
== php_http_querystring_ctor(&zqs
, zsg
), unexpected_val
, return);
138 zend_update_property(php_http_env_request_class_entry
, getThis(), ZEND_STRL("query"), &zqs
);
141 zsg
= php_http_env_get_superglobal(ZEND_STRL("_POST"));
142 object_init_ex(&zqs
, php_http_querystring_class_entry
);
143 php_http_expect(SUCCESS
== php_http_querystring_ctor(&zqs
, zsg
), unexpected_val
, return);
144 zend_update_property(php_http_env_request_class_entry
, getThis(), ZEND_STRL("form"), &zqs
);
147 zsg
= php_http_env_get_superglobal(ZEND_STRL("_COOKIE"));
148 object_init_ex(&zqs
, php_http_querystring_class_entry
);
149 php_http_expect(SUCCESS
== php_http_querystring_ctor(&zqs
, zsg
), unexpected_val
, return);
150 zend_update_property(php_http_env_request_class_entry
, getThis(), ZEND_STRL("cookie"), &zqs
);
154 if ((zsg
= php_http_env_get_superglobal(ZEND_STRL("_FILES")))) {
155 zend_hash_apply_with_arguments(Z_ARRVAL_P(zsg
), grab_files
, 1, &zqs
);
157 zend_update_property(php_http_env_request_class_entry
, getThis(), ZEND_STRL("files"), &zqs
);
161 #define call_querystring_get(prop) \
163 zend_fcall_info fci; \
164 zend_fcall_info_cache fcc; \
165 zval rv, mn, *args = ecalloc(sizeof(zval), ZEND_NUM_ARGS()); \
166 zval *this_ptr = getThis(); \
167 zval qs_tmp, *qs = zend_read_property(Z_OBJCE_P(this_ptr), this_ptr, ZEND_STRL(prop), 0, &qs_tmp); \
171 Z_TRY_ADDREF_P(qs); \
172 add_next_index_zval(&mn, qs); \
173 add_next_index_stringl(&mn, ZEND_STRL("get")); \
174 zend_fcall_info_init(&mn, 0, &fci, &fcc, NULL, NULL); \
175 zend_get_parameters_array_ex(ZEND_NUM_ARGS(), args); \
176 zend_fcall_info_argp(&fci, ZEND_NUM_ARGS(), args); \
177 zend_fcall_info_call(&fci, &fcc, &rv, NULL); \
178 zend_fcall_info_args_clear(&fci, 1); \
181 RETVAL_ZVAL(&rv, 0, 1); \
184 ZEND_BEGIN_ARG_INFO_EX(ai_HttpEnvRequest_getForm
, 0, 0, 0)
185 ZEND_ARG_INFO(0, name
)
186 ZEND_ARG_INFO(0, type
)
187 ZEND_ARG_INFO(0, defval
)
188 ZEND_ARG_INFO(0, delete)
190 static PHP_METHOD(HttpEnvRequest
, getForm
)
192 if (ZEND_NUM_ARGS()) {
193 call_querystring_get("form");
195 zval zform_tmp
, *zform
= zend_read_property(php_http_env_request_class_entry
, getThis(), ZEND_STRL("form"), 0, &zform_tmp
);
196 RETURN_ZVAL(zform
, 1, 0);
200 ZEND_BEGIN_ARG_INFO_EX(ai_HttpEnvRequest_getQuery
, 0, 0, 0)
201 ZEND_ARG_INFO(0, name
)
202 ZEND_ARG_INFO(0, type
)
203 ZEND_ARG_INFO(0, defval
)
204 ZEND_ARG_INFO(0, delete)
206 static PHP_METHOD(HttpEnvRequest
, getQuery
)
208 if (ZEND_NUM_ARGS()) {
209 call_querystring_get("query");
211 zval zquery_tmp
, *zquery
= zend_read_property(php_http_env_request_class_entry
, getThis(), ZEND_STRL("query"), 0, &zquery_tmp
);
212 RETURN_ZVAL(zquery
, 1, 0);
216 ZEND_BEGIN_ARG_INFO_EX(ai_HttpEnvRequest_getCookie
, 0, 0, 0)
217 ZEND_ARG_INFO(0, name
)
218 ZEND_ARG_INFO(0, type
)
219 ZEND_ARG_INFO(0, defval
)
220 ZEND_ARG_INFO(0, delete)
222 static PHP_METHOD(HttpEnvRequest
, getCookie
)
224 if (ZEND_NUM_ARGS()) {
225 call_querystring_get("cookie");
227 zval zcookie_tmp
, *zcookie
= zend_read_property(php_http_env_request_class_entry
, getThis(), ZEND_STRL("cookie"), 0, &zcookie_tmp
);
228 RETURN_ZVAL(zcookie
, 1, 0);
232 ZEND_BEGIN_ARG_INFO_EX(ai_HttpEnvRequest_getFiles
, 0, 0, 0)
234 static PHP_METHOD(HttpEnvRequest
, getFiles
)
236 if (SUCCESS
== zend_parse_parameters_none()) {
237 zval zfiles_tmp
, *zfiles
= zend_read_property(php_http_env_request_class_entry
, getThis(), ZEND_STRL("files"), 0, &zfiles_tmp
);
238 RETURN_ZVAL(zfiles
, 1, 0);
242 static zend_function_entry php_http_env_request_methods
[] = {
243 PHP_ME(HttpEnvRequest
, __construct
, ai_HttpEnvRequest___construct
, ZEND_ACC_PUBLIC
|ZEND_ACC_CTOR
)
244 PHP_ME(HttpEnvRequest
, getForm
, ai_HttpEnvRequest_getForm
, ZEND_ACC_PUBLIC
)
245 PHP_ME(HttpEnvRequest
, getQuery
, ai_HttpEnvRequest_getQuery
, ZEND_ACC_PUBLIC
)
246 PHP_ME(HttpEnvRequest
, getCookie
, ai_HttpEnvRequest_getCookie
, ZEND_ACC_PUBLIC
)
247 PHP_ME(HttpEnvRequest
, getFiles
, ai_HttpEnvRequest_getFiles
, ZEND_ACC_PUBLIC
)
251 zend_class_entry
*php_http_env_request_class_entry
;
253 PHP_MINIT_FUNCTION(http_env_request
)
255 zend_class_entry ce
= {0};
257 INIT_NS_CLASS_ENTRY(ce
, "http\\Env", "Request", php_http_env_request_methods
);
258 php_http_env_request_class_entry
= zend_register_internal_class_ex(&ce
, php_http_message_class_entry
);
260 zend_declare_property_null(php_http_env_request_class_entry
, ZEND_STRL("query"), ZEND_ACC_PROTECTED
);
261 zend_declare_property_null(php_http_env_request_class_entry
, ZEND_STRL("form"), ZEND_ACC_PROTECTED
);
262 zend_declare_property_null(php_http_env_request_class_entry
, ZEND_STRL("cookie"), ZEND_ACC_PROTECTED
);
263 zend_declare_property_null(php_http_env_request_class_entry
, ZEND_STRL("files"), ZEND_ACC_PROTECTED
);
273 * vim600: noet sw=4 ts=4 fdm=marker
274 * vim<600: noet sw=4 ts=4