void php_http_header_to_callback(HashTable *headers, zend_bool crlf, php_http_pass_format_callback_t cb, void *cb_arg)
{
+ php_http_arrkey_t key;
+ zval *header;
+
+ ZEND_HASH_FOREACH_KEY_VAL(headers, key.h, key.key, header)
+ {
+ if (key.key) {
+ php_http_header_to_callback_ex(key.key->val, header, crlf, cb, cb_arg);
+ }
+ }
+ ZEND_HASH_FOREACH_END();
+/*
+<<<<<<< HEAD
php_http_arrkey_t key;
zval *header, *single_header;
cb(cb_arg, crlf ? "%s: %s" PHP_HTTP_CRLF : "%s: %s", key.key->val, zs->val);
zend_string_release(zs);
}
- }
- }
- ZEND_HASH_FOREACH_END();
+=======
+>>>>>>> 343738ad56eb70017704fdac57cf0d74da3d0f2e
+*/
}
void php_http_header_to_string(php_http_buffer_t *str, HashTable *headers)
php_http_header_to_callback(headers, 1, (php_http_pass_format_callback_t) php_http_buffer_appendf, str);
}
+void php_http_header_to_callback_ex(const char *key, zval *val, zend_bool crlf, php_http_pass_format_callback_t cb, void *cb_arg)
+{
+ zval *aval;
+ zend_string *str;
+
+ ZVAL_DEREF(val);
+ switch (Z_TYPE_P(val)) {
+ case IS_ARRAY:
+ ZEND_HASH_FOREACH_VAL(Z_ARRVAL_P(val), aval)
+ {
+ php_http_header_to_callback_ex(key, aval, crlf, cb, cb_arg);
+ }
+ ZEND_HASH_FOREACH_END();
+ break;
+
+ case IS_TRUE:
+ cb(cb_arg, "%s: true%s", key, crlf ? PHP_HTTP_CRLF:"");
+ break;
+
+ case IS_FALSE:
+ cb(cb_arg, "%s: false%s", key, crlf ? PHP_HTTP_CRLF:"");
+ break;
+
+ default:
+ str = zval_get_string(val);
+ cb(cb_arg, "%s: %s%s", key, str->val, crlf ? PHP_HTTP_CRLF:"");
+ zend_string_release(str);
+ break;
+ }
+}
+
+void php_http_header_to_string_ex(php_http_buffer_t *str, const char *key, zval *val)
+{
+ php_http_header_to_callback_ex(key, val, 1, (php_http_pass_format_callback_t) php_http_buffer_appendf, str);
+}
+
zend_string *php_http_header_value_array_to_string(zval *header)
{
zval *val;
}
}
+static zend_class_entry *php_http_header_class_entry;
+zend_class_entry *php_http_header_get_class_entry(void)
+{
+ return php_http_header_class_entry;
+}
+
ZEND_BEGIN_ARG_INFO_EX(ai_HttpHeader___construct, 0, 0, 0)
ZEND_ARG_INFO(0, name)
ZEND_ARG_INFO(0, value)
if (name_str && name_len) {
char *pretty_str = estrndup(name_str, name_len);
- zend_update_property_stringl(php_http_header_class_entry, getThis(), ZEND_STRL("name"), php_http_pretty_key(pretty_str, name_len, 1, 1), name_len);
+ zend_update_property_stringl(php_http_header_class_entry, Z_OBJ_P(ZEND_THIS), ZEND_STRL("name"), php_http_pretty_key(pretty_str, name_len, 1, 1), name_len);
efree(pretty_str);
}
if (value_str && value_len) {
- zend_update_property_stringl(php_http_header_class_entry, getThis(), ZEND_STRL("value"), value_str, value_len);
+ zend_update_property_stringl(php_http_header_class_entry, Z_OBJ_P(ZEND_THIS), ZEND_STRL("value"), value_str, value_len);
}
}
-ZEND_BEGIN_ARG_INFO_EX(ai_HttpHeader_serialize, 0, 0, 0)
+ZEND_BEGIN_ARG_INFO_EX(ai_HttpHeader_tostring, 0, 0, 0)
ZEND_END_ARG_INFO();
-PHP_METHOD(HttpHeader, serialize)
+PHP_METHOD(HttpHeader, __toString)
{
if (SUCCESS == zend_parse_parameters_none()) {
php_http_buffer_t buf;
zval name_tmp, value_tmp;
php_http_buffer_init(&buf);
- zs = zval_get_string(zend_read_property(php_http_header_class_entry, getThis(), ZEND_STRL("name"), 0, &name_tmp));
+ zs = zval_get_string(zend_read_property(php_http_header_class_entry, Z_OBJ_P(ZEND_THIS), ZEND_STRL("name"), 0, &name_tmp));
php_http_buffer_appendz(&buf, zs);
zend_string_release(zs);
- zs = zval_get_string(zend_read_property(php_http_header_class_entry, getThis(), ZEND_STRL("value"), 0, &value_tmp));
+ zs = zval_get_string(zend_read_property(php_http_header_class_entry, Z_OBJ_P(ZEND_THIS), ZEND_STRL("value"), 0, &value_tmp));
if (zs->len) {
php_http_buffer_appends(&buf, ": ");
php_http_buffer_appendz(&buf, zs);
RETURN_EMPTY_STRING();
}
+ZEND_BEGIN_ARG_INFO_EX(ai_HttpHeader_serialize, 0, 0, 0)
+ZEND_END_ARG_INFO();
+PHP_METHOD(HttpHeader, __serialize)
+{
+ zval *val, tmp;
+
+ if (SUCCESS != zend_parse_parameters_none()) {
+ RETURN_THROWS();
+ }
+ array_init(return_value);
+
+ val = zend_read_property(php_http_header_class_entry, Z_OBJ_P(ZEND_THIS), ZEND_STRL("name"), 0, &tmp);
+ zend_hash_next_index_insert(Z_ARRVAL_P(return_value), val);
+ val = zend_read_property(php_http_header_class_entry, Z_OBJ_P(ZEND_THIS), ZEND_STRL("value"), 0, &tmp);
+ zend_hash_next_index_insert(Z_ARRVAL_P(return_value), val);
+}
+
ZEND_BEGIN_ARG_INFO_EX(ai_HttpHeader_unserialize, 0, 0, 1)
ZEND_ARG_INFO(0, serialized)
ZEND_END_ARG_INFO();
-PHP_METHOD(HttpHeader, unserialize)
+PHP_METHOD(HttpHeader, __unserialize)
{
- char *serialized_str;
- size_t serialized_len;
-
- if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS(), "s", &serialized_str, &serialized_len)) {
- HashTable ht;
-
- zend_hash_init(&ht, 1, NULL, ZVAL_PTR_DTOR, 0);
- if (SUCCESS == php_http_header_parse(serialized_str, serialized_len, &ht, NULL, NULL)) {
- if (zend_hash_num_elements(&ht)) {
- zend_string *zs, *key;
- zend_ulong idx;
-
- zend_hash_internal_pointer_reset(&ht);
- switch (zend_hash_get_current_key(&ht, &key, &idx)) {
- case HASH_KEY_IS_STRING:
- zend_update_property_str(php_http_header_class_entry, getThis(), ZEND_STRL("name"), key);
- break;
- case HASH_KEY_IS_LONG:
- zend_update_property_long(php_http_header_class_entry, getThis(), ZEND_STRL("name"), idx);
- break;
- default:
- break;
- }
- zs = zval_get_string(zend_hash_get_current_data(&ht));
- zend_update_property_str(php_http_header_class_entry, getThis(), ZEND_STRL("value"), zs);
- zend_string_release(zs);
- }
- }
- zend_hash_destroy(&ht);
+ zval *serialized;
+ HashTable *data;
+
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "h", &data) == FAILURE) {
+ RETURN_THROWS();
}
+ ZVAL_NULL(return_value);
+ serialized = zend_hash_index_find(data, 0);
+ if (serialized) {
+ zend_update_property(php_http_header_class_entry, Z_OBJ_P(ZEND_THIS), ZEND_STRL("name"), serialized);
+ }
+ serialized = zend_hash_index_find(data, 1);
+ if (serialized) {
+ zend_update_property(php_http_header_class_entry, Z_OBJ_P(ZEND_THIS), ZEND_STRL("value"), serialized);
+ }
}
ZEND_BEGIN_ARG_INFO_EX(ai_HttpHeader_match, 0, 0, 1)
ZEND_END_ARG_INFO();
PHP_METHOD(HttpHeader, match)
{
- char *val_str;
- size_t val_len;
+ char *val_str = NULL;
+ size_t val_len = 0;
zend_long flags = PHP_HTTP_MATCH_LOOSE;
zend_string *zs;
zval value_tmp;
return;
}
- zs = zval_get_string(zend_read_property(php_http_header_class_entry, getThis(), ZEND_STRL("value"), 0, &value_tmp));
+ zs = zval_get_string(zend_read_property(php_http_header_class_entry, Z_OBJ_P(ZEND_THIS), ZEND_STRL("value"), 0, &value_tmp));
RETVAL_BOOL(php_http_match(zs->val, val_str, flags));
zend_string_release(zs);
}
array_init(rs_array);
}
- zs = zval_get_string(zend_read_property(php_http_header_class_entry, getThis(), ZEND_STRL("name"), 0, &name_tmp));
+ zs = zval_get_string(zend_read_property(php_http_header_class_entry, Z_OBJ_P(ZEND_THIS), ZEND_STRL("name"), 0, &name_tmp));
if (zend_string_equals_literal(zs, "Accept")) {
sep_str = "/";
sep_len = 1;
}
zend_string_release(zs);
- zs = zval_get_string(zend_read_property(php_http_header_class_entry, getThis(), ZEND_STRL("value"), 0, &value_tmp));
+ zs = zval_get_string(zend_read_property(php_http_header_class_entry, Z_OBJ_P(ZEND_THIS), ZEND_STRL("value"), 0, &value_tmp));
if ((rs = php_http_negotiate(zs->val, zs->len, supported, sep_str, sep_len))) {
PHP_HTTP_DO_NEGOTIATE_HANDLE_RESULT(rs, supported, rs_array);
} else {
ZVAL_STRINGL(&zctor, "__construct", lenof("__construct"));
- object_init_ex(&zparams_obj, php_http_params_class_entry);
+ object_init_ex(&zparams_obj, php_http_params_get_class_entry());
zargs = (zval *) ecalloc(ZEND_NUM_ARGS()+1, sizeof(zval));
- ZVAL_COPY_VALUE(&zargs[0], zend_read_property(php_http_header_class_entry, getThis(), ZEND_STRL("value"), 0, &value_tmp));
+ ZVAL_COPY_VALUE(&zargs[0], zend_read_property(php_http_header_class_entry, Z_OBJ_P(ZEND_THIS), ZEND_STRL("value"), 0, &value_tmp));
if (ZEND_NUM_ARGS()) {
zend_get_parameters_array(ZEND_NUM_ARGS(), ZEND_NUM_ARGS(), &zargs[1]);
}
object_init_ex(&zho, ce);
Z_TRY_ADDREF_P(val);
- zend_call_method_with_2_params(&zho, ce, NULL, "__construct", NULL, &zkey, val);
+ zend_call_method_with_2_params(Z_OBJ(zho), ce, NULL, "__construct", NULL, &zkey, val);
zval_ptr_dtor(val);
zval_ptr_dtor(&zkey);
}
static zend_function_entry php_http_header_methods[] = {
- PHP_ME(HttpHeader, __construct, ai_HttpHeader___construct, ZEND_ACC_PUBLIC|ZEND_ACC_CTOR)
- PHP_ME(HttpHeader, serialize, ai_HttpHeader_serialize, ZEND_ACC_PUBLIC)
- ZEND_MALIAS(HttpHeader, __toString, serialize, ai_HttpHeader_serialize, ZEND_ACC_PUBLIC)
- ZEND_MALIAS(HttpHeader, toString, serialize, ai_HttpHeader_serialize, ZEND_ACC_PUBLIC)
- PHP_ME(HttpHeader, unserialize, ai_HttpHeader_unserialize, ZEND_ACC_PUBLIC)
+ PHP_ME(HttpHeader, __construct, ai_HttpHeader___construct, ZEND_ACC_PUBLIC)
+ PHP_ME(HttpHeader, __serialize, ai_HttpHeader_serialize, ZEND_ACC_PUBLIC)
+ PHP_ME(HttpHeader, __toString, ai_HttpHeader_tostring, ZEND_ACC_PUBLIC)
+ ZEND_MALIAS(HttpHeader, toString, __toString, ai_HttpHeader_tostring, ZEND_ACC_PUBLIC)
+ PHP_ME(HttpHeader, __unserialize, ai_HttpHeader_unserialize, ZEND_ACC_PUBLIC)
PHP_ME(HttpHeader, match, ai_HttpHeader_match, ZEND_ACC_PUBLIC)
PHP_ME(HttpHeader, negotiate, ai_HttpHeader_negotiate, ZEND_ACC_PUBLIC)
PHP_ME(HttpHeader, getParams, ai_HttpHeader_getParams, ZEND_ACC_PUBLIC)
EMPTY_FUNCTION_ENTRY
};
-zend_class_entry *php_http_header_class_entry;
-
PHP_MINIT_FUNCTION(http_header)
{
zend_class_entry ce = {0};
INIT_NS_CLASS_ENTRY(ce, "http", "Header", php_http_header_methods);
php_http_header_class_entry = zend_register_internal_class(&ce);
- zend_class_implements(php_http_header_class_entry, 1, zend_ce_serializable);
zend_declare_class_constant_long(php_http_header_class_entry, ZEND_STRL("MATCH_LOOSE"), PHP_HTTP_MATCH_LOOSE);
zend_declare_class_constant_long(php_http_header_class_entry, ZEND_STRL("MATCH_CASE"), PHP_HTTP_MATCH_CASE);
zend_declare_class_constant_long(php_http_header_class_entry, ZEND_STRL("MATCH_WORD"), PHP_HTTP_MATCH_WORD);