Commit: ec2fff80e768dfb04aa393c06a2b1a42a9e871ff Author: Lars Strojny <lstro...@php.net> Sun, 6 Jan 2013 03:22:44 +0100 Parents: f3824ad16644c53645e7428d2e838278f5a0e1c4 Branches: PHP-5.5
Link: http://git.php.net/?p=php-src.git;a=commitdiff;h=ec2fff80e768dfb04aa393c06a2b1a42a9e871ff Log: Bug #23955: allow specifiy max age for setcookie() Bugs: https://bugs.php.net/23955 Changed paths: M NEWS M ext/session/session.c M ext/standard/head.c A ext/standard/tests/network/setcookie.phpt Diff: diff --git a/NEWS b/NEWS index 2d0b4c3..1ad954a 100644 --- a/NEWS +++ b/NEWS @@ -7,6 +7,7 @@ PHP NEWS . Fixed bug #63822 (Crash when using closures with ArrayAccess). (Nikita Popov) . Add Generator::throw() method. (Nikita Popov) + . Bug #23955: allow specifying Max-Age attribute in setcookie() (narfbg, Lars) - cURL: . Added new functions curl_escape, curl_multi_setopt, curl_multi_strerror diff --git a/ext/session/session.c b/ext/session/session.c index a3be9a7..54bc643 100644 --- a/ext/session/session.c +++ b/ext/session/session.c @@ -1154,6 +1154,7 @@ static int php_session_cache_limiter(TSRMLS_D) /* {{{ */ #define COOKIE_SET_COOKIE "Set-Cookie: " #define COOKIE_EXPIRES "; expires=" +#define COOKIE_MAX_AGE "; Max-Age=" #define COOKIE_PATH "; path=" #define COOKIE_DOMAIN "; domain=" #define COOKIE_SECURE "; secure" @@ -1201,6 +1202,9 @@ static void php_session_send_cookie(TSRMLS_D) /* {{{ */ smart_str_appends(&ncookie, COOKIE_EXPIRES); smart_str_appends(&ncookie, date_fmt); efree(date_fmt); + + smart_str_appends(&ncookie, COOKIE_MAX_AGE); + smart_str_append_long(&ncookie, PS(cookie_lifetime)); } } diff --git a/ext/standard/head.c b/ext/standard/head.c index 97f61f2..fa57817 100644 --- a/ext/standard/head.c +++ b/ext/standard/head.c @@ -40,11 +40,11 @@ PHP_FUNCTION(header) { zend_bool rep = 1; sapi_header_line ctr = {0}; - + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|bl", &ctr.line, &ctr.line_len, &rep, &ctr.response_code) == FAILURE) return; - + sapi_header_op(rep ? SAPI_HEADER_REPLACE:SAPI_HEADER_ADD, &ctr TSRMLS_CC); } /* }}} */ @@ -80,7 +80,7 @@ PHPAPI int php_setcookie(char *name, int name_len, char *value, int value_len, t char *dt; sapi_header_line ctr = {0}; int result; - + if (name && strpbrk(name, "=,; \t\r\n\013\014") != NULL) { /* man isspace for \013 and \014 */ zend_error( E_WARNING, "Cookie names cannot contain any of the following '=,; \\t\\r\\n\\013\\014'" ); return FAILURE; @@ -111,18 +111,19 @@ PHPAPI int php_setcookie(char *name, int name_len, char *value, int value_len, t cookie = emalloc(len + 100); if (value && value_len == 0) { - /* + /* * MSIE doesn't delete a cookie when you set it to a null value * so in order to force cookies to be deleted, even on MSIE, we * pick an expiry date in the past */ dt = php_format_date("D, d-M-Y H:i:s T", sizeof("D, d-M-Y H:i:s T")-1, 1, 0 TSRMLS_CC); - snprintf(cookie, len + 100, "Set-Cookie: %s=deleted; expires=%s", name, dt); + snprintf(cookie, len + 100, "Set-Cookie: %s=deleted; expires=%s; Max-Age=0", name, dt); efree(dt); } else { snprintf(cookie, len + 100, "Set-Cookie: %s=%s", name, value ? encoded_value : ""); if (expires > 0) { const char *p; + char tsdelta[13]; strlcat(cookie, "; expires=", len + 100); dt = php_format_date("D, d-M-Y H:i:s T", sizeof("D, d-M-Y H:i:s T")-1, expires, 0 TSRMLS_CC); /* check to make sure that the year does not exceed 4 digits in length */ @@ -136,6 +137,10 @@ PHPAPI int php_setcookie(char *name, int name_len, char *value, int value_len, t } strlcat(cookie, dt, len + 100); efree(dt); + + snprintf(tsdelta, sizeof(tsdelta), "%li", (long) difftime(expires, time(NULL))); + strlcat(cookie, "; Max-Age=", len + 100); + strlcat(cookie, tsdelta, len + 100); } } @@ -237,11 +242,11 @@ PHP_FUNCTION(headers_sent) ZVAL_LONG(arg2, line); case 1: zval_dtor(arg1); - if (file) { + if (file) { ZVAL_STRING(arg1, file, 1); } else { ZVAL_STRING(arg1, "", 1); - } + } break; } diff --git a/ext/standard/tests/network/setcookie.phpt b/ext/standard/tests/network/setcookie.phpt new file mode 100644 index 0000000..bf04ec7 --- /dev/null +++ b/ext/standard/tests/network/setcookie.phpt @@ -0,0 +1,70 @@ +--TEST-- +setcookie() tests +--DESCRIPTION-- +--INI-- +date.timezone=UTC +--FILE-- +<?php +setcookie('name'); +setcookie('name', 'value'); +setcookie('name', 'space value'); +setcookie('name', 'value', 0); +setcookie('name', 'value', $tsp = time() + 5); +setcookie('name', 'value', $tsn = time() - 6); +setcookie('name', 'value', $tsc = time()); +setcookie('name', 'value', 0, '/path/'); +setcookie('name', 'value', 0, '', 'domain.tld'); +setcookie('name', 'value', 0, '', '', TRUE); +setcookie('name', 'value', 0, '', '', FALSE, TRUE); + + +$expected = array( + 'Set-Cookie: name=', + 'Set-Cookie: name=value', + 'Set-Cookie: name=space+value', + 'Set-Cookie: name=value', + 'Set-Cookie: name=value; expires='.date('D, d-M-Y H:i:s', $tsp).' GMT; Max-Age=5', + 'Set-Cookie: name=value; expires='.date('D, d-M-Y H:i:s', $tsn).' GMT; Max-Age=-6', + 'Set-Cookie: name=value; expires='.date('D, d-M-Y H:i:s', $tsc).' GMT; Max-Age=0', + 'Set-Cookie: name=value; path=/path/', + 'Set-Cookie: name=value; domain=domain.tld', + 'Set-Cookie: name=value; secure', + 'Set-Cookie: name=value; httponly' +); + +$headers = headers_list(); +if (($i = count($expected)) > count($headers)) +{ + echo "Less headers are being sent than expected - aborting"; + return; +} + +do +{ + if (strncmp(current($headers), 'Set-Cookie:', 11) !== 0) + { + continue; + } + + if (current($headers) === current($expected)) + { + $i--; + } + else + { + echo "Header mismatch:\n\tExpected: " + .current($expected) + ."\n\tReceived: ".current($headers)."\n"; + } + + next($expected); +} +while (next($headers) !== FALSE); + +echo ($i === 0) + ? 'OK' + : 'A total of '.$i.' errors found.'; +--EXPECTHEADERS-- + +--EXPECT-- +OK \ No newline at end of file -- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php