2 +--------------------------------------------------------------------+
4 +--------------------------------------------------------------------+
5 | Redistribution and use in source and binary forms, with or without |
6 | modification, are permitted provided that the conditions mentioned |
7 | in the accompanying LICENSE file are met. |
8 +--------------------------------------------------------------------+
9 | Copyright (c) 2004-2014, Michael Wallner <mike@php.net> |
10 +--------------------------------------------------------------------+
13 #include "php_http_api.h"
15 php_http_cookie_list_t
*php_http_cookie_list_init(php_http_cookie_list_t
*list
)
18 list
= emalloc(sizeof(*list
));
21 zend_hash_init(&list
->cookies
, 0, NULL
, ZVAL_PTR_DTOR
, 0);
22 zend_hash_init(&list
->extras
, 0, NULL
, ZVAL_PTR_DTOR
, 0);
33 php_http_cookie_list_t
*php_http_cookie_list_copy(php_http_cookie_list_t
*from
, php_http_cookie_list_t
*to
)
35 to
= php_http_cookie_list_init(to
);
37 array_copy(&from
->cookies
, &to
->cookies
);
38 array_copy(&from
->extras
, &to
->extras
);
40 PTR_SET(to
->path
, from
->path
? estrdup(from
->path
) : NULL
);
41 PTR_SET(to
->domain
, from
->domain
? estrdup(from
->domain
) : NULL
);
42 to
->expires
= from
->expires
;
43 to
->max_age
= from
->max_age
;
44 to
->flags
= from
->flags
;
49 void php_http_cookie_list_dtor(php_http_cookie_list_t
*list
)
52 zend_hash_destroy(&list
->cookies
);
53 zend_hash_destroy(&list
->extras
);
55 PTR_SET(list
->path
, NULL
);
56 PTR_SET(list
->domain
, NULL
);
62 void php_http_cookie_list_free(php_http_cookie_list_t
**list
)
65 php_http_cookie_list_dtor(*list
);
71 const char *php_http_cookie_list_get_cookie(php_http_cookie_list_t
*list
, const char *name
, size_t name_len
, zval
*zcookie
)
73 zval
*cookie
= zend_symtable_str_find(&list
->cookies
, name
, name_len
);
75 if (!cookie
|| (Z_TYPE_P(cookie
) != IS_STRING
)) {
81 return Z_STRVAL_P(cookie
);
84 const char *php_http_cookie_list_get_extra(php_http_cookie_list_t
*list
, const char *name
, size_t name_len
, zval
*zextra
)
86 zval
*extra
= zend_symtable_str_find(&list
->extras
, name
, name_len
);
88 if (!extra
|| (Z_TYPE_P(extra
) != IS_STRING
)) {
94 return Z_STRVAL_P(extra
);
97 void php_http_cookie_list_add_cookie(php_http_cookie_list_t
*list
, const char *name
, size_t name_len
, const char *value
, size_t value_len
)
101 ZVAL_STRINGL(&cookie_value
, value
, value_len
);
102 zend_symtable_str_update(&list
->cookies
, name
, name_len
, &cookie_value
);
105 void php_http_cookie_list_add_extra(php_http_cookie_list_t
*list
, const char *name
, size_t name_len
, const char *value
, size_t value_len
)
109 ZVAL_STRINGL(&extra_value
, value
, value_len
);
110 zend_symtable_str_update(&list
->extras
, name
, name_len
, &extra_value
);
113 #define _KEY_IS(s) (key->key && key->key->len == sizeof(s)-1 && !strncasecmp(key->key->val, (s), key->key->len))
114 static void add_entry(php_http_cookie_list_t
*list
, char **allowed_extras
, long flags
, zend_hash_key
*key
, zval
*val
)
120 convert_to_string(arg
);
122 if (!(flags
& PHP_HTTP_COOKIE_PARSE_RAW
)) {
123 Z_STRLEN_P(arg
) = php_raw_url_decode(Z_STRVAL_P(arg
), Z_STRLEN_P(arg
));
124 zend_string_forget_hash_val(Z_STR_P(arg
));
128 PTR_SET(list
->path
, estrndup(Z_STRVAL_P(arg
), Z_STRLEN_P(arg
)));
129 } else if _KEY_IS("domain") {
130 PTR_SET(list
->domain
, estrndup(Z_STRVAL_P(arg
), Z_STRLEN_P(arg
)));
131 } else if _KEY_IS("expires") {
132 char *date
= estrndup(Z_STRVAL_P(arg
), Z_STRLEN_P(arg
));
133 list
->expires
= php_parse_date(date
, NULL
);
135 } else if _KEY_IS("max-age") {
136 list
->max_age
= strtol(Z_STRVAL_P(arg
), NULL
, 10);
137 } else if _KEY_IS("secure") {
138 list
->flags
|= PHP_HTTP_COOKIE_SECURE
;
139 } else if _KEY_IS("httpOnly") {
140 list
->flags
|= PHP_HTTP_COOKIE_HTTPONLY
;
142 php_http_arrkey_t tmp
= {0};
144 php_http_arrkey_stringify(&tmp
, key
);
146 /* check for extra */
147 if (allowed_extras
) {
148 char **ae
= allowed_extras
;
150 if (!strncasecmp(*ae
, tmp
.key
->val
, tmp
.key
->len
)) {
151 zend_symtable_update(&list
->extras
, tmp
.key
, arg
);
152 php_http_arrkey_dtor(&tmp
);
159 zend_symtable_update(&list
->cookies
, key
->key
, arg
);
161 php_http_arrkey_dtor(&tmp
);
168 php_http_cookie_list_t
*php_http_cookie_list_parse(php_http_cookie_list_t
*list
, const char *str
, size_t len
, long flags
, char **allowed_extras
)
170 php_http_params_opts_t opts
;
172 zend_hash_key k
, arg_k
;
173 zval
*param
, *val
, *args
, *arg
;
175 php_http_params_opts_default_get(&opts
);
176 opts
.input
.str
= estrndup(str
, len
);
177 opts
.input
.len
= len
;
179 zend_hash_init(¶ms
, 10, NULL
, ZVAL_PTR_DTOR
, 0);
180 php_http_params_parse(¶ms
, &opts
);
181 efree(opts
.input
.str
);
183 list
= php_http_cookie_list_init(list
);
184 ZEND_HASH_FOREACH_KEY_VAL(¶ms
, k
.h
, k
.key
, param
)
186 if (Z_TYPE_P(param
) == IS_ARRAY
) {
187 if ((val
= zend_hash_str_find(Z_ARRVAL_P(param
), ZEND_STRL("value")))) {
188 add_entry(list
, NULL
, flags
, &k
, val
);
190 if ((args
= zend_hash_str_find(Z_ARRVAL_P(param
), ZEND_STRL("arguments"))) && Z_TYPE_P(args
) == IS_ARRAY
) {
191 ZEND_HASH_FOREACH_KEY_VAL(Z_ARRVAL_P(args
), arg_k
.h
, arg_k
.key
, arg
) {
192 add_entry(list
, allowed_extras
, flags
, &arg_k
, arg
);
193 } ZEND_HASH_FOREACH_END();
197 ZEND_HASH_FOREACH_END();
199 zend_hash_destroy(¶ms
);
204 void php_http_cookie_list_to_struct(php_http_cookie_list_t
*list
, zval
*strct
)
206 zval cookies
, extras
, tmp
;
207 HashTable
*ht
= HASH_OF(strct
);
209 array_init_size(&cookies
, zend_hash_num_elements(&list
->cookies
));
210 array_copy(&list
->cookies
, Z_ARRVAL(cookies
));
211 zend_symtable_str_update(ht
, ZEND_STRL("cookies"), &cookies
);
213 array_init_size(&extras
, zend_hash_num_elements(&list
->extras
));
214 array_copy(&list
->extras
, Z_ARRVAL(extras
));
215 zend_symtable_str_update(ht
, ZEND_STRL("extras"), &extras
);
217 ZVAL_LONG(&tmp
, list
->flags
);
218 zend_symtable_str_update(ht
, ZEND_STRL("flags"), &tmp
);
219 ZVAL_LONG(&tmp
, list
->expires
);
220 zend_symtable_str_update(ht
, ZEND_STRL("expires"), &tmp
);
221 ZVAL_LONG(&tmp
, list
->max_age
);
222 zend_symtable_str_update(ht
, ZEND_STRL("max-age"), &tmp
);
223 ZVAL_STRING(&tmp
, STR_PTR(list
->path
));
224 zend_symtable_str_update(ht
, ZEND_STRL("path"), &tmp
);
225 ZVAL_STRING(&tmp
, STR_PTR(list
->domain
));
226 zend_symtable_str_update(ht
, ZEND_STRL("domain"), &tmp
);
229 php_http_cookie_list_t
*php_http_cookie_list_from_struct(php_http_cookie_list_t
*list
, zval
*strct
)
235 list
= php_http_cookie_list_init(list
);
237 if ((tmp
= zend_hash_str_find(ht
, ZEND_STRL("cookies"))) && Z_TYPE_P(tmp
) == IS_ARRAY
){
238 array_copy(Z_ARRVAL_P(tmp
), &list
->cookies
);
240 if ((tmp
= zend_hash_str_find(ht
, ZEND_STRL("extras"))) && Z_TYPE_P(tmp
) == IS_ARRAY
){
241 array_copy(Z_ARRVAL_P(tmp
), &list
->extras
);
243 if ((tmp
= zend_hash_str_find(ht
, ZEND_STRL("flags")))) {
244 list
->flags
= zval_get_long(tmp
);
246 if ((tmp
= zend_hash_str_find(ht
, ZEND_STRL("expires")))) {
247 if (Z_TYPE_P(tmp
) == IS_LONG
) {
248 list
->expires
= Z_LVAL_P(tmp
);
251 zend_string
*lstr
= zval_get_string(tmp
);
253 if (IS_LONG
== is_numeric_string(lstr
->val
, lstr
->len
, &lval
, NULL
, 0)) {
254 list
->expires
= lval
;
256 list
->expires
= php_parse_date(lstr
->val
, NULL
);
259 zend_string_release(lstr
);
262 if ((tmp
= zend_hash_str_find(ht
, ZEND_STRL("max-age")))) {
263 if (Z_TYPE_P(tmp
) == IS_LONG
) {
264 list
->max_age
= Z_LVAL_P(tmp
);
267 zend_string
*lstr
= zval_get_string(tmp
);
269 if (IS_LONG
== is_numeric_string(lstr
->val
, lstr
->len
, &lval
, NULL
, 0)) {
270 list
->max_age
= lval
;
273 zend_string_release(lstr
);
276 if ((tmp
= zend_hash_str_find(ht
, ZEND_STRL("path")))) {
277 zend_string
*str
= zval_get_string(tmp
);
279 list
->path
= estrndup(str
->val
, str
->len
);
280 zend_string_release(str
);
282 if ((tmp
= zend_hash_str_find(ht
, ZEND_STRL("domain")))) {
283 zend_string
*str
= zval_get_string(tmp
);
285 list
->domain
= estrndup(str
->val
, str
->len
);
286 zend_string_release(str
);
292 static inline void append_encoded(php_http_buffer_t
*buf
, const char *key
, size_t key_len
, const char *val
, size_t val_len
)
294 zend_string
*enc_str
[2];
296 enc_str
[0] = php_raw_url_encode(key
, key_len
);
297 enc_str
[1] = php_raw_url_encode(val
, val_len
);
299 php_http_buffer_append(buf
, enc_str
[0]->val
, enc_str
[0]->len
);
300 php_http_buffer_appends(buf
, "=");
301 php_http_buffer_append(buf
, enc_str
[1]->val
, enc_str
[1]->len
);
302 php_http_buffer_appends(buf
, "; ");
304 zend_string_release(enc_str
[0]);
305 zend_string_release(enc_str
[1]);
308 void php_http_cookie_list_to_string(php_http_cookie_list_t
*list
, char **str
, size_t *len
)
310 php_http_buffer_t buf
;
314 php_http_buffer_init(&buf
);
316 ZEND_HASH_FOREACH_KEY_VAL(&list
->cookies
, key
.h
, key
.key
, val
)
318 zend_string
*str
= zval_get_string(val
);
319 php_http_arrkey_t arrkey
= {0};
321 php_http_arrkey_stringify(&arrkey
, &key
);
322 append_encoded(&buf
, arrkey
.key
->val
, arrkey
.key
->len
, str
->val
, str
->len
);
323 php_http_arrkey_dtor(&arrkey
);
324 zend_string_release(str
);
326 ZEND_HASH_FOREACH_END();
328 if (list
->domain
&& *list
->domain
) {
329 php_http_buffer_appendf(&buf
, "domain=%s; ", list
->domain
);
331 if (list
->path
&& *list
->path
) {
332 php_http_buffer_appendf(&buf
, "path=%s; ", list
->path
);
334 if (list
->expires
>= 0) {
335 zend_string
*date
= php_format_date(ZEND_STRL(PHP_HTTP_DATE_FORMAT
), list
->expires
, 0);
336 php_http_buffer_appendf(&buf
, "expires=%s; ", date
->val
);
337 zend_string_release(date
);
339 if (list
->max_age
>= 0) {
340 php_http_buffer_appendf(&buf
, "max-age=%ld; ", list
->max_age
);
343 ZEND_HASH_FOREACH_KEY_VAL(&list
->extras
, key
.h
, key
.key
, val
)
345 zend_string
*str
= zval_get_string(val
);
346 php_http_arrkey_t arrkey
;
348 php_http_arrkey_stringify(&arrkey
, &key
);
349 append_encoded(&buf
, arrkey
.key
->val
, arrkey
.key
->len
, str
->val
, str
->len
);
350 php_http_arrkey_dtor(&arrkey
);
351 zend_string_release(str
);
353 ZEND_HASH_FOREACH_END();
355 if (list
->flags
& PHP_HTTP_COOKIE_SECURE
) {
356 php_http_buffer_appends(&buf
, "secure; ");
358 if (list
->flags
& PHP_HTTP_COOKIE_HTTPONLY
) {
359 php_http_buffer_appends(&buf
, "httpOnly; ");
362 php_http_buffer_fix(&buf
);
369 static zend_object_handlers php_http_cookie_object_handlers
;
371 zend_object
*php_http_cookie_object_new(zend_class_entry
*ce
)
373 return &php_http_cookie_object_new_ex(ce
, NULL
)->zo
;
376 php_http_cookie_object_t
*php_http_cookie_object_new_ex(zend_class_entry
*ce
, php_http_cookie_list_t
*list
)
378 php_http_cookie_object_t
*o
;
381 ce
= php_http_cookie_class_entry
;
384 o
= ecalloc(sizeof(*o
) + sizeof(zval
) * (ce
->default_properties_count
- 1), 1);
385 zend_object_std_init(&o
->zo
, ce
);
386 object_properties_init(&o
->zo
, ce
);
387 o
->zo
.handlers
= &php_http_cookie_object_handlers
;
396 #define PHP_HTTP_COOKIE_OBJECT_INIT(obj) \
399 obj->list = php_http_cookie_list_init(NULL); \
403 zend_object
*php_http_cookie_object_clone(zval
*obj
)
405 php_http_cookie_object_t
*new_obj
, *old_obj
= PHP_HTTP_OBJ(NULL
, obj
);
407 PHP_HTTP_COOKIE_OBJECT_INIT(old_obj
);
409 new_obj
= php_http_cookie_object_new_ex(old_obj
->zo
.ce
, php_http_cookie_list_copy(old_obj
->list
, NULL
));
410 zend_objects_clone_members(&new_obj
->zo
, &old_obj
->zo
);
415 void php_http_cookie_object_free(zend_object
*object TSRMLS_DC
)
417 php_http_cookie_object_t
*obj
= PHP_HTTP_OBJ(object
, NULL
);
419 php_http_cookie_list_free(&obj
->list
);
420 zend_object_std_dtor(object
);
423 ZEND_BEGIN_ARG_INFO_EX(ai_HttpCookie___construct
, 0, 0, 0)
424 ZEND_ARG_INFO(0, cookie_string
)
425 ZEND_ARG_INFO(0, parser_flags
)
426 ZEND_ARG_INFO(0, allowed_extras
)
428 static PHP_METHOD(HttpCookie
, __construct
)
430 php_http_cookie_object_t
*obj
;
431 zval
*zcookie
= NULL
;
434 HashTable
*allowed_extras
= NULL
;
435 zend_error_handling zeh
;
437 php_http_expect(SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS(), "|z!lH", &zcookie
, &flags
, &allowed_extras
), invalid_arg
, return);
439 obj
= PHP_HTTP_OBJ(NULL
, getThis());
441 zend_replace_error_handling(EH_THROW
, php_http_exception_runtime_class_entry
, &zeh
);
444 if (allowed_extras
&& zend_hash_num_elements(allowed_extras
)) {
445 char **ae_ptr
= safe_emalloc(zend_hash_num_elements(allowed_extras
) + 1, sizeof(char *), 0);
449 ZEND_HASH_FOREACH_VAL(allowed_extras
, val
)
451 zend_string
*str
= zval_get_string(val
);
453 *ae_ptr
++ = estrndup(str
->val
, str
->len
);
454 zend_string_release(str
);
456 ZEND_HASH_FOREACH_END();
460 switch (Z_TYPE_P(zcookie
)) {
462 if (instanceof_function(Z_OBJCE_P(zcookie
), php_http_cookie_class_entry
)) {
463 php_http_cookie_object_t
*zco
= PHP_HTTP_OBJ(NULL
, zcookie
);
466 obj
->list
= php_http_cookie_list_copy(zco
->list
, NULL
);
472 obj
->list
= php_http_cookie_list_from_struct(obj
->list
, zcookie
);
475 zend_string
*str
= zval_get_string(zcookie
);
477 obj
->list
= php_http_cookie_list_parse(obj
->list
, str
->val
, str
->len
, flags
, ae
);
478 zend_string_release(str
);
486 for (ae_ptr
= ae
; *ae_ptr
; ++ae_ptr
) {
492 zend_restore_error_handling(&zeh
);
494 PHP_HTTP_COOKIE_OBJECT_INIT(obj
);
497 ZEND_BEGIN_ARG_INFO_EX(ai_HttpCookie_getCookies
, 0, 0, 0)
498 ZEND_END_ARG_INFO();;
499 static PHP_METHOD(HttpCookie
, getCookies
)
501 php_http_cookie_object_t
*obj
;
503 if (SUCCESS
!= zend_parse_parameters_none()) {
507 obj
= PHP_HTTP_OBJ(NULL
, getThis());
509 PHP_HTTP_COOKIE_OBJECT_INIT(obj
);
511 array_init_size(return_value
, zend_hash_num_elements(&obj
->list
->cookies
));
512 array_copy(&obj
->list
->cookies
, Z_ARRVAL_P(return_value
));
515 ZEND_BEGIN_ARG_INFO_EX(ai_HttpCookie_setCookies
, 0, 0, 0)
516 ZEND_ARG_INFO(0, cookies
)
518 static PHP_METHOD(HttpCookie
, setCookies
)
520 HashTable
*cookies
= NULL
;
521 php_http_cookie_object_t
*obj
;
523 php_http_expect(SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS(), "|H", &cookies
), invalid_arg
, return);
525 obj
= PHP_HTTP_OBJ(NULL
, getThis());
527 PHP_HTTP_COOKIE_OBJECT_INIT(obj
);
529 zend_hash_clean(&obj
->list
->cookies
);
531 array_copy_strings(cookies
, &obj
->list
->cookies
);
534 RETURN_ZVAL_FAST(getThis());
537 ZEND_BEGIN_ARG_INFO_EX(ai_HttpCookie_addCookies
, 0, 0, 1)
538 ZEND_ARG_INFO(0, cookies
)
540 static PHP_METHOD(HttpCookie
, addCookies
)
542 HashTable
*cookies
= NULL
;
543 php_http_cookie_object_t
*obj
;
545 php_http_expect(SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS(), "H", &cookies
), invalid_arg
, return);
547 obj
= PHP_HTTP_OBJ(NULL
, getThis());
549 PHP_HTTP_COOKIE_OBJECT_INIT(obj
);
551 array_join(cookies
, &obj
->list
->cookies
, 1, ARRAY_JOIN_STRONLY
|ARRAY_JOIN_STRINGIFY
);
553 RETVAL_ZVAL_FAST(getThis());
556 ZEND_BEGIN_ARG_INFO_EX(ai_HttpCookie_getExtras
, 0, 0, 0)
558 static PHP_METHOD(HttpCookie
, getExtras
)
560 php_http_cookie_object_t
*obj
;
562 if (SUCCESS
!= zend_parse_parameters_none()) {
566 obj
= PHP_HTTP_OBJ(NULL
, getThis());
568 PHP_HTTP_COOKIE_OBJECT_INIT(obj
);
570 array_init_size(return_value
, zend_hash_num_elements(&obj
->list
->extras
));
571 array_copy(&obj
->list
->extras
, Z_ARRVAL_P(return_value
));
574 ZEND_BEGIN_ARG_INFO_EX(ai_HttpCookie_setExtras
, 0, 0, 0)
575 ZEND_ARG_INFO(0, extras
)
577 static PHP_METHOD(HttpCookie
, setExtras
)
579 HashTable
*extras
= NULL
;
580 php_http_cookie_object_t
*obj
;
582 php_http_expect(SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS(), "|H", &extras
), invalid_arg
, return);
584 obj
= PHP_HTTP_OBJ(NULL
, getThis());
586 PHP_HTTP_COOKIE_OBJECT_INIT(obj
);
588 zend_hash_clean(&obj
->list
->extras
);
590 array_copy_strings(extras
, &obj
->list
->extras
);
593 RETVAL_ZVAL_FAST(getThis());
596 ZEND_BEGIN_ARG_INFO_EX(ai_HttpCookie_addExtras
, 0, 0, 1)
597 ZEND_ARG_INFO(0, extras
)
599 static PHP_METHOD(HttpCookie
, addExtras
)
601 HashTable
*extras
= NULL
;
602 php_http_cookie_object_t
*obj
;
604 php_http_expect(SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS(), "H", &extras
), invalid_arg
, return);
606 obj
= PHP_HTTP_OBJ(NULL
, getThis());
608 PHP_HTTP_COOKIE_OBJECT_INIT(obj
);
610 array_join(extras
, &obj
->list
->extras
, 1, ARRAY_JOIN_STRONLY
|ARRAY_JOIN_STRINGIFY
);
612 RETVAL_ZVAL_FAST(getThis());
615 ZEND_BEGIN_ARG_INFO_EX(ai_HttpCookie_getCookie
, 0, 0, 1)
616 ZEND_ARG_INFO(0, name
)
618 static PHP_METHOD(HttpCookie
, getCookie
)
623 php_http_cookie_object_t
*obj
;
625 if (SUCCESS
!= zend_parse_parameters(ZEND_NUM_ARGS(), "s", &name_str
, &name_len
)) {
629 obj
= PHP_HTTP_OBJ(NULL
, getThis());
631 PHP_HTTP_COOKIE_OBJECT_INIT(obj
);
633 if (php_http_cookie_list_get_cookie(obj
->list
, name_str
, name_len
, &zvalue
)) {
634 RETURN_ZVAL_FAST(&zvalue
);
638 ZEND_BEGIN_ARG_INFO_EX(ai_HttpCookie_setCookie
, 0, 0, 1)
639 ZEND_ARG_INFO(0, cookie_name
)
640 ZEND_ARG_INFO(0, cookie_value
)
642 static PHP_METHOD(HttpCookie
, setCookie
)
644 char *name_str
, *value_str
= NULL
;
645 size_t name_len
, value_len
= 0;
646 php_http_cookie_object_t
*obj
;
648 php_http_expect(SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS(), "s|s!", &name_str
, &name_len
, &value_str
, &value_len
), invalid_arg
, return);
650 obj
= PHP_HTTP_OBJ(NULL
, getThis());
652 PHP_HTTP_COOKIE_OBJECT_INIT(obj
);
655 php_http_cookie_list_del_cookie(obj
->list
, name_str
, name_len
);
657 php_http_cookie_list_add_cookie(obj
->list
, name_str
, name_len
, value_str
, value_len
);
660 RETVAL_ZVAL_FAST(getThis());
663 ZEND_BEGIN_ARG_INFO_EX(ai_HttpCookie_addCookie
, 0, 0, 2)
664 ZEND_ARG_INFO(0, cookie_name
)
665 ZEND_ARG_INFO(0, cookie_value
)
667 static PHP_METHOD(HttpCookie
, addCookie
)
669 char *name_str
, *value_str
;
670 size_t name_len
, value_len
;
671 php_http_cookie_object_t
*obj
;
673 php_http_expect(SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS(), "ss", &name_str
, &name_len
, &value_str
, &value_len
), invalid_arg
, return);
675 obj
= PHP_HTTP_OBJ(NULL
, getThis());
677 PHP_HTTP_COOKIE_OBJECT_INIT(obj
);
679 php_http_cookie_list_add_cookie(obj
->list
, name_str
, name_len
, value_str
, value_len
);
681 RETVAL_ZVAL_FAST(getThis());
684 ZEND_BEGIN_ARG_INFO_EX(ai_HttpCookie_getExtra
, 0, 0, 1)
685 ZEND_ARG_INFO(0, name
)
687 static PHP_METHOD(HttpCookie
, getExtra
)
692 php_http_cookie_object_t
*obj
;
694 if (SUCCESS
!= zend_parse_parameters(ZEND_NUM_ARGS(), "s", &name_str
, &name_len
)) {
698 obj
= PHP_HTTP_OBJ(NULL
, getThis());
700 PHP_HTTP_COOKIE_OBJECT_INIT(obj
);
702 if (php_http_cookie_list_get_extra(obj
->list
, name_str
, name_len
, &zvalue
)) {
703 RETURN_ZVAL_FAST(&zvalue
);
707 ZEND_BEGIN_ARG_INFO_EX(ai_HttpCookie_setExtra
, 0, 0, 1)
708 ZEND_ARG_INFO(0, extra_name
)
709 ZEND_ARG_INFO(0, extra_value
)
711 static PHP_METHOD(HttpCookie
, setExtra
)
713 char *name_str
, *value_str
= NULL
;
714 size_t name_len
, value_len
= 0;
715 php_http_cookie_object_t
*obj
;
717 php_http_expect(SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS(), "s|s!", &name_str
, &name_len
, &value_str
, &value_len
), invalid_arg
, return);
719 obj
= PHP_HTTP_OBJ(NULL
, getThis());
721 PHP_HTTP_COOKIE_OBJECT_INIT(obj
);
724 php_http_cookie_list_del_extra(obj
->list
, name_str
, name_len
);
726 php_http_cookie_list_add_extra(obj
->list
, name_str
, name_len
, value_str
, value_len
);
729 RETVAL_ZVAL_FAST(getThis());
732 ZEND_BEGIN_ARG_INFO_EX(ai_HttpCookie_addExtra
, 0, 0, 2)
733 ZEND_ARG_INFO(0, extra_name
)
734 ZEND_ARG_INFO(0, extra_value
)
736 static PHP_METHOD(HttpCookie
, addExtra
)
738 char *name_str
, *value_str
;
739 size_t name_len
, value_len
;
740 php_http_cookie_object_t
*obj
;
742 php_http_expect(SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS(), "ss", &name_str
, &name_len
, &value_str
, &value_len
), invalid_arg
, return);
744 obj
= PHP_HTTP_OBJ(NULL
, getThis());
746 PHP_HTTP_COOKIE_OBJECT_INIT(obj
);
748 php_http_cookie_list_add_extra(obj
->list
, name_str
, name_len
, value_str
, value_len
);
750 RETVAL_ZVAL_FAST(getThis());
753 ZEND_BEGIN_ARG_INFO_EX(ai_HttpCookie_getDomain
, 0, 0, 0)
754 ZEND_END_ARG_INFO();;
755 static PHP_METHOD(HttpCookie
, getDomain
)
757 php_http_cookie_object_t
*obj
;
759 if (SUCCESS
!= zend_parse_parameters_none()) {
763 obj
= PHP_HTTP_OBJ(NULL
, getThis());
765 PHP_HTTP_COOKIE_OBJECT_INIT(obj
);
767 if (obj
->list
->domain
) {
768 RETURN_STRING(obj
->list
->domain
);
772 ZEND_BEGIN_ARG_INFO_EX(ai_HttpCookie_setDomain
, 0, 0, 0)
773 ZEND_ARG_INFO(0, value
)
775 static PHP_METHOD(HttpCookie
, setDomain
)
777 char *domain_str
= NULL
;
778 size_t domain_len
= 0;
779 php_http_cookie_object_t
*obj
;
781 php_http_expect(SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS(), "|s!", &domain_str
, &domain_len
), invalid_arg
, return);
783 obj
= PHP_HTTP_OBJ(NULL
, getThis());
785 PHP_HTTP_COOKIE_OBJECT_INIT(obj
);
787 PTR_SET(obj
->list
->domain
, domain_str
? estrndup(domain_str
, domain_len
) : NULL
);
789 RETVAL_ZVAL_FAST(getThis());
792 ZEND_BEGIN_ARG_INFO_EX(ai_HttpCookie_getPath
, 0, 0, 0)
793 ZEND_END_ARG_INFO();;
794 static PHP_METHOD(HttpCookie
, getPath
)
796 php_http_cookie_object_t
*obj
;
798 if (SUCCESS
!= zend_parse_parameters_none()) {
802 obj
= PHP_HTTP_OBJ(NULL
, getThis());
804 PHP_HTTP_COOKIE_OBJECT_INIT(obj
);
806 if (obj
->list
->path
) {
807 RETURN_STRING(obj
->list
->path
);
811 ZEND_BEGIN_ARG_INFO_EX(ai_HttpCookie_setPath
, 0, 0, 0)
812 ZEND_ARG_INFO(0, value
)
814 static PHP_METHOD(HttpCookie
, setPath
)
816 char *path_str
= NULL
;
818 php_http_cookie_object_t
*obj
;
820 php_http_expect(SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS(), "|s!", &path_str
, &path_len
), invalid_arg
, return);
822 obj
= PHP_HTTP_OBJ(NULL
, getThis());
824 PHP_HTTP_COOKIE_OBJECT_INIT(obj
);
826 PTR_SET(obj
->list
->path
, path_str
? estrndup(path_str
, path_len
) : NULL
);
828 RETVAL_ZVAL_FAST(getThis());
831 ZEND_BEGIN_ARG_INFO_EX(ai_HttpCookie_getExpires
, 0, 0, 0)
832 ZEND_END_ARG_INFO();;
833 static PHP_METHOD(HttpCookie
, getExpires
)
835 php_http_cookie_object_t
*obj
;
837 if (SUCCESS
!= zend_parse_parameters_none()) {
841 obj
= PHP_HTTP_OBJ(NULL
, getThis());
843 PHP_HTTP_COOKIE_OBJECT_INIT(obj
);
845 RETURN_LONG(obj
->list
->expires
);
848 ZEND_BEGIN_ARG_INFO_EX(ai_HttpCookie_setExpires
, 0, 0, 0)
849 ZEND_ARG_INFO(0, value
)
851 static PHP_METHOD(HttpCookie
, setExpires
)
854 php_http_cookie_object_t
*obj
;
856 php_http_expect(SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS(), "|l", &ts
), invalid_arg
, return);
858 obj
= PHP_HTTP_OBJ(NULL
, getThis());
860 PHP_HTTP_COOKIE_OBJECT_INIT(obj
);
862 obj
->list
->expires
= ts
;
864 RETVAL_ZVAL_FAST(getThis());
867 ZEND_BEGIN_ARG_INFO_EX(ai_HttpCookie_getMaxAge
, 0, 0, 0)
868 ZEND_END_ARG_INFO();;
869 static PHP_METHOD(HttpCookie
, getMaxAge
)
871 php_http_cookie_object_t
*obj
;
873 if (SUCCESS
!= zend_parse_parameters_none()) {
877 obj
= PHP_HTTP_OBJ(NULL
, getThis());
879 PHP_HTTP_COOKIE_OBJECT_INIT(obj
);
881 RETURN_LONG(obj
->list
->max_age
);
884 ZEND_BEGIN_ARG_INFO_EX(ai_HttpCookie_setMaxAge
, 0, 0, 0)
885 ZEND_ARG_INFO(0, value
)
887 static PHP_METHOD(HttpCookie
, setMaxAge
)
890 php_http_cookie_object_t
*obj
;
892 php_http_expect(SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS(), "|l", &ma
), invalid_arg
, return);
894 obj
= PHP_HTTP_OBJ(NULL
, getThis());
896 PHP_HTTP_COOKIE_OBJECT_INIT(obj
);
898 obj
->list
->max_age
= ma
;
900 RETVAL_ZVAL_FAST(getThis());
903 ZEND_BEGIN_ARG_INFO_EX(ai_HttpCookie_getFlags
, 0, 0, 0)
905 static PHP_METHOD(HttpCookie
, getFlags
)
907 php_http_cookie_object_t
*obj
;
909 if (SUCCESS
!= zend_parse_parameters_none()) {
913 obj
= PHP_HTTP_OBJ(NULL
, getThis());
915 PHP_HTTP_COOKIE_OBJECT_INIT(obj
);
917 RETURN_LONG(obj
->list
->flags
);
920 ZEND_BEGIN_ARG_INFO_EX(ai_HttpCookie_setFlags
, 0, 0, 0)
921 ZEND_ARG_INFO(0, value
)
923 static PHP_METHOD(HttpCookie
, setFlags
)
926 php_http_cookie_object_t
*obj
;
928 php_http_expect(SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "|l", &flags
), invalid_arg
, return);
930 obj
= PHP_HTTP_OBJ(NULL
, getThis());
932 PHP_HTTP_COOKIE_OBJECT_INIT(obj
);
934 obj
->list
->flags
= flags
;
936 RETVAL_ZVAL_FAST(getThis());
939 ZEND_BEGIN_ARG_INFO_EX(ai_HttpCookie_toString
, 0, 0, 0)
940 ZEND_END_ARG_INFO();;
941 static PHP_METHOD(HttpCookie
, toString
)
943 php_http_cookie_object_t
*obj
;
947 if (SUCCESS
!= zend_parse_parameters_none()) {
948 RETURN_EMPTY_STRING();
951 obj
= PHP_HTTP_OBJ(NULL
, getThis());
953 PHP_HTTP_COOKIE_OBJECT_INIT(obj
);
955 php_http_cookie_list_to_string(obj
->list
, &str
, &len
);
957 RETURN_NEW_STR(php_http_cs2zs(str
, len
));
960 ZEND_BEGIN_ARG_INFO_EX(ai_HttpCookie_toArray
, 0, 0, 0)
961 ZEND_END_ARG_INFO();;
962 static PHP_METHOD(HttpCookie
, toArray
)
964 php_http_cookie_object_t
*obj
;
966 if (SUCCESS
!= zend_parse_parameters_none()) {
970 obj
= PHP_HTTP_OBJ(NULL
, getThis());
972 PHP_HTTP_COOKIE_OBJECT_INIT(obj
);
974 array_init_size(return_value
, 8);
975 php_http_cookie_list_to_struct(obj
->list
, return_value
);
978 static zend_function_entry php_http_cookie_methods
[] = {
979 PHP_ME(HttpCookie
, __construct
, ai_HttpCookie___construct
, ZEND_ACC_PUBLIC
)
980 PHP_ME(HttpCookie
, getCookies
, ai_HttpCookie_getCookies
, ZEND_ACC_PUBLIC
)
981 PHP_ME(HttpCookie
, setCookies
, ai_HttpCookie_setCookies
, ZEND_ACC_PUBLIC
)
982 PHP_ME(HttpCookie
, addCookies
, ai_HttpCookie_addCookies
, ZEND_ACC_PUBLIC
)
983 PHP_ME(HttpCookie
, getCookie
, ai_HttpCookie_getCookie
, ZEND_ACC_PUBLIC
)
984 PHP_ME(HttpCookie
, setCookie
, ai_HttpCookie_setCookie
, ZEND_ACC_PUBLIC
)
985 PHP_ME(HttpCookie
, addCookie
, ai_HttpCookie_addCookie
, ZEND_ACC_PUBLIC
)
987 PHP_ME(HttpCookie
, getExtras
, ai_HttpCookie_getExtras
, ZEND_ACC_PUBLIC
)
988 PHP_ME(HttpCookie
, setExtras
, ai_HttpCookie_setExtras
, ZEND_ACC_PUBLIC
)
989 PHP_ME(HttpCookie
, addExtras
, ai_HttpCookie_addExtras
, ZEND_ACC_PUBLIC
)
990 PHP_ME(HttpCookie
, getExtra
, ai_HttpCookie_getExtra
, ZEND_ACC_PUBLIC
)
991 PHP_ME(HttpCookie
, setExtra
, ai_HttpCookie_setExtra
, ZEND_ACC_PUBLIC
)
992 PHP_ME(HttpCookie
, addExtra
, ai_HttpCookie_addExtra
, ZEND_ACC_PUBLIC
)
994 PHP_ME(HttpCookie
, getDomain
, ai_HttpCookie_getDomain
, ZEND_ACC_PUBLIC
)
995 PHP_ME(HttpCookie
, setDomain
, ai_HttpCookie_setDomain
, ZEND_ACC_PUBLIC
)
996 PHP_ME(HttpCookie
, getPath
, ai_HttpCookie_getPath
, ZEND_ACC_PUBLIC
)
997 PHP_ME(HttpCookie
, setPath
, ai_HttpCookie_setPath
, ZEND_ACC_PUBLIC
)
998 PHP_ME(HttpCookie
, getExpires
, ai_HttpCookie_getExpires
, ZEND_ACC_PUBLIC
)
999 PHP_ME(HttpCookie
, setExpires
, ai_HttpCookie_setExpires
, ZEND_ACC_PUBLIC
)
1000 PHP_ME(HttpCookie
, getMaxAge
, ai_HttpCookie_getMaxAge
, ZEND_ACC_PUBLIC
)
1001 PHP_ME(HttpCookie
, setMaxAge
, ai_HttpCookie_setMaxAge
, ZEND_ACC_PUBLIC
)
1002 PHP_ME(HttpCookie
, getFlags
, ai_HttpCookie_getFlags
, ZEND_ACC_PUBLIC
)
1003 PHP_ME(HttpCookie
, setFlags
, ai_HttpCookie_setFlags
, ZEND_ACC_PUBLIC
)
1005 PHP_ME(HttpCookie
, toArray
, ai_HttpCookie_toArray
, ZEND_ACC_PUBLIC
)
1006 PHP_ME(HttpCookie
, toString
, ai_HttpCookie_toString
, ZEND_ACC_PUBLIC
)
1007 ZEND_MALIAS(HttpCookie
, __toString
, toString
, ai_HttpCookie_toString
, ZEND_ACC_PUBLIC
)
1009 EMPTY_FUNCTION_ENTRY
1012 zend_class_entry
*php_http_cookie_class_entry
;
1014 PHP_MINIT_FUNCTION(http_cookie
)
1016 zend_class_entry ce
= {0};
1018 INIT_NS_CLASS_ENTRY(ce
, "http", "Cookie", php_http_cookie_methods
);
1019 php_http_cookie_class_entry
= zend_register_internal_class(&ce
);
1020 php_http_cookie_class_entry
->create_object
= php_http_cookie_object_new
;
1021 memcpy(&php_http_cookie_object_handlers
, zend_get_std_object_handlers(), sizeof(zend_object_handlers
));
1022 php_http_cookie_object_handlers
.offset
= XtOffsetOf(php_http_cookie_object_t
, zo
);
1023 php_http_cookie_object_handlers
.clone_obj
= php_http_cookie_object_clone
;
1024 php_http_cookie_object_handlers
.free_obj
= php_http_cookie_object_free
;
1026 zend_declare_class_constant_long(php_http_cookie_class_entry
, ZEND_STRL("PARSE_RAW"), PHP_HTTP_COOKIE_PARSE_RAW TSRMLS_CC
);
1027 zend_declare_class_constant_long(php_http_cookie_class_entry
, ZEND_STRL("SECURE"), PHP_HTTP_COOKIE_SECURE TSRMLS_CC
);
1028 zend_declare_class_constant_long(php_http_cookie_class_entry
, ZEND_STRL("HTTPONLY"), PHP_HTTP_COOKIE_HTTPONLY TSRMLS_CC
);
1040 * vim600: noet sw=4 ts=4 fdm=marker
1041 * vim<600: noet sw=4 ts=4