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