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
)
119 convert_to_string(&arg
);
121 if (!(flags
& PHP_HTTP_COOKIE_PARSE_RAW
)) {
122 Z_STRLEN(arg
) = php_raw_url_decode(Z_STRVAL(arg
), Z_STRLEN(arg
));
123 zend_string_forget_hash_val(Z_STR(arg
));
127 PTR_SET(list
->path
, estrndup(Z_STRVAL(arg
), Z_STRLEN(arg
)));
128 } else if _KEY_IS("domain") {
129 PTR_SET(list
->domain
, estrndup(Z_STRVAL(arg
), Z_STRLEN(arg
)));
130 } else if _KEY_IS("expires") {
131 char *date
= estrndup(Z_STRVAL(arg
), Z_STRLEN(arg
));
132 list
->expires
= php_parse_date(date
, NULL
);
134 } else if _KEY_IS("max-age") {
135 list
->max_age
= zval_get_long(val
);
136 } else if _KEY_IS("secure") {
137 list
->flags
|= PHP_HTTP_COOKIE_SECURE
;
138 } else if _KEY_IS("httpOnly") {
139 list
->flags
|= PHP_HTTP_COOKIE_HTTPONLY
;
141 php_http_arrkey_t tmp
= {0};
143 php_http_arrkey_stringify(&tmp
, key
);
145 /* check for extra */
146 if (allowed_extras
) {
147 char **ae
= allowed_extras
;
149 if (!strncasecmp(*ae
, tmp
.key
->val
, tmp
.key
->len
)) {
150 zend_symtable_update(&list
->extras
, tmp
.key
, &arg
);
151 php_http_arrkey_dtor(&tmp
);
158 zend_symtable_update(&list
->cookies
, tmp
.key
, &arg
);
160 php_http_arrkey_dtor(&tmp
);
167 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
)
169 php_http_params_opts_t opts
;
171 zend_hash_key k
, arg_k
;
172 zval
*param
, *val
, *args
, *arg
;
174 php_http_params_opts_default_get(&opts
);
175 opts
.input
.str
= estrndup(str
, len
);
176 opts
.input
.len
= len
;
178 zend_hash_init(¶ms
, 10, NULL
, ZVAL_PTR_DTOR
, 0);
179 php_http_params_parse(¶ms
, &opts
);
180 efree(opts
.input
.str
);
182 list
= php_http_cookie_list_init(list
);
183 ZEND_HASH_FOREACH_KEY_VAL(¶ms
, k
.h
, k
.key
, param
)
185 if (Z_TYPE_P(param
) == IS_ARRAY
) {
186 if ((val
= zend_hash_str_find(Z_ARRVAL_P(param
), ZEND_STRL("value")))) {
187 add_entry(list
, NULL
, flags
, &k
, val
);
189 if ((args
= zend_hash_str_find(Z_ARRVAL_P(param
), ZEND_STRL("arguments"))) && Z_TYPE_P(args
) == IS_ARRAY
) {
190 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
);
194 ZEND_HASH_FOREACH_END();
198 ZEND_HASH_FOREACH_END();
200 zend_hash_destroy(¶ms
);
205 void php_http_cookie_list_to_struct(php_http_cookie_list_t
*list
, zval
*strct
)
207 zval cookies
, extras
, tmp
;
208 HashTable
*ht
= HASH_OF(strct
);
210 array_init_size(&cookies
, zend_hash_num_elements(&list
->cookies
));
211 array_copy(&list
->cookies
, Z_ARRVAL(cookies
));
212 zend_symtable_str_update(ht
, ZEND_STRL("cookies"), &cookies
);
214 array_init_size(&extras
, zend_hash_num_elements(&list
->extras
));
215 array_copy(&list
->extras
, Z_ARRVAL(extras
));
216 zend_symtable_str_update(ht
, ZEND_STRL("extras"), &extras
);
218 ZVAL_LONG(&tmp
, list
->flags
);
219 zend_symtable_str_update(ht
, ZEND_STRL("flags"), &tmp
);
220 ZVAL_LONG(&tmp
, list
->expires
);
221 zend_symtable_str_update(ht
, ZEND_STRL("expires"), &tmp
);
222 ZVAL_LONG(&tmp
, list
->max_age
);
223 zend_symtable_str_update(ht
, ZEND_STRL("max-age"), &tmp
);
224 ZVAL_STRING(&tmp
, STR_PTR(list
->path
));
225 zend_symtable_str_update(ht
, ZEND_STRL("path"), &tmp
);
226 ZVAL_STRING(&tmp
, STR_PTR(list
->domain
));
227 zend_symtable_str_update(ht
, ZEND_STRL("domain"), &tmp
);
230 php_http_cookie_list_t
*php_http_cookie_list_from_struct(php_http_cookie_list_t
*list
, zval
*strct
)
236 list
= php_http_cookie_list_init(list
);
238 if ((tmp
= zend_hash_str_find_ind(ht
, ZEND_STRL("cookies"))) && Z_TYPE_P(tmp
) == IS_ARRAY
){
239 array_copy(Z_ARRVAL_P(tmp
), &list
->cookies
);
241 if ((tmp
= zend_hash_str_find_ind(ht
, ZEND_STRL("extras"))) && Z_TYPE_P(tmp
) == IS_ARRAY
){
242 array_copy(Z_ARRVAL_P(tmp
), &list
->extras
);
244 if ((tmp
= zend_hash_str_find_ind(ht
, ZEND_STRL("flags")))) {
245 list
->flags
= zval_get_long(tmp
);
247 if ((tmp
= zend_hash_str_find_ind(ht
, ZEND_STRL("expires")))) {
248 if (Z_TYPE_P(tmp
) == IS_LONG
) {
249 list
->expires
= Z_LVAL_P(tmp
);
252 zend_string
*lstr
= zval_get_string(tmp
);
254 if (IS_LONG
== is_numeric_string(lstr
->val
, lstr
->len
, &lval
, NULL
, 0)) {
255 list
->expires
= lval
;
257 list
->expires
= php_parse_date(lstr
->val
, NULL
);
260 zend_string_release(lstr
);
263 if ((tmp
= zend_hash_str_find_ind(ht
, ZEND_STRL("max-age")))) {
264 if (Z_TYPE_P(tmp
) == IS_LONG
) {
265 list
->max_age
= Z_LVAL_P(tmp
);
268 zend_string
*lstr
= zval_get_string(tmp
);
270 if (IS_LONG
== is_numeric_string(lstr
->val
, lstr
->len
, &lval
, NULL
, 0)) {
271 list
->max_age
= lval
;
274 zend_string_release(lstr
);
277 if ((tmp
= zend_hash_str_find_ind(ht
, ZEND_STRL("path")))) {
278 zend_string
*str
= zval_get_string(tmp
);
280 list
->path
= estrndup(str
->val
, str
->len
);
281 zend_string_release(str
);
283 if ((tmp
= zend_hash_str_find_ind(ht
, ZEND_STRL("domain")))) {
284 zend_string
*str
= zval_get_string(tmp
);
286 list
->domain
= estrndup(str
->val
, str
->len
);
287 zend_string_release(str
);
293 static inline void append_encoded(php_http_buffer_t
*buf
, const char *key
, size_t key_len
, const char *val
, size_t val_len
)
295 zend_string
*enc_str
[2];
297 enc_str
[0] = php_raw_url_encode(key
, key_len
);
298 enc_str
[1] = php_raw_url_encode(val
, val_len
);
300 php_http_buffer_append(buf
, enc_str
[0]->val
, enc_str
[0]->len
);
301 php_http_buffer_appends(buf
, "=");
302 php_http_buffer_append(buf
, enc_str
[1]->val
, enc_str
[1]->len
);
303 php_http_buffer_appends(buf
, "; ");
305 zend_string_release(enc_str
[0]);
306 zend_string_release(enc_str
[1]);
309 void php_http_cookie_list_to_string(php_http_cookie_list_t
*list
, char **str
, size_t *len
)
311 php_http_buffer_t buf
;
315 php_http_buffer_init(&buf
);
317 ZEND_HASH_FOREACH_KEY_VAL(&list
->cookies
, key
.h
, key
.key
, val
)
319 zend_string
*str
= zval_get_string(val
);
320 php_http_arrkey_t arrkey
= {0};
322 php_http_arrkey_stringify(&arrkey
, &key
);
323 append_encoded(&buf
, arrkey
.key
->val
, arrkey
.key
->len
, str
->val
, str
->len
);
324 php_http_arrkey_dtor(&arrkey
);
325 zend_string_release(str
);
327 ZEND_HASH_FOREACH_END();
329 if (list
->domain
&& *list
->domain
) {
330 php_http_buffer_appendf(&buf
, "domain=%s; ", list
->domain
);
332 if (list
->path
&& *list
->path
) {
333 php_http_buffer_appendf(&buf
, "path=%s; ", list
->path
);
335 if (list
->expires
>= 0) {
336 zend_string
*date
= php_format_date(ZEND_STRL(PHP_HTTP_DATE_FORMAT
), list
->expires
, 0);
337 php_http_buffer_appendf(&buf
, "expires=%s; ", date
->val
);
338 zend_string_release(date
);
340 if (list
->max_age
>= 0) {
341 php_http_buffer_appendf(&buf
, "max-age=%ld; ", list
->max_age
);
344 ZEND_HASH_FOREACH_KEY_VAL(&list
->extras
, key
.h
, key
.key
, val
)
346 zend_string
*str
= zval_get_string(val
);
347 php_http_arrkey_t arrkey
;
349 php_http_arrkey_stringify(&arrkey
, &key
);
350 append_encoded(&buf
, arrkey
.key
->val
, arrkey
.key
->len
, str
->val
, str
->len
);
351 php_http_arrkey_dtor(&arrkey
);
352 zend_string_release(str
);
354 ZEND_HASH_FOREACH_END();
356 if (list
->flags
& PHP_HTTP_COOKIE_SECURE
) {
357 php_http_buffer_appends(&buf
, "secure; ");
359 if (list
->flags
& PHP_HTTP_COOKIE_HTTPONLY
) {
360 php_http_buffer_appends(&buf
, "httpOnly; ");
363 php_http_buffer_fix(&buf
);
369 static zend_class_entry
*php_http_cookie_class_entry
;
370 zend_class_entry
*php_http_cookie_get_class_entry(void)
372 return php_http_cookie_class_entry
;
375 static zend_object_handlers php_http_cookie_object_handlers
;
377 zend_object
*php_http_cookie_object_new(zend_class_entry
*ce
)
379 return &php_http_cookie_object_new_ex(ce
, NULL
)->zo
;
382 php_http_cookie_object_t
*php_http_cookie_object_new_ex(zend_class_entry
*ce
, php_http_cookie_list_t
*list
)
384 php_http_cookie_object_t
*o
;
387 ce
= php_http_cookie_class_entry
;
390 o
= ecalloc(1, sizeof(*o
) + zend_object_properties_size(ce
));
391 zend_object_std_init(&o
->zo
, ce
);
392 object_properties_init(&o
->zo
, ce
);
393 o
->zo
.handlers
= &php_http_cookie_object_handlers
;
402 #define PHP_HTTP_COOKIE_OBJECT_INIT(obj) \
405 obj->list = php_http_cookie_list_init(NULL); \
409 zend_object
*php_http_cookie_object_clone(zval
*obj
)
411 php_http_cookie_object_t
*new_obj
, *old_obj
= PHP_HTTP_OBJ(NULL
, obj
);
413 PHP_HTTP_COOKIE_OBJECT_INIT(old_obj
);
415 new_obj
= php_http_cookie_object_new_ex(old_obj
->zo
.ce
, php_http_cookie_list_copy(old_obj
->list
, NULL
));
416 zend_objects_clone_members(&new_obj
->zo
, &old_obj
->zo
);
421 void php_http_cookie_object_free(zend_object
*object
)
423 php_http_cookie_object_t
*obj
= PHP_HTTP_OBJ(object
, NULL
);
425 php_http_cookie_list_free(&obj
->list
);
426 zend_object_std_dtor(object
);
429 ZEND_BEGIN_ARG_INFO_EX(ai_HttpCookie___construct
, 0, 0, 0)
430 ZEND_ARG_INFO(0, cookie_string
)
431 ZEND_ARG_INFO(0, parser_flags
)
432 ZEND_ARG_INFO(0, allowed_extras
)
434 static PHP_METHOD(HttpCookie
, __construct
)
436 php_http_cookie_object_t
*obj
;
437 zval
*zcookie
= NULL
;
440 HashTable
*allowed_extras
= NULL
;
441 zend_error_handling zeh
;
443 php_http_expect(SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS(), "|z!lH/", &zcookie
, &flags
, &allowed_extras
), invalid_arg
, return);
445 obj
= PHP_HTTP_OBJ(NULL
, getThis());
447 zend_replace_error_handling(EH_THROW
, php_http_get_exception_runtime_class_entry(), &zeh
);
450 if (allowed_extras
&& zend_hash_num_elements(allowed_extras
)) {
451 char **ae_ptr
= safe_emalloc(zend_hash_num_elements(allowed_extras
) + 1, sizeof(char *), 0);
455 ZEND_HASH_FOREACH_VAL(allowed_extras
, val
)
457 zend_string
*str
= zval_get_string(val
);
459 *ae_ptr
++ = estrndup(str
->val
, str
->len
);
460 zend_string_release(str
);
462 ZEND_HASH_FOREACH_END();
466 switch (Z_TYPE_P(zcookie
)) {
468 if (instanceof_function(Z_OBJCE_P(zcookie
), php_http_cookie_class_entry
)) {
469 php_http_cookie_object_t
*zco
= PHP_HTTP_OBJ(NULL
, zcookie
);
472 obj
->list
= php_http_cookie_list_copy(zco
->list
, NULL
);
478 obj
->list
= php_http_cookie_list_from_struct(obj
->list
, zcookie
);
481 zend_string
*str
= zval_get_string(zcookie
);
483 obj
->list
= php_http_cookie_list_parse(obj
->list
, str
->val
, str
->len
, flags
, ae
);
484 zend_string_release(str
);
492 for (ae_ptr
= ae
; *ae_ptr
; ++ae_ptr
) {
498 zend_restore_error_handling(&zeh
);
500 PHP_HTTP_COOKIE_OBJECT_INIT(obj
);
503 ZEND_BEGIN_ARG_INFO_EX(ai_HttpCookie_getCookies
, 0, 0, 0)
504 ZEND_END_ARG_INFO();;
505 static PHP_METHOD(HttpCookie
, getCookies
)
507 php_http_cookie_object_t
*obj
;
509 if (SUCCESS
!= zend_parse_parameters_none()) {
513 obj
= PHP_HTTP_OBJ(NULL
, getThis());
515 PHP_HTTP_COOKIE_OBJECT_INIT(obj
);
517 array_init_size(return_value
, zend_hash_num_elements(&obj
->list
->cookies
));
518 array_copy(&obj
->list
->cookies
, Z_ARRVAL_P(return_value
));
521 ZEND_BEGIN_ARG_INFO_EX(ai_HttpCookie_setCookies
, 0, 0, 0)
522 ZEND_ARG_INFO(0, cookies
)
524 static PHP_METHOD(HttpCookie
, setCookies
)
526 HashTable
*cookies
= NULL
;
527 php_http_cookie_object_t
*obj
;
529 php_http_expect(SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS(), "|H/", &cookies
), invalid_arg
, return);
531 obj
= PHP_HTTP_OBJ(NULL
, getThis());
533 PHP_HTTP_COOKIE_OBJECT_INIT(obj
);
535 zend_hash_clean(&obj
->list
->cookies
);
537 array_copy_strings(cookies
, &obj
->list
->cookies
);
540 RETURN_ZVAL(getThis(), 1, 0);
543 ZEND_BEGIN_ARG_INFO_EX(ai_HttpCookie_addCookies
, 0, 0, 1)
544 ZEND_ARG_INFO(0, cookies
)
546 static PHP_METHOD(HttpCookie
, addCookies
)
548 HashTable
*cookies
= NULL
;
549 php_http_cookie_object_t
*obj
;
551 php_http_expect(SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS(), "H/", &cookies
), invalid_arg
, return);
553 obj
= PHP_HTTP_OBJ(NULL
, getThis());
555 PHP_HTTP_COOKIE_OBJECT_INIT(obj
);
557 array_join(cookies
, &obj
->list
->cookies
, 1, ARRAY_JOIN_STRONLY
|ARRAY_JOIN_STRINGIFY
);
559 RETVAL_ZVAL(getThis(), 1, 0);
562 ZEND_BEGIN_ARG_INFO_EX(ai_HttpCookie_getExtras
, 0, 0, 0)
564 static PHP_METHOD(HttpCookie
, getExtras
)
566 php_http_cookie_object_t
*obj
;
568 if (SUCCESS
!= zend_parse_parameters_none()) {
572 obj
= PHP_HTTP_OBJ(NULL
, getThis());
574 PHP_HTTP_COOKIE_OBJECT_INIT(obj
);
576 array_init_size(return_value
, zend_hash_num_elements(&obj
->list
->extras
));
577 array_copy(&obj
->list
->extras
, Z_ARRVAL_P(return_value
));
580 ZEND_BEGIN_ARG_INFO_EX(ai_HttpCookie_setExtras
, 0, 0, 0)
581 ZEND_ARG_INFO(0, extras
)
583 static PHP_METHOD(HttpCookie
, setExtras
)
585 HashTable
*extras
= NULL
;
586 php_http_cookie_object_t
*obj
;
588 php_http_expect(SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS(), "|H/", &extras
), invalid_arg
, return);
590 obj
= PHP_HTTP_OBJ(NULL
, getThis());
592 PHP_HTTP_COOKIE_OBJECT_INIT(obj
);
594 zend_hash_clean(&obj
->list
->extras
);
596 array_copy_strings(extras
, &obj
->list
->extras
);
599 RETVAL_ZVAL(getThis(), 1, 0);
602 ZEND_BEGIN_ARG_INFO_EX(ai_HttpCookie_addExtras
, 0, 0, 1)
603 ZEND_ARG_INFO(0, extras
)
605 static PHP_METHOD(HttpCookie
, addExtras
)
607 HashTable
*extras
= NULL
;
608 php_http_cookie_object_t
*obj
;
610 php_http_expect(SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS(), "H/", &extras
), invalid_arg
, return);
612 obj
= PHP_HTTP_OBJ(NULL
, getThis());
614 PHP_HTTP_COOKIE_OBJECT_INIT(obj
);
616 array_join(extras
, &obj
->list
->extras
, 1, ARRAY_JOIN_STRONLY
|ARRAY_JOIN_STRINGIFY
);
618 RETVAL_ZVAL(getThis(), 1, 0);
621 ZEND_BEGIN_ARG_INFO_EX(ai_HttpCookie_getCookie
, 0, 0, 1)
622 ZEND_ARG_INFO(0, name
)
624 static PHP_METHOD(HttpCookie
, getCookie
)
629 php_http_cookie_object_t
*obj
;
631 if (SUCCESS
!= zend_parse_parameters(ZEND_NUM_ARGS(), "s", &name_str
, &name_len
)) {
635 obj
= PHP_HTTP_OBJ(NULL
, getThis());
637 PHP_HTTP_COOKIE_OBJECT_INIT(obj
);
639 if (php_http_cookie_list_get_cookie(obj
->list
, name_str
, name_len
, &zvalue
)) {
640 RETURN_ZVAL(&zvalue
, 1, 0);
644 ZEND_BEGIN_ARG_INFO_EX(ai_HttpCookie_setCookie
, 0, 0, 1)
645 ZEND_ARG_INFO(0, cookie_name
)
646 ZEND_ARG_INFO(0, cookie_value
)
648 static PHP_METHOD(HttpCookie
, setCookie
)
650 char *name_str
, *value_str
= NULL
;
651 size_t name_len
, value_len
= 0;
652 php_http_cookie_object_t
*obj
;
654 php_http_expect(SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS(), "s|s!", &name_str
, &name_len
, &value_str
, &value_len
), invalid_arg
, return);
656 obj
= PHP_HTTP_OBJ(NULL
, getThis());
658 PHP_HTTP_COOKIE_OBJECT_INIT(obj
);
661 php_http_cookie_list_del_cookie(obj
->list
, name_str
, name_len
);
663 php_http_cookie_list_add_cookie(obj
->list
, name_str
, name_len
, value_str
, value_len
);
666 RETVAL_ZVAL(getThis(), 1, 0);
669 ZEND_BEGIN_ARG_INFO_EX(ai_HttpCookie_addCookie
, 0, 0, 2)
670 ZEND_ARG_INFO(0, cookie_name
)
671 ZEND_ARG_INFO(0, cookie_value
)
673 static PHP_METHOD(HttpCookie
, addCookie
)
675 char *name_str
, *value_str
;
676 size_t name_len
, value_len
;
677 php_http_cookie_object_t
*obj
;
679 php_http_expect(SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS(), "ss", &name_str
, &name_len
, &value_str
, &value_len
), invalid_arg
, return);
681 obj
= PHP_HTTP_OBJ(NULL
, getThis());
683 PHP_HTTP_COOKIE_OBJECT_INIT(obj
);
685 php_http_cookie_list_add_cookie(obj
->list
, name_str
, name_len
, value_str
, value_len
);
687 RETVAL_ZVAL(getThis(), 1, 0);
690 ZEND_BEGIN_ARG_INFO_EX(ai_HttpCookie_getExtra
, 0, 0, 1)
691 ZEND_ARG_INFO(0, name
)
693 static PHP_METHOD(HttpCookie
, getExtra
)
698 php_http_cookie_object_t
*obj
;
700 if (SUCCESS
!= zend_parse_parameters(ZEND_NUM_ARGS(), "s", &name_str
, &name_len
)) {
704 obj
= PHP_HTTP_OBJ(NULL
, getThis());
706 PHP_HTTP_COOKIE_OBJECT_INIT(obj
);
708 if (php_http_cookie_list_get_extra(obj
->list
, name_str
, name_len
, &zvalue
)) {
709 RETURN_ZVAL(&zvalue
, 1, 0);
713 ZEND_BEGIN_ARG_INFO_EX(ai_HttpCookie_setExtra
, 0, 0, 1)
714 ZEND_ARG_INFO(0, extra_name
)
715 ZEND_ARG_INFO(0, extra_value
)
717 static PHP_METHOD(HttpCookie
, setExtra
)
719 char *name_str
, *value_str
= NULL
;
720 size_t name_len
, value_len
= 0;
721 php_http_cookie_object_t
*obj
;
723 php_http_expect(SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS(), "s|s!", &name_str
, &name_len
, &value_str
, &value_len
), invalid_arg
, return);
725 obj
= PHP_HTTP_OBJ(NULL
, getThis());
727 PHP_HTTP_COOKIE_OBJECT_INIT(obj
);
730 php_http_cookie_list_del_extra(obj
->list
, name_str
, name_len
);
732 php_http_cookie_list_add_extra(obj
->list
, name_str
, name_len
, value_str
, value_len
);
735 RETVAL_ZVAL(getThis(), 1, 0);
738 ZEND_BEGIN_ARG_INFO_EX(ai_HttpCookie_addExtra
, 0, 0, 2)
739 ZEND_ARG_INFO(0, extra_name
)
740 ZEND_ARG_INFO(0, extra_value
)
742 static PHP_METHOD(HttpCookie
, addExtra
)
744 char *name_str
, *value_str
;
745 size_t name_len
, value_len
;
746 php_http_cookie_object_t
*obj
;
748 php_http_expect(SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS(), "ss", &name_str
, &name_len
, &value_str
, &value_len
), invalid_arg
, return);
750 obj
= PHP_HTTP_OBJ(NULL
, getThis());
752 PHP_HTTP_COOKIE_OBJECT_INIT(obj
);
754 php_http_cookie_list_add_extra(obj
->list
, name_str
, name_len
, value_str
, value_len
);
756 RETVAL_ZVAL(getThis(), 1, 0);
759 ZEND_BEGIN_ARG_INFO_EX(ai_HttpCookie_getDomain
, 0, 0, 0)
760 ZEND_END_ARG_INFO();;
761 static PHP_METHOD(HttpCookie
, getDomain
)
763 php_http_cookie_object_t
*obj
;
765 if (SUCCESS
!= zend_parse_parameters_none()) {
769 obj
= PHP_HTTP_OBJ(NULL
, getThis());
771 PHP_HTTP_COOKIE_OBJECT_INIT(obj
);
773 if (obj
->list
->domain
) {
774 RETURN_STRING(obj
->list
->domain
);
778 ZEND_BEGIN_ARG_INFO_EX(ai_HttpCookie_setDomain
, 0, 0, 0)
779 ZEND_ARG_INFO(0, value
)
781 static PHP_METHOD(HttpCookie
, setDomain
)
783 char *domain_str
= NULL
;
784 size_t domain_len
= 0;
785 php_http_cookie_object_t
*obj
;
787 php_http_expect(SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS(), "|s!", &domain_str
, &domain_len
), invalid_arg
, return);
789 obj
= PHP_HTTP_OBJ(NULL
, getThis());
791 PHP_HTTP_COOKIE_OBJECT_INIT(obj
);
793 PTR_SET(obj
->list
->domain
, domain_str
? estrndup(domain_str
, domain_len
) : NULL
);
795 RETVAL_ZVAL(getThis(), 1, 0);
798 ZEND_BEGIN_ARG_INFO_EX(ai_HttpCookie_getPath
, 0, 0, 0)
799 ZEND_END_ARG_INFO();;
800 static PHP_METHOD(HttpCookie
, getPath
)
802 php_http_cookie_object_t
*obj
;
804 if (SUCCESS
!= zend_parse_parameters_none()) {
808 obj
= PHP_HTTP_OBJ(NULL
, getThis());
810 PHP_HTTP_COOKIE_OBJECT_INIT(obj
);
812 if (obj
->list
->path
) {
813 RETURN_STRING(obj
->list
->path
);
817 ZEND_BEGIN_ARG_INFO_EX(ai_HttpCookie_setPath
, 0, 0, 0)
818 ZEND_ARG_INFO(0, value
)
820 static PHP_METHOD(HttpCookie
, setPath
)
822 char *path_str
= NULL
;
824 php_http_cookie_object_t
*obj
;
826 php_http_expect(SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS(), "|s!", &path_str
, &path_len
), invalid_arg
, return);
828 obj
= PHP_HTTP_OBJ(NULL
, getThis());
830 PHP_HTTP_COOKIE_OBJECT_INIT(obj
);
832 PTR_SET(obj
->list
->path
, path_str
? estrndup(path_str
, path_len
) : NULL
);
834 RETVAL_ZVAL(getThis(), 1, 0);
837 ZEND_BEGIN_ARG_INFO_EX(ai_HttpCookie_getExpires
, 0, 0, 0)
838 ZEND_END_ARG_INFO();;
839 static PHP_METHOD(HttpCookie
, getExpires
)
841 php_http_cookie_object_t
*obj
;
843 if (SUCCESS
!= zend_parse_parameters_none()) {
847 obj
= PHP_HTTP_OBJ(NULL
, getThis());
849 PHP_HTTP_COOKIE_OBJECT_INIT(obj
);
851 RETURN_LONG(obj
->list
->expires
);
854 ZEND_BEGIN_ARG_INFO_EX(ai_HttpCookie_setExpires
, 0, 0, 0)
855 ZEND_ARG_INFO(0, value
)
857 static PHP_METHOD(HttpCookie
, setExpires
)
860 php_http_cookie_object_t
*obj
;
862 php_http_expect(SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS(), "|l", &ts
), invalid_arg
, return);
864 obj
= PHP_HTTP_OBJ(NULL
, getThis());
866 PHP_HTTP_COOKIE_OBJECT_INIT(obj
);
868 obj
->list
->expires
= ts
;
870 RETVAL_ZVAL(getThis(), 1, 0);
873 ZEND_BEGIN_ARG_INFO_EX(ai_HttpCookie_getMaxAge
, 0, 0, 0)
874 ZEND_END_ARG_INFO();;
875 static PHP_METHOD(HttpCookie
, getMaxAge
)
877 php_http_cookie_object_t
*obj
;
879 if (SUCCESS
!= zend_parse_parameters_none()) {
883 obj
= PHP_HTTP_OBJ(NULL
, getThis());
885 PHP_HTTP_COOKIE_OBJECT_INIT(obj
);
887 RETURN_LONG(obj
->list
->max_age
);
890 ZEND_BEGIN_ARG_INFO_EX(ai_HttpCookie_setMaxAge
, 0, 0, 0)
891 ZEND_ARG_INFO(0, value
)
893 static PHP_METHOD(HttpCookie
, setMaxAge
)
896 php_http_cookie_object_t
*obj
;
898 php_http_expect(SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS(), "|l", &ma
), invalid_arg
, return);
900 obj
= PHP_HTTP_OBJ(NULL
, getThis());
902 PHP_HTTP_COOKIE_OBJECT_INIT(obj
);
904 obj
->list
->max_age
= ma
;
906 RETVAL_ZVAL(getThis(), 1, 0);
909 ZEND_BEGIN_ARG_INFO_EX(ai_HttpCookie_getFlags
, 0, 0, 0)
911 static PHP_METHOD(HttpCookie
, getFlags
)
913 php_http_cookie_object_t
*obj
;
915 if (SUCCESS
!= zend_parse_parameters_none()) {
919 obj
= PHP_HTTP_OBJ(NULL
, getThis());
921 PHP_HTTP_COOKIE_OBJECT_INIT(obj
);
923 RETURN_LONG(obj
->list
->flags
);
926 ZEND_BEGIN_ARG_INFO_EX(ai_HttpCookie_setFlags
, 0, 0, 0)
927 ZEND_ARG_INFO(0, value
)
929 static PHP_METHOD(HttpCookie
, setFlags
)
932 php_http_cookie_object_t
*obj
;
934 php_http_expect(SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS(), "|l", &flags
), invalid_arg
, return);
936 obj
= PHP_HTTP_OBJ(NULL
, getThis());
938 PHP_HTTP_COOKIE_OBJECT_INIT(obj
);
940 obj
->list
->flags
= flags
;
942 RETVAL_ZVAL(getThis(), 1, 0);
945 ZEND_BEGIN_ARG_INFO_EX(ai_HttpCookie_toString
, 0, 0, 0)
946 ZEND_END_ARG_INFO();;
947 static PHP_METHOD(HttpCookie
, toString
)
949 php_http_cookie_object_t
*obj
;
953 if (SUCCESS
!= zend_parse_parameters_none()) {
954 RETURN_EMPTY_STRING();
957 obj
= PHP_HTTP_OBJ(NULL
, getThis());
959 PHP_HTTP_COOKIE_OBJECT_INIT(obj
);
961 php_http_cookie_list_to_string(obj
->list
, &str
, &len
);
963 RETURN_NEW_STR(php_http_cs2zs(str
, len
));
966 ZEND_BEGIN_ARG_INFO_EX(ai_HttpCookie_toArray
, 0, 0, 0)
967 ZEND_END_ARG_INFO();;
968 static PHP_METHOD(HttpCookie
, toArray
)
970 php_http_cookie_object_t
*obj
;
972 if (SUCCESS
!= zend_parse_parameters_none()) {
976 obj
= PHP_HTTP_OBJ(NULL
, getThis());
978 PHP_HTTP_COOKIE_OBJECT_INIT(obj
);
980 array_init_size(return_value
, 8);
981 php_http_cookie_list_to_struct(obj
->list
, return_value
);
984 static zend_function_entry php_http_cookie_methods
[] = {
985 PHP_ME(HttpCookie
, __construct
, ai_HttpCookie___construct
, ZEND_ACC_PUBLIC
)
986 PHP_ME(HttpCookie
, getCookies
, ai_HttpCookie_getCookies
, ZEND_ACC_PUBLIC
)
987 PHP_ME(HttpCookie
, setCookies
, ai_HttpCookie_setCookies
, ZEND_ACC_PUBLIC
)
988 PHP_ME(HttpCookie
, addCookies
, ai_HttpCookie_addCookies
, ZEND_ACC_PUBLIC
)
989 PHP_ME(HttpCookie
, getCookie
, ai_HttpCookie_getCookie
, ZEND_ACC_PUBLIC
)
990 PHP_ME(HttpCookie
, setCookie
, ai_HttpCookie_setCookie
, ZEND_ACC_PUBLIC
)
991 PHP_ME(HttpCookie
, addCookie
, ai_HttpCookie_addCookie
, ZEND_ACC_PUBLIC
)
993 PHP_ME(HttpCookie
, getExtras
, ai_HttpCookie_getExtras
, ZEND_ACC_PUBLIC
)
994 PHP_ME(HttpCookie
, setExtras
, ai_HttpCookie_setExtras
, ZEND_ACC_PUBLIC
)
995 PHP_ME(HttpCookie
, addExtras
, ai_HttpCookie_addExtras
, ZEND_ACC_PUBLIC
)
996 PHP_ME(HttpCookie
, getExtra
, ai_HttpCookie_getExtra
, ZEND_ACC_PUBLIC
)
997 PHP_ME(HttpCookie
, setExtra
, ai_HttpCookie_setExtra
, ZEND_ACC_PUBLIC
)
998 PHP_ME(HttpCookie
, addExtra
, ai_HttpCookie_addExtra
, ZEND_ACC_PUBLIC
)
1000 PHP_ME(HttpCookie
, getDomain
, ai_HttpCookie_getDomain
, ZEND_ACC_PUBLIC
)
1001 PHP_ME(HttpCookie
, setDomain
, ai_HttpCookie_setDomain
, ZEND_ACC_PUBLIC
)
1002 PHP_ME(HttpCookie
, getPath
, ai_HttpCookie_getPath
, ZEND_ACC_PUBLIC
)
1003 PHP_ME(HttpCookie
, setPath
, ai_HttpCookie_setPath
, ZEND_ACC_PUBLIC
)
1004 PHP_ME(HttpCookie
, getExpires
, ai_HttpCookie_getExpires
, ZEND_ACC_PUBLIC
)
1005 PHP_ME(HttpCookie
, setExpires
, ai_HttpCookie_setExpires
, ZEND_ACC_PUBLIC
)
1006 PHP_ME(HttpCookie
, getMaxAge
, ai_HttpCookie_getMaxAge
, ZEND_ACC_PUBLIC
)
1007 PHP_ME(HttpCookie
, setMaxAge
, ai_HttpCookie_setMaxAge
, ZEND_ACC_PUBLIC
)
1008 PHP_ME(HttpCookie
, getFlags
, ai_HttpCookie_getFlags
, ZEND_ACC_PUBLIC
)
1009 PHP_ME(HttpCookie
, setFlags
, ai_HttpCookie_setFlags
, ZEND_ACC_PUBLIC
)
1011 PHP_ME(HttpCookie
, toArray
, ai_HttpCookie_toArray
, ZEND_ACC_PUBLIC
)
1012 PHP_ME(HttpCookie
, toString
, ai_HttpCookie_toString
, ZEND_ACC_PUBLIC
)
1013 ZEND_MALIAS(HttpCookie
, __toString
, toString
, ai_HttpCookie_toString
, ZEND_ACC_PUBLIC
)
1015 EMPTY_FUNCTION_ENTRY
1018 PHP_MINIT_FUNCTION(http_cookie
)
1020 zend_class_entry ce
= {0};
1022 INIT_NS_CLASS_ENTRY(ce
, "http", "Cookie", php_http_cookie_methods
);
1023 php_http_cookie_class_entry
= zend_register_internal_class(&ce
);
1024 php_http_cookie_class_entry
->create_object
= php_http_cookie_object_new
;
1025 memcpy(&php_http_cookie_object_handlers
, zend_get_std_object_handlers(), sizeof(zend_object_handlers
));
1026 php_http_cookie_object_handlers
.offset
= XtOffsetOf(php_http_cookie_object_t
, zo
);
1027 php_http_cookie_object_handlers
.clone_obj
= php_http_cookie_object_clone
;
1028 php_http_cookie_object_handlers
.free_obj
= php_http_cookie_object_free
;
1030 zend_declare_class_constant_long(php_http_cookie_class_entry
, ZEND_STRL("PARSE_RAW"), PHP_HTTP_COOKIE_PARSE_RAW
);
1031 zend_declare_class_constant_long(php_http_cookie_class_entry
, ZEND_STRL("SECURE"), PHP_HTTP_COOKIE_SECURE
);
1032 zend_declare_class_constant_long(php_http_cookie_class_entry
, ZEND_STRL("HTTPONLY"), PHP_HTTP_COOKIE_HTTPONLY
);
1044 * vim600: noet sw=4 ts=4 fdm=marker
1045 * vim<600: noet sw=4 ts=4