X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-http;a=blobdiff_plain;f=http_request_method_api.c;h=57636d088b2b065e7e050bc3015a6859803ea2cf;hp=5a26927158792e64c42fb64f4448a2053e06cd92;hb=60d91c35d7c2b4ce86ed67813f2f5a19266a30cc;hpb=61f165688d2cc39424678829a145c8cbab51d1af diff --git a/http_request_method_api.c b/http_request_method_api.c index 5a26927..57636d0 100644 --- a/http_request_method_api.c +++ b/http_request_method_api.c @@ -24,6 +24,9 @@ #include "php_http_std_defs.h" #include "php_http_api.h" #include "php_http_request_method_api.h" +#if defined(ZEND_ENGINE_2) && defined(HTTP_HAVE_CURL) +# include "php_http_request_object.h" +#endif #include "phpstr/phpstr.h" @@ -67,6 +70,43 @@ static const char *const http_request_methods[] = { }; /* }}} */ +STATUS _http_request_method_global_init(INIT_FUNC_ARGS) +{ + /* HTTP/1.1 */ + HTTP_LONG_CONSTANT("HTTP_METH_GET", HTTP_GET); + HTTP_LONG_CONSTANT("HTTP_METH_HEAD", HTTP_HEAD); + HTTP_LONG_CONSTANT("HTTP_METH_POST", HTTP_POST); + HTTP_LONG_CONSTANT("HTTP_METH_PUT", HTTP_PUT); + HTTP_LONG_CONSTANT("HTTP_METH_DELETE", HTTP_DELETE); + HTTP_LONG_CONSTANT("HTTP_METH_OPTIONS", HTTP_OPTIONS); + HTTP_LONG_CONSTANT("HTTP_METH_TRACE", HTTP_TRACE); + HTTP_LONG_CONSTANT("HTTP_METH_CONNECT", HTTP_CONNECT); + /* WebDAV - RFC 2518 */ + HTTP_LONG_CONSTANT("HTTP_METH_PROPFIND", HTTP_PROPFIND); + HTTP_LONG_CONSTANT("HTTP_METH_PROPPATCH", HTTP_PROPPATCH); + HTTP_LONG_CONSTANT("HTTP_METH_MKCOL", HTTP_MKCOL); + HTTP_LONG_CONSTANT("HTTP_METH_COPY", HTTP_COPY); + HTTP_LONG_CONSTANT("HTTP_METH_MOVE", HTTP_MOVE); + HTTP_LONG_CONSTANT("HTTP_METH_LOCK", HTTP_LOCK); + HTTP_LONG_CONSTANT("HTTP_METH_UNLOCK", HTTP_UNLOCK); + /* WebDAV Versioning - RFC 3253 */ + HTTP_LONG_CONSTANT("HTTP_METH_VERSION_CONTROL", HTTP_VERSION_CONTROL); + HTTP_LONG_CONSTANT("HTTP_METH_REPORT", HTTP_REPORT); + HTTP_LONG_CONSTANT("HTTP_METH_CHECKOUT", HTTP_CHECKOUT); + HTTP_LONG_CONSTANT("HTTP_METH_CHECKIN", HTTP_CHECKIN); + HTTP_LONG_CONSTANT("HTTP_METH_UNCHECKOUT", HTTP_UNCHECKOUT); + HTTP_LONG_CONSTANT("HTTP_METH_MKWORKSPACE", HTTP_MKWORKSPACE); + HTTP_LONG_CONSTANT("HTTP_METH_UPDATE", HTTP_UPDATE); + HTTP_LONG_CONSTANT("HTTP_METH_LABEL", HTTP_LABEL); + HTTP_LONG_CONSTANT("HTTP_METH_MERGE", HTTP_MERGE); + HTTP_LONG_CONSTANT("HTTP_METH_BASELINE_CONTROL", HTTP_BASELINE_CONTROL); + HTTP_LONG_CONSTANT("HTTP_METH_MKACTIVITY", HTTP_MKACTIVITY); + /* WebDAV Access Control - RFC 3744 */ + HTTP_LONG_CONSTANT("HTTP_METH_ACL", HTTP_ACL); + + return SUCCESS; +} + /* {{{ char *http_request_method_name(http_request_method) */ PHP_HTTP_API const char *_http_request_method_name(http_request_method m TSRMLS_DC) { @@ -114,18 +154,31 @@ PHP_HTTP_API unsigned long _http_request_method_exists(zend_bool by_name, unsign /* }}} */ /* {{{ unsigned long http_request_method_register(char *) */ -PHP_HTTP_API unsigned long _http_request_method_register(const char *method TSRMLS_DC) +PHP_HTTP_API unsigned long _http_request_method_register(const char *method_name TSRMLS_DC) { zval array; - char *http_method; + char *http_method, *method; + int i, method_len = strlen(method_name); unsigned long meth_num = HTTP_G(request).methods.custom.nNextFreeElement + HTTP_MAX_REQUEST_METHOD; + method = emalloc(method_len + 1); + for (i = 0; i < method_len; ++i) { + method[i] = toupper(method_name[i]); + } + method[method_len] = '\0'; + Z_ARRVAL(array) = &HTTP_G(request).methods.custom; - add_next_index_string(&array, estrdup(method), 0); + add_next_index_stringl(&array, method, method_len, 0); - spprintf(&http_method, 0, "HTTP_%s", method); - zend_register_long_constant(http_method, strlen(http_method) + 1, meth_num, CONST_CS, http_module_number TSRMLS_CC); + method_len = spprintf(&http_method, 0, "HTTP_METH_%s", method); + zend_register_long_constant(http_method, method_len + 1, meth_num, CONST_CS, http_module_number TSRMLS_CC); + efree(http_method); + +#if defined(ZEND_ENGINE_2) && defined(HTTP_HAVE_CURL) + method_len = spprintf(&http_method, 0, "METH_%s", method); + zend_declare_class_constant_long(http_request_object_ce, http_method, method_len, meth_num TSRMLS_CC); efree(http_method); +#endif return meth_num; } @@ -136,22 +189,32 @@ PHP_HTTP_API STATUS _http_request_method_unregister(unsigned long method TSRMLS_ { zval **zmethod; char *http_method; + int method_len; if (SUCCESS != zend_hash_index_find(&HTTP_G(request).methods.custom, HTTP_CUSTOM_REQUEST_METHOD(method), (void **) &zmethod)) { http_error_ex(HE_NOTICE, HTTP_E_REQUEST_METHOD, "Request method with id %lu does not exist", method); return FAILURE; } - spprintf(&http_method, 0, "HTTP_%s", Z_STRVAL_PP(zmethod)); - +#if defined(ZEND_ENGINE_2) && defined(HTTP_HAVE_CURL) + method_len = spprintf(&http_method, 0, "METH_%s", Z_STRVAL_PP(zmethod)); + if ((SUCCESS != zend_hash_del(&http_request_object_ce->constants_table, http_method, method_len + 1))) { + http_error_ex(HE_NOTICE, HTTP_E_REQUEST_METHOD, "Could not unregister request method: HttpRequest::%s", http_method); + efree(http_method); + return FAILURE; + } + efree(http_method); +#endif + + method_len = spprintf(&http_method, 0, "HTTP_METH_%s", Z_STRVAL_PP(zmethod)); if ( (SUCCESS != zend_hash_index_del(&HTTP_G(request).methods.custom, HTTP_CUSTOM_REQUEST_METHOD(method))) - || (SUCCESS != zend_hash_del(EG(zend_constants), http_method, strlen(http_method) + 1))) { + || (SUCCESS != zend_hash_del(EG(zend_constants), http_method, method_len + 1))) { http_error_ex(HE_NOTICE, HTTP_E_REQUEST_METHOD, "Could not unregister request method: %s", http_method); efree(http_method); return FAILURE; } - efree(http_method); + return SUCCESS; } /* }}} */