+#define _KEY_IS(s) (key->len == sizeof(s) && !strncasecmp(key->str, (s), key->len))
+static void add_entry(php_http_cookie_list_t *list, char **allowed_extras, long flags, php_http_array_hashkey_t *key, zval *val)
+{
+ zval *arg = php_http_zsep(1, IS_STRING, val);
+
+ if (!(flags & PHP_HTTP_COOKIE_PARSE_RAW)) {
+ Z_STRLEN_P(arg) = php_raw_url_decode(Z_STRVAL_P(arg), Z_STRLEN_P(arg));
+ }
+
+ if _KEY_IS("path") {
+ STR_SET(list->path, estrndup(Z_STRVAL_P(arg), Z_STRLEN_P(arg)));
+ } else if _KEY_IS("domain") {
+ STR_SET(list->domain, estrndup(Z_STRVAL_P(arg), Z_STRLEN_P(arg)));
+ } else if _KEY_IS("expires") {
+ char *date = estrndup(Z_STRVAL_P(arg), Z_STRLEN_P(arg));
+ list->expires = php_parse_date(date, NULL);
+ efree(date);
+ } else if _KEY_IS("secure") {
+ list->flags |= PHP_HTTP_COOKIE_SECURE;
+ } else if _KEY_IS("httpOnly") {
+ list->flags |= PHP_HTTP_COOKIE_HTTPONLY;
+ } else {
+ /* check for extra */
+ if (allowed_extras) {
+ char **ae = allowed_extras;
+
+ php_http_array_hashkey_stringify(key);
+ for (; *ae; ++ae) {
+ if (!strncasecmp(key->str, *ae, key->len)) {
+ if (key->type == HASH_KEY_IS_LONG) {
+ zend_hash_index_update(&list->extras, key->num, (void *) &arg, sizeof(zval *), NULL);
+ } else {
+ zend_hash_update(&list->extras, key->str, key->len, (void *) &arg, sizeof(zval *), NULL);
+ }
+ php_http_array_hashkey_stringfree(key);
+ return;
+ }
+ }
+ php_http_array_hashkey_stringfree(key);
+ }
+
+ /* cookie */
+ if (key->type == HASH_KEY_IS_LONG) {
+ zend_hash_index_update(&list->cookies, key->num, (void *) &arg, sizeof(zval *), NULL);
+ } else {
+ zend_hash_update(&list->cookies, key->str, key->len, (void *) &arg, sizeof(zval *), NULL);
+ }
+ return;
+ }
+ zval_ptr_dtor(&arg);
+}
+