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-2011, Michael Wallner <mike@php.net> |
10 +--------------------------------------------------------------------+
13 #include "php_http_api.h"
16 zend_class_entry
*php_http_env_request_class_entry
;
18 #undef PHP_HTTP_BEGIN_ARGS
19 #undef PHP_HTTP_EMPTY_ARGS
20 #define PHP_HTTP_BEGIN_ARGS(method, req_args) PHP_HTTP_BEGIN_ARGS_EX(HttpEnvRequest, method, 0, req_args)
21 #define PHP_HTTP_EMPTY_ARGS(method) PHP_HTTP_EMPTY_ARGS_EX(HttpEnvRequest, method, 0)
22 #define PHP_HTTP_ENV_REQUEST_ME(method, visibility) PHP_ME(HttpEnvRequest, method, PHP_HTTP_ARGS(HttpEnvRequest, method), visibility)
24 PHP_HTTP_EMPTY_ARGS(__construct
);
25 PHP_HTTP_EMPTY_ARGS(getForm
);
26 PHP_HTTP_EMPTY_ARGS(getQuery
);
27 PHP_HTTP_EMPTY_ARGS(getFiles
);
29 zend_function_entry php_http_env_request_method_entry
[] = {
30 PHP_HTTP_ENV_REQUEST_ME(__construct
, ZEND_ACC_PUBLIC
|ZEND_ACC_CTOR
)
31 PHP_HTTP_ENV_REQUEST_ME(getForm
, ZEND_ACC_PUBLIC
)
32 PHP_HTTP_ENV_REQUEST_ME(getQuery
, ZEND_ACC_PUBLIC
)
33 PHP_HTTP_ENV_REQUEST_ME(getFiles
, ZEND_ACC_PUBLIC
)
38 static int grab_file(void *zpp TSRMLS_DC
, int argc
, va_list argv
, zend_hash_key
*key
)
40 zval
*zfiles
, **name
, **zname
, **error
, **zerror
, **type
, **ztype
, **size
, **zsize
, **tmp_name
= zpp
;
41 zend_hash_key
*file_key
;
43 zfiles
= (zval
*) va_arg(argv
, zval
*);
44 file_key
= (zend_hash_key
*) va_arg(argv
, zend_hash_key
*);
45 name
= (zval
**) va_arg(argv
, zval
**);
46 size
= (zval
**) va_arg(argv
, zval
**);
47 type
= (zval
**) va_arg(argv
, zval
**);
48 error
= (zval
**) va_arg(argv
, zval
**);
50 if (SUCCESS
== zend_hash_index_find(Z_ARRVAL_PP(name
), key
->h
, (void *) &zname
)
51 && SUCCESS
== zend_hash_index_find(Z_ARRVAL_PP(size
), key
->h
, (void *) &zsize
)
52 && SUCCESS
== zend_hash_index_find(Z_ARRVAL_PP(type
), key
->h
, (void *) &ztype
)
53 && SUCCESS
== zend_hash_index_find(Z_ARRVAL_PP(error
), key
->h
, (void *) &zerror
)
60 Z_ADDREF_PP(tmp_name
);
61 add_assoc_zval_ex(entry
, ZEND_STRS("file"), *tmp_name
);
63 add_assoc_zval_ex(entry
, ZEND_STRS("name"), *zname
);
65 add_assoc_zval_ex(entry
, ZEND_STRS("size"), *zsize
);
67 add_assoc_zval_ex(entry
, ZEND_STRS("type"), *ztype
);
69 add_assoc_zval_ex(entry
, ZEND_STRS("error"), *zerror
);
71 zend_hash_quick_update(Z_ARRVAL_P(zfiles
), file_key
->arKey
, file_key
->nKeyLength
, file_key
->h
, (void *) &entry
, sizeof(zval
*), NULL
);
74 return ZEND_HASH_APPLY_KEEP
;
77 static int grab_files(void *zpp TSRMLS_DC
, int argc
, va_list argv
, zend_hash_key
*key
)
79 zval
*zfiles
, **name
, **tmp_name
, **error
, **type
, **size
, **val
= zpp
;
81 zfiles
= (zval
*) va_arg(argv
, zval
*);
83 if (Z_TYPE_PP(val
) == IS_ARRAY
84 && SUCCESS
== zend_hash_find(Z_ARRVAL_PP(val
), ZEND_STRS("tmp_name"), (void *) &tmp_name
)
85 && SUCCESS
== zend_hash_find(Z_ARRVAL_PP(val
), ZEND_STRS("name"), (void *) &name
)
86 && SUCCESS
== zend_hash_find(Z_ARRVAL_PP(val
), ZEND_STRS("size"), (void *) &size
)
87 && SUCCESS
== zend_hash_find(Z_ARRVAL_PP(val
), ZEND_STRS("type"), (void *) &type
)
88 && SUCCESS
== zend_hash_find(Z_ARRVAL_PP(val
), ZEND_STRS("error"), (void *) &error
)
92 if (Z_TYPE_PP(tmp_name
) == IS_ARRAY
&& (count
= zend_hash_num_elements(Z_ARRVAL_PP(tmp_name
))) > 1) {
93 if (count
== zend_hash_num_elements(Z_ARRVAL_PP(name
))
94 && count
== zend_hash_num_elements(Z_ARRVAL_PP(size
))
95 && count
== zend_hash_num_elements(Z_ARRVAL_PP(type
))
96 && count
== zend_hash_num_elements(Z_ARRVAL_PP(error
))
98 zend_hash_apply_with_arguments(Z_ARRVAL_PP(tmp_name
) TSRMLS_CC
, grab_file
, 6, zfiles
, key
, name
, size
, type
, error
);
101 return ZEND_HASH_APPLY_STOP
;
107 MAKE_COPY_ZVAL(val
, cpy
);
108 if (SUCCESS
== zend_hash_find(Z_ARRVAL_P(cpy
), ZEND_STRS("tmp_name"), (void *) &tmp
)) {
110 add_assoc_zval_ex(cpy
, ZEND_STRS("file"), *tmp
);
111 zend_hash_del_key_or_index(Z_ARRVAL_P(cpy
), ZEND_STRS("tmp_name"), 0, HASH_DEL_KEY
);
113 zend_hash_quick_update(Z_ARRVAL_P(zfiles
), key
->arKey
, key
->nKeyLength
, key
->h
, (void *) &cpy
, sizeof(zval
*), NULL
);
117 return ZEND_HASH_APPLY_KEEP
;
120 PHP_METHOD(HttpEnvRequest
, __construct
)
122 with_error_handling(EH_THROW
, php_http_exception_class_entry
) {
123 if (SUCCESS
== zend_parse_parameters_none()) {
124 php_http_message_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
127 obj
->message
= php_http_message_init_env(obj
->message
, PHP_HTTP_REQUEST TSRMLS_CC
);
129 if ((zsg
= php_http_env_get_superglobal(ZEND_STRL("_GET") TSRMLS_CC
))) {
132 MAKE_STD_ZVAL(zquery
);
133 object_init_ex(zquery
, php_http_querystring_class_entry
);
134 if (SUCCESS
== php_http_querystring_ctor(zquery
, zsg TSRMLS_CC
)) {
135 zend_update_property(php_http_env_request_class_entry
, getThis(), ZEND_STRL("query"), zquery TSRMLS_CC
);
137 zval_ptr_dtor(&zquery
);
139 if ((zsg
= php_http_env_get_superglobal(ZEND_STRL("_POST") TSRMLS_CC
))) {
142 MAKE_STD_ZVAL(zpost
);
143 object_init_ex(zpost
, php_http_querystring_class_entry
);
144 if (SUCCESS
== php_http_querystring_ctor(zpost
, zsg TSRMLS_CC
)) {
145 zend_update_property(php_http_env_request_class_entry
, getThis(), ZEND_STRL("form"), zpost TSRMLS_CC
);
147 zval_ptr_dtor(&zpost
);
149 if ((zsg
= php_http_env_get_superglobal(ZEND_STRL("_FILES") TSRMLS_CC
))) {
152 MAKE_STD_ZVAL(zfiles
);
154 zend_hash_apply_with_arguments(Z_ARRVAL_P(zsg
) TSRMLS_CC
, grab_files
, 1, zfiles
);
156 zend_update_property(php_http_env_request_class_entry
, getThis(), ZEND_STRL("files"), zfiles TSRMLS_CC
);
157 zval_ptr_dtor(&zfiles
);
160 } end_error_handling();
163 PHP_METHOD(HttpEnvRequest
, getForm
)
165 if (SUCCESS
== zend_parse_parameters_none()) {
166 RETURN_PROP(php_http_env_request_class_entry
, "form");
170 PHP_METHOD(HttpEnvRequest
, getQuery
)
172 if (SUCCESS
== zend_parse_parameters_none()) {
173 RETURN_PROP(php_http_env_request_class_entry
, "query");
177 PHP_METHOD(HttpEnvRequest
, getFiles
)
179 if (SUCCESS
== zend_parse_parameters_none()) {
180 RETURN_PROP(php_http_env_request_class_entry
, "files");
185 PHP_MINIT_FUNCTION(http_env_request
)
187 PHP_HTTP_REGISTER_CLASS(http
\\Env
, Request
, http_env_request
, php_http_message_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
);
201 * vim600: noet sw=4 ts=4 fdm=marker
202 * vim<600: noet sw=4 ts=4