mirror of
https://github.com/php/php-src.git
synced 2025-08-17 14:38:49 +02:00
Bug #23955: allow specifiy max age for setcookie()
This commit is contained in:
parent
f3824ad166
commit
ec2fff80e7
4 changed files with 87 additions and 7 deletions
1
NEWS
1
NEWS
|
@ -7,6 +7,7 @@ PHP NEWS
|
||||||
. Fixed bug #63822 (Crash when using closures with ArrayAccess).
|
. Fixed bug #63822 (Crash when using closures with ArrayAccess).
|
||||||
(Nikita Popov)
|
(Nikita Popov)
|
||||||
. Add Generator::throw() method. (Nikita Popov)
|
. Add Generator::throw() method. (Nikita Popov)
|
||||||
|
. Bug #23955: allow specifying Max-Age attribute in setcookie() (narfbg, Lars)
|
||||||
|
|
||||||
- cURL:
|
- cURL:
|
||||||
. Added new functions curl_escape, curl_multi_setopt, curl_multi_strerror
|
. Added new functions curl_escape, curl_multi_setopt, curl_multi_strerror
|
||||||
|
|
|
@ -1154,6 +1154,7 @@ static int php_session_cache_limiter(TSRMLS_D) /* {{{ */
|
||||||
|
|
||||||
#define COOKIE_SET_COOKIE "Set-Cookie: "
|
#define COOKIE_SET_COOKIE "Set-Cookie: "
|
||||||
#define COOKIE_EXPIRES "; expires="
|
#define COOKIE_EXPIRES "; expires="
|
||||||
|
#define COOKIE_MAX_AGE "; Max-Age="
|
||||||
#define COOKIE_PATH "; path="
|
#define COOKIE_PATH "; path="
|
||||||
#define COOKIE_DOMAIN "; domain="
|
#define COOKIE_DOMAIN "; domain="
|
||||||
#define COOKIE_SECURE "; secure"
|
#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, COOKIE_EXPIRES);
|
||||||
smart_str_appends(&ncookie, date_fmt);
|
smart_str_appends(&ncookie, date_fmt);
|
||||||
efree(date_fmt);
|
efree(date_fmt);
|
||||||
|
|
||||||
|
smart_str_appends(&ncookie, COOKIE_MAX_AGE);
|
||||||
|
smart_str_append_long(&ncookie, PS(cookie_lifetime));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -117,12 +117,13 @@ PHPAPI int php_setcookie(char *name, int name_len, char *value, int value_len, t
|
||||||
* pick an expiry date in the past
|
* 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);
|
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);
|
efree(dt);
|
||||||
} else {
|
} else {
|
||||||
snprintf(cookie, len + 100, "Set-Cookie: %s=%s", name, value ? encoded_value : "");
|
snprintf(cookie, len + 100, "Set-Cookie: %s=%s", name, value ? encoded_value : "");
|
||||||
if (expires > 0) {
|
if (expires > 0) {
|
||||||
const char *p;
|
const char *p;
|
||||||
|
char tsdelta[13];
|
||||||
strlcat(cookie, "; expires=", len + 100);
|
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);
|
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 */
|
/* 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);
|
strlcat(cookie, dt, len + 100);
|
||||||
efree(dt);
|
efree(dt);
|
||||||
|
|
||||||
|
snprintf(tsdelta, sizeof(tsdelta), "%li", (long) difftime(expires, time(NULL)));
|
||||||
|
strlcat(cookie, "; Max-Age=", len + 100);
|
||||||
|
strlcat(cookie, tsdelta, len + 100);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
70
ext/standard/tests/network/setcookie.phpt
Normal file
70
ext/standard/tests/network/setcookie.phpt
Normal file
|
@ -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
|
Loading…
Add table
Add a link
Reference in a new issue