header cleanups and fix some warnings
[m6w6/ext-http] / php_http_request_method.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 static PHP_HTTP_STRLIST(php_http_request_methods) =
16 PHP_HTTP_STRLIST_ITEM("UNKNOWN")
17 /* HTTP/1.1 */
18 PHP_HTTP_STRLIST_ITEM("GET")
19 PHP_HTTP_STRLIST_ITEM("HEAD")
20 PHP_HTTP_STRLIST_ITEM("POST")
21 PHP_HTTP_STRLIST_ITEM("PUT")
22 PHP_HTTP_STRLIST_ITEM("DELETE")
23 PHP_HTTP_STRLIST_ITEM("OPTIONS")
24 PHP_HTTP_STRLIST_ITEM("TRACE")
25 PHP_HTTP_STRLIST_ITEM("CONNECT")
26 /* WebDAV - RFC 2518 */
27 PHP_HTTP_STRLIST_ITEM("PROPFIND")
28 PHP_HTTP_STRLIST_ITEM("PROPPATCH")
29 PHP_HTTP_STRLIST_ITEM("MKCOL")
30 PHP_HTTP_STRLIST_ITEM("COPY")
31 PHP_HTTP_STRLIST_ITEM("MOVE")
32 PHP_HTTP_STRLIST_ITEM("LOCK")
33 PHP_HTTP_STRLIST_ITEM("UNLOCK")
34 /* WebDAV Versioning - RFC 3253 */
35 PHP_HTTP_STRLIST_ITEM("VERSION-CONTROL")
36 PHP_HTTP_STRLIST_ITEM("REPORT")
37 PHP_HTTP_STRLIST_ITEM("CHECKOUT")
38 PHP_HTTP_STRLIST_ITEM("CHECKIN")
39 PHP_HTTP_STRLIST_ITEM("UNCHECKOUT")
40 PHP_HTTP_STRLIST_ITEM("MKWORKSPACE")
41 PHP_HTTP_STRLIST_ITEM("UPDATE")
42 PHP_HTTP_STRLIST_ITEM("LABEL")
43 PHP_HTTP_STRLIST_ITEM("MERGE")
44 PHP_HTTP_STRLIST_ITEM("BASELINE-CONTROL")
45 PHP_HTTP_STRLIST_ITEM("MKACTIVITY")
46 /* WebDAV Access Control - RFC 3744 */
47 PHP_HTTP_STRLIST_ITEM("ACL")
48 PHP_HTTP_STRLIST_STOP
49 ;
50
51 PHP_HTTP_API const char *php_http_request_method_name(php_http_request_method_t meth TSRMLS_DC)
52 {
53 if (meth > PHP_HTTP_NO_REQUEST_METHOD && meth < PHP_HTTP_MAX_REQUEST_METHOD) {
54 return php_http_strlist_find(php_http_request_methods, 0, meth);
55 } else {
56 zval **val, *cmp, res;
57 HashPosition pos;
58 php_http_array_hashkey_t key = php_http_array_hashkey_init(0);
59
60 INIT_PZVAL(&res);
61 FOREACH_HASH_KEYVAL(pos, &php_http_request_class_entry->constants_table, key, val) {
62 MAKE_STD_ZVAL(cmp);
63 ZVAL_LONG(cmp, meth);
64 is_equal_function(&res, *val, cmp TSRMLS_CC);
65 zval_ptr_dtor(&cmp);
66
67 if (Z_LVAL(res)) {
68 return key.str;
69 }
70 }
71 }
72 return NULL;
73 }
74
75 PHP_HTTP_API STATUS php_http_request_method_register(const char *meth_str, size_t meth_len, long *id TSRMLS_DC)
76 {
77 long num = zend_hash_num_elements(&php_http_request_class_entry->constants_table);
78
79 if (SUCCESS == zend_declare_class_constant_long(php_http_request_method_class_entry, meth_str, meth_len, num TSRMLS_CC)) {
80 if (id) {
81 *id = num;
82 }
83 return SUCCESS;
84 }
85 return FAILURE;
86 }
87
88 zend_class_entry *php_http_request_method_class_entry;
89
90 #define PHP_HTTP_BEGIN_ARGS(method, req_args) PHP_HTTP_BEGIN_ARGS_EX(HttpRequestMethod, method, 0, req_args)
91 #define PHP_HTTP_EMPTY_ARGS(method) PHP_HTTP_EMPTY_ARGS_EX(HttpRequestMethod, method, 0)
92 #define PHP_HTTP_REQMETH_ME(method, visibility) PHP_ME(HttpRequestMethod, method, PHP_HTTP_ARGS(HttpRequestMethod, method), visibility)
93
94 #ifdef register
95 # undef register
96 #endif
97
98 PHP_HTTP_BEGIN_ARGS(__construct, 1)
99 PHP_HTTP_ARG_VAL(name, 0)
100 PHP_HTTP_END_ARGS;
101
102 PHP_HTTP_EMPTY_ARGS(__toString);
103
104 PHP_HTTP_EMPTY_ARGS(getId);
105
106 PHP_HTTP_BEGIN_ARGS(exists, 1)
107 PHP_HTTP_ARG_VAL(method, 0)
108 PHP_HTTP_END_ARGS;
109
110 PHP_HTTP_BEGIN_ARGS(register, 1)
111 PHP_HTTP_ARG_VAL(method, 0)
112 PHP_HTTP_END_ARGS;
113
114 zend_function_entry php_http_request_method_method_entry[] = {
115 PHP_HTTP_REQMETH_ME(__construct, ZEND_ACC_PUBLIC|ZEND_ACC_CTOR)
116 PHP_HTTP_REQMETH_ME(__toString, ZEND_ACC_PUBLIC)
117 PHP_HTTP_REQMETH_ME(getId, ZEND_ACC_PUBLIC)
118 PHP_HTTP_REQMETH_ME(exists, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)
119 PHP_HTTP_REQMETH_ME(register, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)
120
121 EMPTY_FUNCTION_ENTRY
122 };
123
124 PHP_METHOD(HttpRequestMethod, __construct)
125 {
126 with_error_handling(EH_THROW, php_http_exception_class_entry) {
127 char *meth_str;
128 int meth_len;
129
130 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &meth_str, &meth_len)) {
131 with_error_handling(EH_THROW, php_http_exception_class_entry) {
132 zval *zarg, *zret;
133
134 if (SUCCESS == zend_get_parameters(ZEND_NUM_ARGS(), 1, &zarg)) {
135 if (zend_call_method_with_1_params(&getThis(), php_http_request_method_class_entry, NULL, "exists", &zret, zarg)) {
136 if (i_zend_is_true(zret)) {
137 zend_update_property_stringl(php_http_request_method_class_entry, getThis(), ZEND_STRL("name"), meth_str, meth_len TSRMLS_CC);
138 } else {
139 php_http_error(HE_THROW, PHP_HTTP_E_REQUEST_METHOD, "Unknown request method '%s'", meth_str);
140 }
141 zval_ptr_dtor(&zret);
142 }
143 }
144 } end_error_handling();
145 }
146 } end_error_handling();
147 }
148
149 PHP_METHOD(HttpRequestMethod, __toString)
150 {
151 if (SUCCESS == zend_parse_parameters_none()) {
152 zval *retval = php_http_ztyp(IS_STRING, zend_read_property(php_http_request_method_class_entry, getThis(), ZEND_STRL("name"), 0 TSRMLS_CC));
153
154 RETURN_ZVAL(retval, 1, 1);
155 }
156 RETURN_EMPTY_STRING();
157 }
158
159 PHP_METHOD(HttpRequestMethod, getId)
160 {
161 if (SUCCESS == zend_parse_parameters_none()) {
162 zval **data, *meth = php_http_ztyp(IS_STRING, zend_read_property(php_http_request_method_class_entry, getThis(), ZEND_STRL("name"), 0 TSRMLS_CC));
163
164 if (SUCCESS == zend_hash_find(&php_http_request_method_class_entry->constants_table, Z_STRVAL_P(meth), Z_STRLEN_P(meth) + 1, (void *) &data)) {
165 zval_ptr_dtor(&meth);
166 RETURN_ZVAL(*data, 1, 0);
167 }
168 zval_ptr_dtor(&meth);
169 }
170 RETURN_FALSE;
171 }
172
173 PHP_METHOD(HttpRequestMethod, exists)
174 {
175 char *meth_str;
176 int meth_len;
177
178 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &meth_str, &meth_len)) {
179 zval **data;
180
181 if (SUCCESS == zend_hash_find(&php_http_request_method_class_entry->constants_table, meth_str, meth_len + 1, (void *) &data)) {
182 RETURN_ZVAL(*data, 1, 0);
183 }
184 }
185 RETURN_FALSE;
186 }
187
188 PHP_METHOD(HttpRequestMethod, register)
189 {
190 char *meth_str;
191 int meth_len;
192
193 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &meth_str, &meth_len)) {
194 RETURN_SUCCESS(zend_declare_class_constant_long(php_http_request_method_class_entry, meth_str, meth_len, zend_hash_num_elements(&php_http_request_method_class_entry->constants_table) TSRMLS_CC));
195 }
196 RETURN_FALSE;
197 }
198
199 PHP_MINIT_FUNCTION(http_request_method)
200 {
201 php_http_strlist_iterator_t std;
202
203 PHP_HTTP_REGISTER_CLASS(http\\Request, Method, http_request_method, php_http_object_class_entry, 0);
204
205 zend_declare_property_null(php_http_request_method_class_entry, ZEND_STRL("name"), ZEND_ACC_PROTECTED TSRMLS_CC);
206
207 php_http_strlist_iterator_init(&std, php_http_request_methods, 1);
208 do {
209 unsigned id;
210 const char *meth = php_http_strlist_iterator_this(&std, &id);
211
212 zend_declare_class_constant_long(php_http_request_method_class_entry, meth, strlen(meth), id TSRMLS_CC);
213 } while (*php_http_strlist_iterator_next(&std));
214
215 return SUCCESS;
216 }
217
218
219 /*
220 * Local variables:
221 * tab-width: 4
222 * c-basic-offset: 4
223 * End:
224 * vim600: noet sw=4 ts=4 fdm=marker
225 * vim<600: noet sw=4 ts=4
226 */
227