X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-http;a=blobdiff_plain;f=php_http_env.c;h=926e2524fe30f73c6056475041e1f597b330d2b5;hp=f7df9d04783d2454928483f6104e7b18dbb04132;hb=14aec371d6123fbedbe13ca73b6a6d5768c635cb;hpb=120c2279bdf9db8486a60b0e85c0e31f6ff4e8fc diff --git a/php_http_env.c b/php_http_env.c index f7df9d0..926e252 100644 --- a/php_http_env.c +++ b/php_http_env.c @@ -105,9 +105,22 @@ PHP_HTTP_API int php_http_env_got_request_header(const char *name_str, size_t na return got; } +PHP_HTTP_API zval *php_http_env_get_superglobal(const char *key, size_t key_len TSRMLS_DC) +{ + zval **hsv; + + zend_is_auto_global(key, key_len TSRMLS_CC); + + if ((SUCCESS != zend_hash_find(&EG(symbol_table), key, key_len + 1, (void *) &hsv)) || (Z_TYPE_PP(hsv) != IS_ARRAY)) { + return NULL; + } + + return *hsv; +} + PHP_HTTP_API zval *php_http_env_get_server_var(const char *key, size_t key_len, zend_bool check TSRMLS_DC) { - zval **hsv, **var; + zval *hsv, **var; char *env; /* if available, this is a lot faster than accessing $_SERVER */ @@ -123,12 +136,10 @@ PHP_HTTP_API zval *php_http_env_get_server_var(const char *key, size_t key_len, return PHP_HTTP_G->env.server_var; } - zend_is_auto_global(ZEND_STRL("_SERVER") TSRMLS_CC); - - if ((SUCCESS != zend_hash_find(&EG(symbol_table), ZEND_STRS("_SERVER"), (void *) &hsv)) || (Z_TYPE_PP(hsv) != IS_ARRAY)) { + if (!(hsv = php_http_env_get_superglobal(ZEND_STRL("_SERVER") TSRMLS_CC))) { return NULL; } - if ((SUCCESS != zend_symtable_find(Z_ARRVAL_PP(hsv), key, key_len + 1, (void *) &var))) { + if ((SUCCESS != zend_symtable_find(Z_ARRVAL_P(hsv), key, key_len + 1, (void *) &var))) { return NULL; } if (check && !((Z_TYPE_PP(var) == IS_STRING) && Z_STRVAL_PP(var) && Z_STRLEN_PP(var))) { @@ -575,6 +586,11 @@ PHP_HTTP_BEGIN_ARGS(negotiateCharset, 1) PHP_HTTP_ARG_VAL(result_array, 1) PHP_HTTP_END_ARGS; +PHP_HTTP_BEGIN_ARGS(negotiateEncoding, 1) + PHP_HTTP_ARG_VAL(supported, 0) + PHP_HTTP_ARG_VAL(result_array, 1) +PHP_HTTP_END_ARGS; + PHP_HTTP_BEGIN_ARGS(negotiate, 2) PHP_HTTP_ARG_VAL(value, 0) PHP_HTTP_ARG_VAL(supported, 0) @@ -582,9 +598,9 @@ PHP_HTTP_BEGIN_ARGS(negotiate, 2) PHP_HTTP_ARG_VAL(result_array, 1) PHP_HTTP_END_ARGS; -PHP_HTTP_EMPTY_ARGS(persistentHandlesStat); +PHP_HTTP_EMPTY_ARGS(statPersistentHandles); -PHP_HTTP_BEGIN_ARGS(persistentHandlesClean, 0) +PHP_HTTP_BEGIN_ARGS(cleanPersistentHandles, 0) PHP_HTTP_ARG_VAL(name, 0) PHP_HTTP_ARG_VAL(ident, 0) PHP_HTTP_END_ARGS; @@ -602,19 +618,20 @@ zend_function_entry php_http_env_method_entry[] = { PHP_HTTP_ENV_ME(negotiateLanguage) PHP_HTTP_ENV_ME(negotiateContentType) + PHP_HTTP_ENV_ME(negotiateEncoding) PHP_HTTP_ENV_ME(negotiateCharset) PHP_HTTP_ENV_ME(negotiate) - PHP_HTTP_ENV_ME(persistentHandlesStat) - PHP_HTTP_ENV_ME(persistentHandlesClean) + PHP_HTTP_ENV_ME(statPersistentHandles) + PHP_HTTP_ENV_ME(cleanPersistentHandles) EMPTY_FUNCTION_ENTRY }; PHP_METHOD(HttpEnv, getRequestHeader) { - char *header_name_str; - int header_name_len; + char *header_name_str = NULL; + int header_name_len = 0; if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s!", &header_name_str, &header_name_len)) { if (header_name_str && header_name_len) { @@ -747,6 +764,22 @@ PHP_METHOD(HttpEnv, negotiateCharset) } } +PHP_METHOD(HttpEnv, negotiateEncoding) +{ + HashTable *supported; + zval *rs_array = NULL; + + if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "H|z", &supported, &rs_array)) { + if (rs_array) { + zval_dtor(rs_array); + array_init(rs_array); + } + PHP_HTTP_DO_NEGOTIATE(encoding, supported, rs_array); + } else { + RETURN_FALSE; + } +} + PHP_METHOD(HttpEnv, negotiateContentType) { HashTable *supported; @@ -788,7 +821,7 @@ PHP_METHOD(HttpEnv, negotiate) } } -PHP_METHOD(HttpEnv, persistentHandlesStat) +PHP_METHOD(HttpEnv, statPersistentHandles) { if (SUCCESS == zend_parse_parameters_none()) { object_init(return_value); @@ -800,51 +833,20 @@ PHP_METHOD(HttpEnv, persistentHandlesStat) RETURN_FALSE; } -PHP_METHOD(HttpEnv, persistentHandlesClean) +PHP_METHOD(HttpEnv, cleanPersistentHandles) { char *name_str = NULL, *ident_str = NULL; int name_len = 0, ident_len = 0; - if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|ss", &name_str, &name_len, &ident_str, &ident_len)) { + if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s!s!", &name_str, &name_len, &ident_str, &ident_len)) { php_http_persistent_handle_cleanup(name_str, name_len, ident_str, ident_len TSRMLS_CC); } } -zend_class_entry *php_http_env_request_class_entry; - -#undef PHP_HTTP_BEGIN_ARGS -#undef PHP_HTTP_EMPTY_ARGS -#define PHP_HTTP_BEGIN_ARGS(method, req_args) PHP_HTTP_BEGIN_ARGS_EX(HttpEnvRequest, method, 0, req_args) -#define PHP_HTTP_EMPTY_ARGS(method) PHP_HTTP_EMPTY_ARGS_EX(HttpEnvRequest, method, 0) -#define PHP_HTTP_ENV_REQUEST_ME(method, visibility) PHP_ME(HttpEnvRequest, method, PHP_HTTP_ARGS(HttpEnvRequest, method), visibility) - -PHP_HTTP_EMPTY_ARGS(__construct); - -zend_function_entry php_http_env_request_method_entry[] = { - PHP_HTTP_ENV_REQUEST_ME(__construct, ZEND_ACC_PUBLIC|ZEND_ACC_CTOR) - - EMPTY_FUNCTION_ENTRY -}; - -PHP_METHOD(HttpEnvRequest, __construct) -{ - with_error_handling(EH_THROW, php_http_exception_class_entry) { - if (SUCCESS == zend_parse_parameters_none()) { - php_http_message_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC); - - with_error_handling(EH_THROW, php_http_exception_class_entry) { - obj->message = php_http_message_init_env(obj->message, PHP_HTTP_REQUEST TSRMLS_CC); - } end_error_handling(); - } - } end_error_handling(); -} - PHP_MINIT_FUNCTION(http_env) { PHP_HTTP_REGISTER_CLASS(http, Env, http_env, NULL, 0); - PHP_HTTP_REGISTER_CLASS(http\\Env, Request, http_env_request, php_http_message_class_entry, 0); - return SUCCESS; }