| modification, are permitted provided that the conditions mentioned |
| in the accompanying LICENSE file are met. |
+--------------------------------------------------------------------+
- | Copyright (c) 2004-2010, Michael Wallner <mike@php.net> |
+ | Copyright (c) 2004-2011, Michael Wallner <mike@php.net> |
+--------------------------------------------------------------------+
*/
-/* $Id $ */
-
-#include "php_http.h"
-
-#include <main/SAPI.h>
+#include "php_http_api.h"
PHP_RINIT_FUNCTION(http_env)
{
zend_hash_get_current_data_ex(Z_ARRVAL_PP(hsv), (void *) &header, &pos);
Z_ADDREF_P(*header);
- zend_hash_add(PHP_HTTP_G->env.request.headers, key.str, key.len, (void *) header, sizeof(zval *), NULL);
+ zend_symtable_update(PHP_HTTP_G->env.request.headers, key.str, key.len, (void *) header, sizeof(zval *), NULL);
efree(key.str);
}
}
}
-PHP_HTTP_API char *php_http_env_get_request_header(const char *name_str, size_t name_len TSRMLS_DC)
+PHP_HTTP_API char *php_http_env_get_request_header(const char *name_str, size_t name_len, size_t *len TSRMLS_DC)
{
zval **zvalue;
char *val = NULL, *key = php_http_pretty_key(estrndup(name_str, name_len), name_len, 1, 1);
php_http_env_get_request_headers(NULL TSRMLS_CC);
- if (SUCCESS == zend_hash_find(PHP_HTTP_G->env.request.headers, key, name_len + 1, (void *) &zvalue)) {
+ if (SUCCESS == zend_symtable_find(PHP_HTTP_G->env.request.headers, key, name_len + 1, (void *) &zvalue)) {
zval *zcopy = php_http_ztyp(IS_STRING, *zvalue);
val = estrndup(Z_STRVAL_P(zcopy), Z_STRLEN_P(zcopy));
+ if (len) {
+ *len = Z_STRLEN_P(zcopy);
+ }
zval_ptr_dtor(&zcopy);
}
int got;
php_http_env_get_request_headers(NULL TSRMLS_CC);
- got = zend_hash_exists(PHP_HTTP_G->env.request.headers, key, name_len + 1);
+ got = zend_symtable_exists(PHP_HTTP_G->env.request.headers, key, name_len + 1);
efree(key);
return got;
if ((SUCCESS != zend_hash_find(&EG(symbol_table), ZEND_STRS("_SERVER"), (void *) &hsv)) || (Z_TYPE_PP(hsv) != IS_ARRAY)) {
return NULL;
}
- if ((SUCCESS != zend_hash_find(Z_ARRVAL_PP(hsv), key, key_len + 1, (void *) &var))) {
+ if ((SUCCESS != zend_symtable_find(Z_ARRVAL_PP(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 *range, *rp, c;
long begin = -1, end = -1, *ptr;
- if (!(range = php_http_env_get_request_header(ZEND_STRL("Range") TSRMLS_CC))) {
+ if (!(range = php_http_env_get_request_header(ZEND_STRL("Range"), NULL TSRMLS_CC))) {
return PHP_HTTP_RANGE_NO;
}
if (strncmp(range, "bytes=", lenof("bytes="))) {
zval **zvalue;
char *key = php_http_pretty_key(estrndup(name_str, name_len), name_len, 1, 1);
- if (SUCCESS == zend_hash_find(&headers, key, name_len + 1, (void *) &zvalue)) {
+ if (SUCCESS == zend_symtable_find(&headers, key, name_len + 1, (void *) &zvalue)) {
zval *zcopy = php_http_ztyp(IS_STRING, *zvalue);
val = estrndup(Z_STRVAL_P(zcopy), Z_STRLEN_P(zcopy));
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(primary_type_separator, 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_BEGIN_ARGS(persistentHandlesIdent, 0)
- PHP_HTTP_ARG_VAL(name, 0)
-PHP_HTTP_END_ARGS;
-
-PHP_HTTP_BEGIN_ARGS(parseParams, 1)
- PHP_HTTP_ARG_VAL(params, 0)
- PHP_HTTP_ARG_VAL(flags, 0)
-PHP_HTTP_END_ARGS;
-
zend_function_entry php_http_env_method_entry[] = {
PHP_HTTP_ENV_ME(getRequestHeader)
PHP_HTTP_ENV_ME(getRequestBody)
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(parseParams)
+ 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) {
- char *header_value = php_http_env_get_request_header(header_name_str, header_name_len TSRMLS_CC);
+ size_t header_length;
+ char *header_value = php_http_env_get_request_header(header_name_str, header_name_len, &header_length TSRMLS_CC);
if (header_value) {
- RETURN_STRING(header_value, 0);
+ RETURN_STRINGL(header_value, header_length, 0);
}
RETURN_NULL();
} else {
PHP_METHOD(HttpEnv, getResponseHeader)
{
- 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) {
{
char *header_name_str;
int header_name_len;
- zval *header_value;
+ zval *header_value = NULL;
long code = 0;
zend_bool replace_header = 1;
RETURN_FALSE;
}
-
-#define PHP_HTTP_DO_NEGOTIATE_DEFAULT(supported) \
- { \
- zval **value; \
- \
- zend_hash_internal_pointer_reset((supported)); \
- if (SUCCESS == zend_hash_get_current_data((supported), (void *) &value)) { \
- RETVAL_ZVAL(*value, 1, 0); \
- } else { \
- RETVAL_NULL(); \
- } \
- }
-
-#define PHP_HTTP_DO_NEGOTIATE_HANDLE_DEFAULT(supported, rs_array) \
- PHP_HTTP_DO_NEGOTIATE_DEFAULT(supported); \
- if (rs_array) { \
- HashPosition pos; \
- zval **value_ptr; \
- \
- FOREACH_HASH_VAL(pos, supported, value_ptr) { \
- zval *value = php_http_ztyp(IS_STRING, *value_ptr); \
- add_assoc_double(rs_array, Z_STRVAL_P(value), 1.0); \
- zval_ptr_dtor(&value); \
- } \
- }
-
-#define PHP_HTTP_DO_NEGOTIATE_HANDLE_RESULT(result, supported, rs_array) \
- { \
- char *key; \
- uint key_len; \
- ulong idx; \
- \
- if (zend_hash_num_elements(result) && HASH_KEY_IS_STRING == zend_hash_get_current_key_ex(result, &key, &key_len, &idx, 1, NULL)) { \
- RETVAL_STRINGL(key, key_len-1, 0); \
- } else { \
- PHP_HTTP_DO_NEGOTIATE_DEFAULT(supported); \
- } \
- \
- if (rs_array) { \
- zend_hash_copy(Z_ARRVAL_P(rs_array), result, (copy_ctor_func_t) zval_add_ref, NULL, sizeof(zval *)); \
- } \
- \
- zend_hash_destroy(result); \
- FREE_HASHTABLE(result); \
- }
-
-#define PHP_HTTP_DO_NEGOTIATE(type, supported, rs_array) \
- { \
- HashTable *result; \
- if ((result = php_http_negotiate_ ##type(supported TSRMLS_CC))) { \
- PHP_HTTP_DO_NEGOTIATE_HANDLE_RESULT(result, supported, rs_array); \
- } else { \
- PHP_HTTP_DO_NEGOTIATE_HANDLE_DEFAULT(supported, rs_array); \
- } \
- }
-
PHP_METHOD(HttpEnv, negotiateLanguage)
{
HashTable *supported;
}
PHP_HTTP_DO_NEGOTIATE(language, supported, rs_array);
+ } else {
+ RETURN_FALSE;
}
- RETURN_FALSE;
}
PHP_METHOD(HttpEnv, negotiateCharset)
array_init(rs_array);
}
PHP_HTTP_DO_NEGOTIATE(charset, supported, rs_array);
+ } else {
+ RETURN_FALSE;
+ }
+}
+
+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;
}
- RETURN_FALSE;
}
PHP_METHOD(HttpEnv, negotiateContentType)
array_init(rs_array);
}
PHP_HTTP_DO_NEGOTIATE(content_type, supported, rs_array);
+ } else {
+ RETURN_FALSE;
}
- RETURN_FALSE;
}
PHP_METHOD(HttpEnv, negotiate)
{
HashTable *supported;
zval *rs_array = NULL;
- char *value_str;
- int value_len;
+ char *value_str, *sep_str = NULL;
+ int value_len, sep_len = 0;
- if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sH|z", &value_str, &value_len, &supported, &rs_array)) {
+ if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sH|s!z", &value_str, &value_len, &supported, &sep_str, &sep_len, &rs_array)) {
HashTable *rs;
if (rs_array) {
array_init(rs_array);
}
- if ((rs = php_http_negotiate(value_str, supported, php_http_negotiate_default_func TSRMLS_CC))) {
+ if ((rs = php_http_negotiate(value_str, value_len, supported, sep_str, sep_len TSRMLS_CC))) {
PHP_HTTP_DO_NEGOTIATE_HANDLE_RESULT(rs, supported, rs_array);
} else {
PHP_HTTP_DO_NEGOTIATE_HANDLE_DEFAULT(supported, rs_array);
}
+ } else {
+ RETURN_FALSE;
}
- RETURN_FALSE;
}
-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);
}
}
-PHP_METHOD(HttpEnv, parseParams)
-{
- char *param_str;
- int param_len;
- long flags = PHP_HTTP_PARAMS_DEFAULT;
-
- if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|l", ¶m_str, ¶m_len, &flags)) {
- RETURN_FALSE;
- }
-
- array_init(return_value);
- if (SUCCESS != php_http_params_parse(param_str, flags, php_http_params_parse_default_func, Z_ARRVAL_P(return_value) TSRMLS_CC)) {
- zval_dtor(return_value);
- RETURN_FALSE;
- }
-}
-
zend_class_entry *php_http_env_request_class_entry;
#undef PHP_HTTP_BEGIN_ARGS
{
PHP_HTTP_REGISTER_CLASS(http, Env, http_env, NULL, 0);
- zend_declare_class_constant_long(php_http_env_class_entry, ZEND_STRL("PARAMS_ALLOW_COMMA"), PHP_HTTP_PARAMS_ALLOW_COMMA TSRMLS_CC);
- zend_declare_class_constant_long(php_http_env_class_entry, ZEND_STRL("PARAMS_ALLOW_FAILURE"), PHP_HTTP_PARAMS_ALLOW_FAILURE TSRMLS_CC);
- zend_declare_class_constant_long(php_http_env_class_entry, ZEND_STRL("PARAMS_RAISE_ERROR"), PHP_HTTP_PARAMS_RAISE_ERROR TSRMLS_CC);
- zend_declare_class_constant_long(php_http_env_class_entry, ZEND_STRL("PARAMS_DEFAULT"), PHP_HTTP_PARAMS_DEFAULT TSRMLS_CC);
- zend_declare_class_constant_long(php_http_env_class_entry, ZEND_STRL("PARAMS_COLON_SEPARATOR"), PHP_HTTP_PARAMS_COLON_SEPARATOR TSRMLS_CC);
-
- PHP_HTTP_REGISTER_CLASS(http\\env, Request, http_env_request, php_http_message_class_entry, 0);
+ PHP_HTTP_REGISTER_CLASS(http\\Env, Request, http_env_request, php_http_message_class_entry, 0);
return SUCCESS;
}