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"
15 static PHP_HTTP_STRLIST(php_http_request_methods
) =
16 PHP_HTTP_STRLIST_ITEM("UNKNOWN")
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")
51 PHP_HTTP_API
const char *php_http_request_method_name(php_http_request_method_t meth TSRMLS_DC
)
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
);
56 zval
**val
, *cmp
, res
;
58 php_http_array_hashkey_t key
= php_http_array_hashkey_init(0);
61 FOREACH_HASH_KEYVAL(pos
, &php_http_request_class_entry
->constants_table
, key
, val
) {
64 is_equal_function(&res
, *val
, cmp TSRMLS_CC
);
75 PHP_HTTP_API STATUS
php_http_request_method_register(const char *meth_str
, size_t meth_len
, long *id TSRMLS_DC
)
77 long num
= zend_hash_num_elements(&php_http_request_class_entry
->constants_table
);
79 if (SUCCESS
== zend_declare_class_constant_long(php_http_request_method_class_entry
, meth_str
, meth_len
, num TSRMLS_CC
)) {
88 zend_class_entry
*php_http_request_method_class_entry
;
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)
98 PHP_HTTP_BEGIN_ARGS(__construct
, 1)
99 PHP_HTTP_ARG_VAL(name
, 0)
102 PHP_HTTP_EMPTY_ARGS(__toString
);
104 PHP_HTTP_EMPTY_ARGS(getId
);
106 PHP_HTTP_BEGIN_ARGS(exists
, 1)
107 PHP_HTTP_ARG_VAL(method
, 0)
110 PHP_HTTP_BEGIN_ARGS(register, 1)
111 PHP_HTTP_ARG_VAL(method
, 0)
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
)
124 PHP_METHOD(HttpRequestMethod
, __construct
)
126 with_error_handling(EH_THROW
, php_http_exception_class_entry
) {
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
) {
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
);
139 php_http_error(HE_THROW
, PHP_HTTP_E_REQUEST_METHOD
, "Unknown request method '%s'", meth_str
);
141 zval_ptr_dtor(&zret
);
144 } end_error_handling();
146 } end_error_handling();
149 PHP_METHOD(HttpRequestMethod
, __toString
)
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
));
154 RETURN_ZVAL(retval
, 1, 1);
156 RETURN_EMPTY_STRING();
159 PHP_METHOD(HttpRequestMethod
, getId
)
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
));
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);
168 zval_ptr_dtor(&meth
);
173 PHP_METHOD(HttpRequestMethod
, exists
)
178 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "s", &meth_str
, &meth_len
)) {
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);
188 PHP_METHOD(HttpRequestMethod
, register)
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
));
199 PHP_MINIT_FUNCTION(http_request_method
)
201 php_http_strlist_iterator_t std
;
203 PHP_HTTP_REGISTER_CLASS(http
\\Request
, Method
, http_request_method
, php_http_object_class_entry
, 0);
205 zend_declare_property_null(php_http_request_method_class_entry
, ZEND_STRL("name"), ZEND_ACC_PROTECTED TSRMLS_CC
);
207 php_http_strlist_iterator_init(&std
, php_http_request_methods
, 1);
210 const char *meth
= php_http_strlist_iterator_this(&std
, &id
);
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
));
224 * vim600: noet sw=4 ts=4 fdm=marker
225 * vim<600: noet sw=4 ts=4