X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=php_http_cookie.c;h=6c2a3d40d8aed8a78fdc556365c35a54a779e85e;hb=2aa318b3eb1d885b29bf172290f35a3096e339a7;hp=c23b608f8455c14f4acf7a6801f697b971d5dbc2;hpb=b233c50a85448c251d23a1bdce3e9003c4ee03b8;p=m6w6%2Fext-http diff --git a/php_http_cookie.c b/php_http_cookie.c index c23b608..6c2a3d4 100644 --- a/php_http_cookie.c +++ b/php_http_cookie.c @@ -14,6 +14,8 @@ #include "php_http.h" +#include + PHP_HTTP_API php_http_cookie_list_t *php_http_cookie_list_init(php_http_cookie_list_t *list TSRMLS_DC) { if (!list) { @@ -243,7 +245,7 @@ PHP_HTTP_API php_http_cookie_list_t *php_http_cookie_list_from_struct(php_http_c list->flags = (long) Z_DVAL_PP(tmp); break; case IS_STRING: - cpy = php_http_zsep(IS_LONG, *tmp); + cpy = php_http_ztyp(IS_LONG, *tmp); list->flags = Z_LVAL_P(cpy); zval_ptr_dtor(&cpy); break; @@ -260,7 +262,7 @@ PHP_HTTP_API php_http_cookie_list_t *php_http_cookie_list_from_struct(php_http_c list->expires = (long) Z_DVAL_PP(tmp); break; case IS_STRING: - cpy = php_http_zsep(IS_LONG, *tmp); + cpy = php_http_ztyp(IS_LONG, *tmp); if (Z_LVAL_P(cpy)) { list->expires = Z_LVAL_P(cpy); } else { @@ -287,7 +289,7 @@ PHP_HTTP_API php_http_cookie_list_t *php_http_cookie_list_from_struct(php_http_c -static inline void append_encoded(php_http_buffer *buf, const char *key, size_t key_len, const char *val, size_t val_len) +static inline void append_encoded(php_http_buffer_t *buf, const char *key, size_t key_len, const char *val, size_t val_len) { char *enc_str[2]; int enc_len[2]; @@ -308,7 +310,7 @@ static inline void append_encoded(php_http_buffer *buf, const char *key, size_t PHP_HTTP_API void php_http_cookie_list_to_string(php_http_cookie_list_t *list, char **str, size_t *len TSRMLS_DC) { - php_http_buffer buf; + php_http_buffer_t buf; zval **val; php_http_array_hashkey_t key = php_http_array_hashkey_init(0); HashPosition pos; @@ -317,7 +319,7 @@ PHP_HTTP_API void php_http_cookie_list_to_string(php_http_cookie_list_t *list, c FOREACH_HASH_KEYVAL(pos, &list->cookies, key, val) { if (key.type == HASH_KEY_IS_STRING && key.len) { - zval *tmp = php_http_zsep(IS_STRING, *val); + zval *tmp = php_http_ztyp(IS_STRING, *val); append_encoded(&buf, key.str, key.len-1, Z_STRVAL_P(tmp), Z_STRLEN_P(tmp)); zval_ptr_dtor(&tmp); } @@ -337,8 +339,9 @@ PHP_HTTP_API void php_http_cookie_list_to_string(php_http_cookie_list_t *list, c FOREACH_HASH_KEYVAL(pos, &list->extras, key, val) { if (key.type == HASH_KEY_IS_STRING && key.len) { - zval *tmp = php_http_zsep(IS_STRING, *val); + zval *tmp = php_http_ztyp(IS_STRING, *val); append_encoded(&buf, key.str, key.len-1, Z_STRVAL_P(tmp), Z_STRLEN_P(tmp)); + zval_ptr_dtor(&tmp); } } @@ -505,14 +508,14 @@ void php_http_cookie_object_free(void *object TSRMLS_CC) PHP_METHOD(HttpCookie, __construct) { - with_error_handling(EH_THROW, PHP_HTTP_EX_CE(runtime)) { + with_error_handling(EH_THROW, php_http_exception_class_entry) { zval *zcookie = NULL; long flags = 0; HashTable *allowed_extras = NULL; if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|z!lH", &zcookie, &flags, &allowed_extras)) { if (zcookie) { - with_error_handling(EH_THROW, PHP_HTTP_EX_CE(cookie)) { + with_error_handling(EH_THROW, php_http_exception_class_entry) { char **ae = NULL; php_http_cookie_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC); @@ -523,7 +526,7 @@ PHP_METHOD(HttpCookie, __construct) ae = ae_ptr; FOREACH_HASH_VAL(pos, allowed_extras, val) { - zval *cpy = php_http_zsep(IS_STRING, *val); + zval *cpy = php_http_ztyp(IS_STRING, *val); *ae_ptr++ = estrndup(Z_STRVAL_P(cpy), Z_STRLEN_P(cpy)); zval_ptr_dtor(&cpy); @@ -537,7 +540,7 @@ PHP_METHOD(HttpCookie, __construct) obj->list = php_http_cookie_list_from_struct(obj->list, zcookie TSRMLS_CC); break; default: { - zval *cpy = php_http_zsep(IS_STRING, zcookie); + zval *cpy = php_http_ztyp(IS_STRING, zcookie); obj->list = php_http_cookie_list_parse(obj->list, Z_STRVAL_P(cpy), flags, ae TSRMLS_CC); zval_ptr_dtor(&cpy); @@ -555,6 +558,9 @@ PHP_METHOD(HttpCookie, getCookies) if (SUCCESS == zend_parse_parameters_none()) { php_http_cookie_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC); + if (!obj->list) { + obj->list = php_http_cookie_list_init(NULL TSRMLS_CC); + } array_init(return_value); array_copy(&obj->list->cookies, Z_ARRVAL_P(return_value)); return; @@ -569,13 +575,15 @@ PHP_METHOD(HttpCookie, setCookies) if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|H", &cookies)) { php_http_cookie_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC); + if (!obj->list) { + obj->list = php_http_cookie_list_init(NULL TSRMLS_CC); + } zend_hash_clean(&obj->list->cookies); if (cookies) { array_copy(cookies, &obj->list->cookies); } - RETURN_TRUE; } - RETURN_FALSE; + RETVAL_ZVAL(getThis(), 1, 0); } PHP_METHOD(HttpCookie, addCookies) @@ -585,10 +593,12 @@ PHP_METHOD(HttpCookie, addCookies) if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "H", &cookies)) { php_http_cookie_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC); + if (!obj->list) { + obj->list = php_http_cookie_list_init(NULL TSRMLS_CC); + } array_join(cookies, &obj->list->cookies, 1, ARRAY_JOIN_STRONLY); - RETURN_TRUE; } - RETURN_FALSE; + RETVAL_ZVAL(getThis(), 1, 0); } @@ -597,6 +607,9 @@ PHP_METHOD(HttpCookie, getExtras) if (SUCCESS == zend_parse_parameters_none()) { php_http_cookie_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC); + if (!obj->list) { + obj->list = php_http_cookie_list_init(NULL TSRMLS_CC); + } array_init(return_value); array_copy(&obj->list->extras, Z_ARRVAL_P(return_value)); return; @@ -611,13 +624,15 @@ PHP_METHOD(HttpCookie, setExtras) if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|H", &extras)) { php_http_cookie_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC); + if (!obj->list) { + obj->list = php_http_cookie_list_init(NULL TSRMLS_CC); + } zend_hash_clean(&obj->list->extras); if (extras) { array_copy(extras, &obj->list->extras); } - RETURN_TRUE; } - RETURN_FALSE; + RETVAL_ZVAL(getThis(), 1, 0); } PHP_METHOD(HttpCookie, addExtras) @@ -627,10 +642,12 @@ PHP_METHOD(HttpCookie, addExtras) if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "H", &extras)) { php_http_cookie_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC); + if (!obj->list) { + obj->list = php_http_cookie_list_init(NULL TSRMLS_CC); + } array_join(extras, &obj->list->extras, 1, ARRAY_JOIN_STRONLY); - RETURN_TRUE; } - RETURN_FALSE; + RETVAL_ZVAL(getThis(), 1, 0); } PHP_METHOD(HttpCookie, getCookie) @@ -642,6 +659,9 @@ PHP_METHOD(HttpCookie, getCookie) php_http_cookie_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC); zval **zvalue; + if (!obj->list) { + obj->list = php_http_cookie_list_init(NULL TSRMLS_CC); + } if (SUCCESS == zend_hash_find(&obj->list->cookies, name_str, name_len + 1, (void *) &zvalue)) { RETURN_ZVAL(*zvalue, 1, 0); } @@ -657,17 +677,20 @@ PHP_METHOD(HttpCookie, setCookie) if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|s!", &name_str, &name_len, &value_str, &value_len)) { php_http_cookie_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC); + if (!obj->list) { + obj->list = php_http_cookie_list_init(NULL TSRMLS_CC); + } if (!value_str) { - RETURN_SUCCESS(zend_hash_del(&obj->list->cookies, name_str, name_len + 1)); + zend_hash_del(&obj->list->cookies, name_str, name_len + 1); } else { zval *zvalue; MAKE_STD_ZVAL(zvalue); ZVAL_STRINGL(zvalue, value_str, value_len, 1); - RETURN_SUCCESS(zend_hash_update(&obj->list->cookies, name_str, name_len + 1, &zvalue, sizeof(zval *), NULL)); + zend_hash_update(&obj->list->cookies, name_str, name_len + 1, &zvalue, sizeof(zval *), NULL); } } - RETURN_FALSE; + RETVAL_ZVAL(getThis(), 1, 0); } PHP_METHOD(HttpCookie, addCookie) @@ -679,11 +702,14 @@ PHP_METHOD(HttpCookie, addCookie) php_http_cookie_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC); zval *zvalue; + if (!obj->list) { + obj->list = php_http_cookie_list_init(NULL TSRMLS_CC); + } MAKE_STD_ZVAL(zvalue); ZVAL_STRINGL(zvalue, value_str, value_len, 1); - RETURN_SUCCESS(zend_hash_add(&obj->list->cookies, name_str, name_len + 1, &zvalue, sizeof(zval *), NULL)); + zend_hash_add(&obj->list->cookies, name_str, name_len + 1, &zvalue, sizeof(zval *), NULL); } - RETURN_FALSE; + RETVAL_ZVAL(getThis(), 1, 0); } PHP_METHOD(HttpCookie, getExtra) @@ -695,6 +721,9 @@ PHP_METHOD(HttpCookie, getExtra) php_http_cookie_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC); zval **zvalue; + if (!obj->list) { + obj->list = php_http_cookie_list_init(NULL TSRMLS_CC); + } if (SUCCESS == zend_hash_find(&obj->list->extras, name_str, name_len + 1, (void *) &zvalue)) { RETURN_ZVAL(*zvalue, 1, 0); } @@ -710,17 +739,20 @@ PHP_METHOD(HttpCookie, setExtra) if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|s!", &name_str, &name_len, &value_str, &value_len)) { php_http_cookie_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC); + if (!obj->list) { + obj->list = php_http_cookie_list_init(NULL TSRMLS_CC); + } if (!value_str) { - RETURN_SUCCESS(zend_hash_del(&obj->list->extras, name_str, name_len + 1)); + zend_hash_del(&obj->list->extras, name_str, name_len + 1); } else { zval *zvalue; MAKE_STD_ZVAL(zvalue); ZVAL_STRINGL(zvalue, value_str, value_len, 1); - RETURN_SUCCESS(zend_hash_update(&obj->list->extras, name_str, name_len + 1, &zvalue, sizeof(zval *), NULL)); + zend_hash_update(&obj->list->extras, name_str, name_len + 1, &zvalue, sizeof(zval *), NULL); } } - RETURN_FALSE; + RETVAL_ZVAL(getThis(), 1, 0); } PHP_METHOD(HttpCookie, addExtra) @@ -732,11 +764,14 @@ PHP_METHOD(HttpCookie, addExtra) php_http_cookie_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC); zval *zvalue; + if (!obj->list) { + obj->list = php_http_cookie_list_init(NULL TSRMLS_CC); + } MAKE_STD_ZVAL(zvalue); ZVAL_STRINGL(zvalue, value_str, value_len, 1); - RETURN_SUCCESS(zend_hash_add(&obj->list->extras, name_str, name_len + 1, &zvalue, sizeof(zval *), NULL)); + zend_hash_add(&obj->list->extras, name_str, name_len + 1, &zvalue, sizeof(zval *), NULL); } - RETURN_FALSE; + RETVAL_ZVAL(getThis(), 1, 0); } PHP_METHOD(HttpCookie, getDomain) @@ -744,6 +779,9 @@ PHP_METHOD(HttpCookie, getDomain) if (SUCCESS == zend_parse_parameters_none()) { php_http_cookie_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC); + if (!obj->list) { + obj->list = php_http_cookie_list_init(NULL TSRMLS_CC); + } if (obj->list->domain) { RETURN_STRING(obj->list->domain, 1); } @@ -760,10 +798,12 @@ PHP_METHOD(HttpCookie, setDomain) if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s!", &domain_str, &domain_len)) { php_http_cookie_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC); + if (!obj->list) { + obj->list = php_http_cookie_list_init(NULL TSRMLS_CC); + } STR_SET(obj->list->domain, domain_str ? estrndup(domain_str, domain_len) : NULL); - RETURN_TRUE; } - RETURN_FALSE; + RETVAL_ZVAL(getThis(), 1, 0); } PHP_METHOD(HttpCookie, getPath) @@ -771,6 +811,9 @@ PHP_METHOD(HttpCookie, getPath) if (SUCCESS == zend_parse_parameters_none()) { php_http_cookie_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC); + if (!obj->list) { + obj->list = php_http_cookie_list_init(NULL TSRMLS_CC); + } if (obj->list->path) { RETURN_STRING(obj->list->path, 1); } @@ -787,10 +830,12 @@ PHP_METHOD(HttpCookie, setPath) if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s!", &path_str, &path_len)) { php_http_cookie_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC); + if (!obj->list) { + obj->list = php_http_cookie_list_init(NULL TSRMLS_CC); + } STR_SET(obj->list->path, path_str ? estrndup(path_str, path_len) : NULL); - RETURN_TRUE; } - RETURN_FALSE; + RETVAL_ZVAL(getThis(), 1, 0); } PHP_METHOD(HttpCookie, getExpires) @@ -798,6 +843,9 @@ PHP_METHOD(HttpCookie, getExpires) if (SUCCESS == zend_parse_parameters_none()) { php_http_cookie_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC); + if (!obj->list) { + obj->list = php_http_cookie_list_init(NULL TSRMLS_CC); + } RETURN_LONG(obj->list->expires); } RETURN_FALSE; @@ -810,10 +858,12 @@ PHP_METHOD(HttpCookie, setExpires) if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|l", &ts)) { php_http_cookie_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC); + if (!obj->list) { + obj->list = php_http_cookie_list_init(NULL TSRMLS_CC); + } obj->list->expires = ts; - RETURN_TRUE; } - RETURN_FALSE; + RETVAL_ZVAL(getThis(), 1, 0); } PHP_METHOD(HttpCookie, getFlags) @@ -821,6 +871,9 @@ PHP_METHOD(HttpCookie, getFlags) if (SUCCESS == zend_parse_parameters_none()) { php_http_cookie_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC); + if (!obj->list) { + obj->list = php_http_cookie_list_init(NULL TSRMLS_CC); + } RETURN_LONG(obj->list->flags); } RETURN_FALSE; @@ -833,10 +886,12 @@ PHP_METHOD(HttpCookie, setFlags) if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|l", &flags)) { php_http_cookie_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC); + if (!obj->list) { + obj->list = php_http_cookie_list_init(NULL TSRMLS_CC); + } obj->list->flags = flags; - RETURN_TRUE; } - RETURN_FALSE; + RETVAL_ZVAL(getThis(), 1, 0); } PHP_METHOD(HttpCookie, toString) @@ -846,6 +901,9 @@ PHP_METHOD(HttpCookie, toString) char *str; size_t len; + if (!obj->list) { + obj->list = php_http_cookie_list_init(NULL TSRMLS_CC); + } php_http_cookie_list_to_string(obj->list, &str, &len TSRMLS_CC); RETURN_STRINGL(str, len, 0); } @@ -857,6 +915,9 @@ PHP_METHOD(HttpCookie, toArray) if (SUCCESS == zend_parse_parameters_none()) { php_http_cookie_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC); + if (!obj->list) { + obj->list = php_http_cookie_list_init(NULL TSRMLS_CC); + } array_init(return_value); php_http_cookie_list_to_struct(obj->list, return_value TSRMLS_CC); } @@ -865,6 +926,7 @@ PHP_METHOD(HttpCookie, toArray) PHP_MINIT_FUNCTION(http_cookie) { PHP_HTTP_REGISTER_CLASS(http, Cookie, http_cookie, php_http_object_class_entry, 0); + zend_class_implements(php_http_cookie_class_entry TSRMLS_CC, 1, php_http_fluently_callable_class_entry); php_http_cookie_class_entry->create_object = php_http_cookie_object_new; memcpy(&php_http_cookie_object_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers)); php_http_cookie_object_handlers.clone_obj = php_http_cookie_object_clone;