X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=php_http_request_method.c;h=13561adba1dc89e26db795fd838d32a98100724d;hb=4e5827ad559e50a1bfa4dc1807add9248acb3be4;hp=b4b3567e144844e0a1a83a211b9014483771a38e;hpb=8d05291f42b3b42159b3fe91492aa4862f3d4405;p=m6w6%2Fext-http diff --git a/php_http_request_method.c b/php_http_request_method.c index b4b3567..13561ad 100644 --- a/php_http_request_method.c +++ b/php_http_request_method.c @@ -10,214 +10,31 @@ +--------------------------------------------------------------------+ */ -#include "php_http.h" +#include "php_http_api.h" -#include - -static PHP_HTTP_STRLIST(php_http_request_methods) = - PHP_HTTP_STRLIST_ITEM("UNKNOWN") - /* HTTP/1.1 */ - PHP_HTTP_STRLIST_ITEM("GET") - PHP_HTTP_STRLIST_ITEM("HEAD") - PHP_HTTP_STRLIST_ITEM("POST") - PHP_HTTP_STRLIST_ITEM("PUT") - PHP_HTTP_STRLIST_ITEM("DELETE") - PHP_HTTP_STRLIST_ITEM("OPTIONS") - PHP_HTTP_STRLIST_ITEM("TRACE") - PHP_HTTP_STRLIST_ITEM("CONNECT") - /* WebDAV - RFC 2518 */ - PHP_HTTP_STRLIST_ITEM("PROPFIND") - PHP_HTTP_STRLIST_ITEM("PROPPATCH") - PHP_HTTP_STRLIST_ITEM("MKCOL") - PHP_HTTP_STRLIST_ITEM("COPY") - PHP_HTTP_STRLIST_ITEM("MOVE") - PHP_HTTP_STRLIST_ITEM("LOCK") - PHP_HTTP_STRLIST_ITEM("UNLOCK") - /* WebDAV Versioning - RFC 3253 */ - PHP_HTTP_STRLIST_ITEM("VERSION-CONTROL") - PHP_HTTP_STRLIST_ITEM("REPORT") - PHP_HTTP_STRLIST_ITEM("CHECKOUT") - PHP_HTTP_STRLIST_ITEM("CHECKIN") - PHP_HTTP_STRLIST_ITEM("UNCHECKOUT") - PHP_HTTP_STRLIST_ITEM("MKWORKSPACE") - PHP_HTTP_STRLIST_ITEM("UPDATE") - PHP_HTTP_STRLIST_ITEM("LABEL") - PHP_HTTP_STRLIST_ITEM("MERGE") - PHP_HTTP_STRLIST_ITEM("BASELINE-CONTROL") - PHP_HTTP_STRLIST_ITEM("MKACTIVITY") - /* WebDAV Access Control - RFC 3744 */ - PHP_HTTP_STRLIST_ITEM("ACL") - PHP_HTTP_STRLIST_STOP -; - -PHP_HTTP_API const char *php_http_request_method_name(php_http_request_method_t meth TSRMLS_DC) -{ - if (meth > PHP_HTTP_NO_REQUEST_METHOD && meth < PHP_HTTP_MAX_REQUEST_METHOD) { - return php_http_strlist_find(php_http_request_methods, 0, meth); - } else { - zval **val, *cmp, res; - HashPosition pos; - php_http_array_hashkey_t key = php_http_array_hashkey_init(0); - - INIT_PZVAL(&res); - FOREACH_HASH_KEYVAL(pos, &php_http_request_class_entry->constants_table, key, val) { - MAKE_STD_ZVAL(cmp); - ZVAL_LONG(cmp, meth); - is_equal_function(&res, *val, cmp TSRMLS_CC); - zval_ptr_dtor(&cmp); - - if (Z_LVAL(res)) { - return key.str; - } - } - } - return NULL; -} - -PHP_HTTP_API STATUS php_http_request_method_register(const char *meth_str, size_t meth_len, long *id TSRMLS_DC) -{ - long num = zend_hash_num_elements(&php_http_request_class_entry->constants_table); - - if (SUCCESS == zend_declare_class_constant_long(php_http_request_method_class_entry, meth_str, meth_len, num TSRMLS_CC)) { - if (id) { - *id = num; - } - return SUCCESS; - } - return FAILURE; -} - -zend_class_entry *php_http_request_method_class_entry; - -#define PHP_HTTP_BEGIN_ARGS(method, req_args) PHP_HTTP_BEGIN_ARGS_EX(HttpRequestMethod, method, 0, req_args) -#define PHP_HTTP_EMPTY_ARGS(method) PHP_HTTP_EMPTY_ARGS_EX(HttpRequestMethod, method, 0) -#define PHP_HTTP_REQMETH_ME(method, visibility) PHP_ME(HttpRequestMethod, method, PHP_HTTP_ARGS(HttpRequestMethod, method), visibility) - -#ifdef register -# undef register -#endif - -PHP_HTTP_BEGIN_ARGS(__construct, 1) - PHP_HTTP_ARG_VAL(name, 0) -PHP_HTTP_END_ARGS; - -PHP_HTTP_EMPTY_ARGS(__toString); - -PHP_HTTP_EMPTY_ARGS(getId); - -PHP_HTTP_BEGIN_ARGS(exists, 1) - PHP_HTTP_ARG_VAL(method, 0) -PHP_HTTP_END_ARGS; - -PHP_HTTP_BEGIN_ARGS(register, 1) - PHP_HTTP_ARG_VAL(method, 0) -PHP_HTTP_END_ARGS; - -zend_function_entry php_http_request_method_method_entry[] = { - PHP_HTTP_REQMETH_ME(__construct, ZEND_ACC_PUBLIC|ZEND_ACC_CTOR) - PHP_HTTP_REQMETH_ME(__toString, ZEND_ACC_PUBLIC) - PHP_HTTP_REQMETH_ME(getId, ZEND_ACC_PUBLIC) - PHP_HTTP_REQMETH_ME(exists, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) - PHP_HTTP_REQMETH_ME(register, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) - - EMPTY_FUNCTION_ENTRY -}; - -PHP_METHOD(HttpRequestMethod, __construct) -{ - with_error_handling(EH_THROW, php_http_exception_class_entry) { - char *meth_str; - int meth_len; - - if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &meth_str, &meth_len)) { - with_error_handling(EH_THROW, php_http_exception_class_entry) { - zval *zarg, *zret; - - if (SUCCESS == zend_get_parameters(ZEND_NUM_ARGS(), 1, &zarg)) { - if (zend_call_method_with_1_params(&getThis(), php_http_request_method_class_entry, NULL, "exists", &zret, zarg)) { - if (i_zend_is_true(zret)) { - zend_update_property_stringl(php_http_request_method_class_entry, getThis(), ZEND_STRL("name"), meth_str, meth_len TSRMLS_CC); - } else { - php_http_error(HE_THROW, PHP_HTTP_E_REQUEST_METHOD, "Unknown request method '%s'", meth_str); - } - zval_ptr_dtor(&zret); - } - } - } end_error_handling(); - } - } end_error_handling(); -} - -PHP_METHOD(HttpRequestMethod, __toString) -{ - if (SUCCESS == zend_parse_parameters_none()) { - zval *retval = php_http_ztyp(IS_STRING, zend_read_property(php_http_request_method_class_entry, getThis(), ZEND_STRL("name"), 0 TSRMLS_CC)); - - RETURN_ZVAL(retval, 1, 1); - } - RETURN_EMPTY_STRING(); -} - -PHP_METHOD(HttpRequestMethod, getId) +PHP_HTTP_API int php_http_request_method_is(const char *meth, int argc, ...) { - if (SUCCESS == zend_parse_parameters_none()) { - zval **data, *meth = php_http_ztyp(IS_STRING, zend_read_property(php_http_request_method_class_entry, getThis(), ZEND_STRL("name"), 0 TSRMLS_CC)); + va_list argv; + int match = -1; - if (SUCCESS == zend_hash_find(&php_http_request_method_class_entry->constants_table, Z_STRVAL_P(meth), Z_STRLEN_P(meth) + 1, (void *) &data)) { - zval_ptr_dtor(&meth); - RETURN_ZVAL(*data, 1, 0); - } - zval_ptr_dtor(&meth); - } - RETURN_FALSE; -} - -PHP_METHOD(HttpRequestMethod, exists) -{ - char *meth_str; - int meth_len; + if (argc > 0) { + int i; - if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &meth_str, &meth_len)) { - zval **data; + va_start(argv, argc); + for (i = 0; i < argc; ++i) { + const char *test = va_arg(argv, const char *); - if (SUCCESS == zend_hash_find(&php_http_request_method_class_entry->constants_table, meth_str, meth_len + 1, (void *) &data)) { - RETURN_ZVAL(*data, 1, 0); + if (!strcasecmp(meth, test)) { + match = i; + break; + } } + va_end(argv); } - RETURN_FALSE; -} - -PHP_METHOD(HttpRequestMethod, register) -{ - char *meth_str; - int meth_len; - - if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &meth_str, &meth_len)) { - 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)); - } - RETURN_FALSE; -} -PHP_MINIT_FUNCTION(http_request_method) -{ - php_http_strlist_iterator_t std; - - PHP_HTTP_REGISTER_CLASS(http\\Request, Method, http_request_method, php_http_object_class_entry, 0); - - zend_declare_property_null(php_http_request_method_class_entry, ZEND_STRL("name"), ZEND_ACC_PROTECTED TSRMLS_CC); - - php_http_strlist_iterator_init(&std, php_http_request_methods, 1); - do { - unsigned id; - const char *meth = php_http_strlist_iterator_this(&std, &id); - - zend_declare_class_constant_long(php_http_request_method_class_entry, meth, strlen(meth), id TSRMLS_CC); - } while (*php_http_strlist_iterator_next(&std)); - - return SUCCESS; + return match; } - /* * Local variables: * tab-width: 4