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(void *zpp TSRMLS_DC
, int argc
, va_list argv
, zend_hash_key
*key
)
17 zval
*zfiles
, **name
, **zname
, **error
, **zerror
, **type
, **ztype
, **size
, **zsize
, **tmp_name
= zpp
;
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 (SUCCESS
== zend_hash_index_find(Z_ARRVAL_PP(name
), key
->h
, (void *) &zname
)
28 && SUCCESS
== zend_hash_index_find(Z_ARRVAL_PP(size
), key
->h
, (void *) &zsize
)
29 && SUCCESS
== zend_hash_index_find(Z_ARRVAL_PP(type
), key
->h
, (void *) &ztype
)
30 && SUCCESS
== zend_hash_index_find(Z_ARRVAL_PP(error
), key
->h
, (void *) &zerror
)
37 Z_ADDREF_PP(tmp_name
);
38 add_assoc_zval_ex(entry
, ZEND_STRS("file"), *tmp_name
);
40 add_assoc_zval_ex(entry
, ZEND_STRS("name"), *zname
);
42 add_assoc_zval_ex(entry
, ZEND_STRS("size"), *zsize
);
44 add_assoc_zval_ex(entry
, ZEND_STRS("type"), *ztype
);
46 add_assoc_zval_ex(entry
, ZEND_STRS("error"), *zerror
);
48 if (SUCCESS
== zend_hash_quick_find(Z_ARRVAL_P(zfiles
), file_key
->arKey
, file_key
->nKeyLength
, file_key
->h
, (void *) &array
)) {
49 add_next_index_zval(*array
, entry
);
55 add_next_index_zval(tmp
, entry
);
56 zend_hash_quick_update(Z_ARRVAL_P(zfiles
), file_key
->arKey
, file_key
->nKeyLength
, file_key
->h
, (void *) &tmp
, sizeof(zval
*), NULL
);
60 return ZEND_HASH_APPLY_KEEP
;
63 static int grab_files(void *zpp TSRMLS_DC
, int argc
, va_list argv
, zend_hash_key
*key
)
65 zval
*zfiles
, **name
, **tmp_name
, **error
, **type
, **size
, **val
= zpp
;
67 zfiles
= (zval
*) va_arg(argv
, zval
*);
69 if (Z_TYPE_PP(val
) == IS_ARRAY
70 && SUCCESS
== zend_hash_find(Z_ARRVAL_PP(val
), ZEND_STRS("tmp_name"), (void *) &tmp_name
)
71 && SUCCESS
== zend_hash_find(Z_ARRVAL_PP(val
), ZEND_STRS("name"), (void *) &name
)
72 && SUCCESS
== zend_hash_find(Z_ARRVAL_PP(val
), ZEND_STRS("size"), (void *) &size
)
73 && SUCCESS
== zend_hash_find(Z_ARRVAL_PP(val
), ZEND_STRS("type"), (void *) &type
)
74 && SUCCESS
== zend_hash_find(Z_ARRVAL_PP(val
), ZEND_STRS("error"), (void *) &error
)
78 if (Z_TYPE_PP(tmp_name
) == IS_ARRAY
&& (count
= zend_hash_num_elements(Z_ARRVAL_PP(tmp_name
))) > 1) {
79 if (count
== zend_hash_num_elements(Z_ARRVAL_PP(name
))
80 && count
== zend_hash_num_elements(Z_ARRVAL_PP(size
))
81 && count
== zend_hash_num_elements(Z_ARRVAL_PP(type
))
82 && count
== zend_hash_num_elements(Z_ARRVAL_PP(error
))
84 zend_hash_apply_with_arguments(Z_ARRVAL_PP(tmp_name
) TSRMLS_CC
, grab_file
, 6, zfiles
, key
, name
, size
, type
, error
);
87 return ZEND_HASH_APPLY_STOP
;
93 MAKE_COPY_ZVAL(val
, cpy
);
94 if (SUCCESS
== zend_hash_find(Z_ARRVAL_P(cpy
), ZEND_STRS("tmp_name"), (void *) &tmp
)) {
96 add_assoc_zval_ex(cpy
, ZEND_STRS("file"), *tmp
);
97 zend_hash_del_key_or_index(Z_ARRVAL_P(cpy
), ZEND_STRS("tmp_name"), 0, HASH_DEL_KEY
);
99 if (key
->nKeyLength
> 0) {
100 zend_hash_quick_update(Z_ARRVAL_P(zfiles
), key
->arKey
, key
->nKeyLength
, key
->h
, (void *) &cpy
, sizeof(zval
*), NULL
);
102 zend_hash_index_update(Z_ARRVAL_P(zfiles
), key
->h
, (void *) &cpy
, sizeof(zval
*), NULL
);
107 return ZEND_HASH_APPLY_KEEP
;
110 #define PHP_HTTP_ENV_REQUEST_OBJECT_INIT(obj) \
112 if (!obj->message) { \
113 obj->message = php_http_message_init_env(NULL, PHP_HTTP_REQUEST TSRMLS_CC); \
118 ZEND_BEGIN_ARG_INFO_EX(ai_HttpEnvRequest___construct
, 0, 0, 0)
120 static PHP_METHOD(HttpEnvRequest
, __construct
)
122 php_http_message_object_t
*obj
;
125 php_http_expect(SUCCESS
== zend_parse_parameters_none(), invalid_arg
, return);
127 obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
130 php_http_expect(obj
->message
= php_http_message_init_env(obj
->message
, PHP_HTTP_REQUEST TSRMLS_CC
), unexpected_val
, return);
132 zsg
= php_http_env_get_superglobal(ZEND_STRL("_GET") TSRMLS_CC
);
134 object_init_ex(zqs
, php_http_querystring_class_entry
);
135 php_http_expect(SUCCESS
== php_http_querystring_ctor(zqs
, zsg TSRMLS_CC
), unexpected_val
,
139 zend_update_property(php_http_env_request_class_entry
, getThis(), ZEND_STRL("query"), zqs TSRMLS_CC
);
142 zsg
= php_http_env_get_superglobal(ZEND_STRL("_POST") TSRMLS_CC
);
144 object_init_ex(zqs
, php_http_querystring_class_entry
);
145 php_http_expect(SUCCESS
== php_http_querystring_ctor(zqs
, zsg TSRMLS_CC
), unexpected_val
,
149 zend_update_property(php_http_env_request_class_entry
, getThis(), ZEND_STRL("form"), zqs TSRMLS_CC
);
152 zsg
= php_http_env_get_superglobal(ZEND_STRL("_COOKIE") TSRMLS_CC
);
154 object_init_ex(zqs
, php_http_querystring_class_entry
);
155 php_http_expect(SUCCESS
== php_http_querystring_ctor(zqs
, zsg TSRMLS_CC
), unexpected_val
,
159 zend_update_property(php_http_env_request_class_entry
, getThis(), ZEND_STRL("cookie"), zqs TSRMLS_CC
);
164 if ((zsg
= php_http_env_get_superglobal(ZEND_STRL("_FILES") TSRMLS_CC
))) {
165 zend_hash_apply_with_arguments(Z_ARRVAL_P(zsg
) TSRMLS_CC
, grab_files
, 1, zqs
);
167 zend_update_property(php_http_env_request_class_entry
, getThis(), ZEND_STRL("files"), zqs TSRMLS_CC
);
171 #define call_querystring_get(prop) \
173 zend_fcall_info fci; \
174 zend_fcall_info_cache fcc; \
175 zval *rv = NULL, mn, ***args = ecalloc(sizeof(zval **), ZEND_NUM_ARGS()); \
176 zval *qs = zend_read_property(Z_OBJCE_P(getThis()), getThis(), ZEND_STRL(prop), 0 TSRMLS_CC); \
181 add_next_index_zval(&mn, qs); \
182 add_next_index_stringl(&mn, ZEND_STRL("get"), 1); \
183 zend_fcall_info_init(&mn, 0, &fci, &fcc, NULL, NULL TSRMLS_CC); \
184 zend_get_parameters_array_ex(ZEND_NUM_ARGS(), args); \
185 zend_fcall_info_argp(&fci TSRMLS_CC, ZEND_NUM_ARGS(), args); \
186 zend_fcall_info_call(&fci, &fcc, &rv, NULL TSRMLS_CC); \
187 zend_fcall_info_args_clear(&fci, 1); \
191 RETVAL_ZVAL(rv, 0, 1); \
195 ZEND_BEGIN_ARG_INFO_EX(ai_HttpEnvRequest_getForm
, 0, 0, 0)
196 ZEND_ARG_INFO(0, name
)
197 ZEND_ARG_INFO(0, type
)
198 ZEND_ARG_INFO(0, defval
)
199 ZEND_ARG_INFO(0, delete)
201 static PHP_METHOD(HttpEnvRequest
, getForm
)
203 if (ZEND_NUM_ARGS()) {
204 call_querystring_get("form");
206 zval
*zform
= zend_read_property(php_http_env_request_class_entry
, getThis(), ZEND_STRL("form"), 0 TSRMLS_CC
);
207 RETURN_ZVAL(zform
, 1, 0);
211 ZEND_BEGIN_ARG_INFO_EX(ai_HttpEnvRequest_getQuery
, 0, 0, 0)
212 ZEND_ARG_INFO(0, name
)
213 ZEND_ARG_INFO(0, type
)
214 ZEND_ARG_INFO(0, defval
)
215 ZEND_ARG_INFO(0, delete)
217 static PHP_METHOD(HttpEnvRequest
, getQuery
)
219 if (ZEND_NUM_ARGS()) {
220 call_querystring_get("query");
222 zval
*zquery
= zend_read_property(php_http_env_request_class_entry
, getThis(), ZEND_STRL("query"), 0 TSRMLS_CC
);
223 RETURN_ZVAL(zquery
, 1, 0);
227 ZEND_BEGIN_ARG_INFO_EX(ai_HttpEnvRequest_getCookie
, 0, 0, 0)
228 ZEND_ARG_INFO(0, name
)
229 ZEND_ARG_INFO(0, type
)
230 ZEND_ARG_INFO(0, defval
)
231 ZEND_ARG_INFO(0, delete)
233 static PHP_METHOD(HttpEnvRequest
, getCookie
)
235 if (ZEND_NUM_ARGS()) {
236 call_querystring_get("cookie");
238 zval
*zcookie
= zend_read_property(php_http_env_request_class_entry
, getThis(), ZEND_STRL("cookie"), 0 TSRMLS_CC
);
239 RETURN_ZVAL(zcookie
, 1, 0);
243 ZEND_BEGIN_ARG_INFO_EX(ai_HttpEnvRequest_getFiles
, 0, 0, 0)
245 static PHP_METHOD(HttpEnvRequest
, getFiles
)
247 if (SUCCESS
== zend_parse_parameters_none()) {
248 zval
*zfiles
= zend_read_property(php_http_env_request_class_entry
, getThis(), ZEND_STRL("files"), 0 TSRMLS_CC
);
249 RETURN_ZVAL(zfiles
, 1, 0);
253 static zend_function_entry php_http_env_request_methods
[] = {
254 PHP_ME(HttpEnvRequest
, __construct
, ai_HttpEnvRequest___construct
, ZEND_ACC_PUBLIC
|ZEND_ACC_CTOR
)
255 PHP_ME(HttpEnvRequest
, getForm
, ai_HttpEnvRequest_getForm
, ZEND_ACC_PUBLIC
)
256 PHP_ME(HttpEnvRequest
, getQuery
, ai_HttpEnvRequest_getQuery
, ZEND_ACC_PUBLIC
)
257 PHP_ME(HttpEnvRequest
, getCookie
, ai_HttpEnvRequest_getCookie
, ZEND_ACC_PUBLIC
)
258 PHP_ME(HttpEnvRequest
, getFiles
, ai_HttpEnvRequest_getFiles
, ZEND_ACC_PUBLIC
)
262 zend_class_entry
*php_http_env_request_class_entry
;
264 PHP_MINIT_FUNCTION(http_env_request
)
266 zend_class_entry ce
= {0};
268 INIT_NS_CLASS_ENTRY(ce
, "http\\Env", "Request", php_http_env_request_methods
);
269 php_http_env_request_class_entry
= zend_register_internal_class_ex(&ce
, php_http_message_class_entry
, NULL TSRMLS_CC
);
271 zend_declare_property_null(php_http_env_request_class_entry
, ZEND_STRL("query"), ZEND_ACC_PROTECTED TSRMLS_CC
);
272 zend_declare_property_null(php_http_env_request_class_entry
, ZEND_STRL("form"), ZEND_ACC_PROTECTED TSRMLS_CC
);
273 zend_declare_property_null(php_http_env_request_class_entry
, ZEND_STRL("cookie"), ZEND_ACC_PROTECTED TSRMLS_CC
);
274 zend_declare_property_null(php_http_env_request_class_entry
, ZEND_STRL("files"), ZEND_ACC_PROTECTED TSRMLS_CC
);
284 * vim600: noet sw=4 ts=4 fdm=marker
285 * vim<600: noet sw=4 ts=4