+--------------------------------------------------------------------+
| Redistribution and use in source and binary forms, with or without |
| modification, are permitted provided that the conditions mentioned |
- | in the accompanying LICENSE file are met. |
+ | in the accomp395anying LICENSE file are met. |
+--------------------------------------------------------------------+
| Copyright (c) 2004-2011, Michael Wallner <mike@php.net> |
+--------------------------------------------------------------------+
if (SUCCESS == zend_hash_find(&EG(symbol_table), "_SERVER", sizeof("_SERVER"), (void *) &hsv) && Z_TYPE_PP(hsv) == IS_ARRAY) {
FOREACH_KEY(pos, *hsv, key) {
- if (key.type == HASH_KEY_IS_STRING && key.len > 6 && !strncmp(key.str, "HTTP_", 5)) {
+ if (key.type == HASH_KEY_IS_STRING && key.len > 6 && *key.str == 'H' && !strncmp(key.str, "HTTP_", 5)) {
key.len -= 5;
key.str = php_http_pretty_key(estrndup(key.str + 5, key.len - 1), key.len - 1, 1, 1);
Z_ADDREF_P(*header);
zend_symtable_update(PHP_HTTP_G->env.request.headers, key.str, key.len, (void *) header, sizeof(zval *), NULL);
+ efree(key.str);
+ } else if (key.type == HASH_KEY_IS_STRING && key.len > 9 && *key.str == 'C' && !strncmp(key.str, "CONTENT_", 8)) {
+ key.str = php_http_pretty_key(estrndup(key.str, key.len - 1), key.len - 1, 1, 1);
+
+ zend_hash_get_current_data_ex(Z_ARRVAL_PP(hsv), (void *) &header, &pos);
+ Z_ADDREF_P(*header);
+ zend_symtable_update(PHP_HTTP_G->env.request.headers, key.str, key.len, (void *) header, sizeof(zval *), NULL);
+
efree(key.str);
}
}
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 */
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))) {
char *val = NULL;
HashTable headers;
- zend_hash_init(&headers, 0, NULL, NULL, 0);
+ zend_hash_init(&headers, 0, NULL, ZVAL_PTR_DTOR, 0);
if (SUCCESS == php_http_env_get_response_headers(&headers TSRMLS_CC)) {
zval **zvalue;
char *key = php_http_pretty_key(estrndup(name_str, name_len), name_len, 1, 1);
PHP_HTTP_API STATUS php_http_env_set_response_status_line(long code, php_http_version_t *v TSRMLS_DC)
{
- sapi_header_line h = {0};
+ sapi_header_line h = {NULL, 0, 0};
STATUS ret;
h.line_len = spprintf(&h.line, 0, "HTTP/%u.%u %ld %s", v->major, v->minor, code, php_http_env_get_response_status_for_code(code));
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)
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;
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) {
zend_object_value ov;
php_http_message_body_t *body = php_http_env_get_request_body(TSRMLS_C);
- if (SUCCESS == php_http_new(&ov, class_entry, (php_http_new_t) php_http_message_body_object_new_ex, php_http_message_body_class_entry, body, NULL TSRMLS_CC)) {
- RETURN_OBJVAL(ov, 0);
+ if (SUCCESS == php_http_new(&ov, class_entry, (php_http_new_t) php_http_message_body_object_new_ex, php_http_message_body_class_entry, php_http_message_body_copy(body, NULL, 0), NULL TSRMLS_CC)) {
+ RETVAL_OBJVAL(ov, 0);
}
}
} end_error_handling();
}
}
+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;
}
}
-PHP_METHOD(HttpEnv, persistentHandlesStat)
+PHP_METHOD(HttpEnv, statPersistentHandles)
{
if (SUCCESS == zend_parse_parameters_none()) {
object_init(return_value);
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;
}