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-2010, Michael Wallner <mike@php.net> |
10 +--------------------------------------------------------------------+
13 /* $Id: http_request_method_api.c 292841 2009-12-31 08:48:57Z mike $ */
17 #include <Zend/zend_interfaces.h>
19 static PHP_HTTP_STRLIST(php_http_request_methods
) =
20 PHP_HTTP_STRLIST_ITEM("UNKNOWN")
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")
55 PHP_HTTP_API
const char *php_http_request_method_name(php_http_request_method_t meth TSRMLS_DC
)
57 if (meth
> PHP_HTTP_NO_REQUEST_METHOD
&& meth
< PHP_HTTP_MAX_REQUEST_METHOD
) {
58 return php_http_strlist_find(php_http_request_methods
, 0, meth
);
60 zval
**val
, *cmp
, res
;
62 php_http_array_hashkey_t key
= php_http_array_hashkey_init(0);
65 FOREACH_HASH_KEYVAL(pos
, &php_http_request_class_entry
->constants_table
, key
, val
) {
68 is_equal_function(&res
, *val
, cmp TSRMLS_CC
);
79 PHP_HTTP_API STATUS
php_http_request_method_register(const char *meth_str
, size_t meth_len
, long *id TSRMLS_DC
)
81 long num
= zend_hash_num_elements(&php_http_request_class_entry
->constants_table
);
83 if (SUCCESS
== zend_declare_class_constant_long(php_http_request_method_class_entry
, meth_str
, meth_len
, num TSRMLS_CC
)) {
92 zend_class_entry
*php_http_request_method_class_entry
;
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)
102 PHP_HTTP_BEGIN_ARGS(__construct
, 1)
103 PHP_HTTP_ARG_VAL(name
, 0)
106 PHP_HTTP_EMPTY_ARGS(__toString
);
108 PHP_HTTP_EMPTY_ARGS(getId
);
110 PHP_HTTP_BEGIN_ARGS(exists
, 1)
111 PHP_HTTP_ARG_VAL(method
, 0)
114 PHP_HTTP_BEGIN_ARGS(register, 1)
115 PHP_HTTP_ARG_VAL(method
, 0)
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
)
128 PHP_METHOD(HttpRequestMethod
, __construct
)
130 with_error_handling(EH_THROW
, php_http_exception_class_entry
) {
134 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "s", &meth_str
, &meth_len
)) {
135 with_error_handling(EH_THROW
, php_http_exception_class_entry
) {
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
);
143 php_http_error(HE_THROW
, PHP_HTTP_E_REQUEST_METHOD
, "Unknown request method '%s'", meth_str
);
145 zval_ptr_dtor(&zret
);
148 } end_error_handling();
150 } end_error_handling();
153 PHP_METHOD(HttpRequestMethod
, __toString
)
155 if (SUCCESS
== zend_parse_parameters_none()) {
156 zval
*retval
= php_http_ztyp(IS_STRING
, zend_read_property(php_http_request_method_class_entry
, getThis(), ZEND_STRL("name"), 0 TSRMLS_CC
));
158 RETURN_ZVAL(retval
, 1, 1);
160 RETURN_EMPTY_STRING();
163 PHP_METHOD(HttpRequestMethod
, getId
)
165 if (SUCCESS
== zend_parse_parameters_none()) {
166 zval
**data
, *meth
= php_http_ztyp(IS_STRING
, zend_read_property(php_http_request_method_class_entry
, getThis(), ZEND_STRL("name"), 0 TSRMLS_CC
));
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);
172 zval_ptr_dtor(&meth
);
177 PHP_METHOD(HttpRequestMethod
, exists
)
182 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "s", &meth_str
, &meth_len
)) {
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);
192 PHP_METHOD(HttpRequestMethod
, register)
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_method_class_entry
->constants_table
) TSRMLS_CC
));
203 PHP_MINIT_FUNCTION(http_request_method
)
205 php_http_strlist_iterator_t std
;
207 PHP_HTTP_REGISTER_CLASS(http
\\Request
, Method
, http_request_method
, php_http_object_class_entry
, 0);
209 zend_declare_property_null(php_http_request_method_class_entry
, ZEND_STRL("name"), ZEND_ACC_PROTECTED TSRMLS_CC
);
211 php_http_strlist_iterator_init(&std
, php_http_request_methods
, 1);
214 const char *meth
= php_http_strlist_iterator_this(&std
, &id
);
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
));
228 * vim600: noet sw=4 ts=4 fdm=marker
229 * vim<600: noet sw=4 ts=4