]> granicus.if.org Git - php/commitdiff
Implemented Request #20421 (session_abort() and session_reset() function
authorYasuo Ohgaki <yohgaki@php.net>
Sat, 10 Aug 2013 07:57:56 +0000 (16:57 +0900)
committerYasuo Ohgaki <yohgaki@php.net>
Sat, 10 Aug 2013 07:57:56 +0000 (16:57 +0900)
NEWS
ext/session/session.c
ext/session/tests/session_abort_basic.phpt [new file with mode: 0644]
ext/session/tests/session_gc_basic.phpt
ext/session/tests/session_reset_basic.phpt [new file with mode: 0644]

diff --git a/NEWS b/NEWS
index ab9edc8c8e82cd2348da8904445b5c9db6a1cf6d..0c94ea23e12c7936cfdbab6d32b50d82c1fcf8cf 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -12,6 +12,8 @@ PHP                                                                        NEWS
     (Yasuo)
   . Implemented Request #54649 (Create session_serializer_name()). (Yasuo)
   . Implemented Request #17860 (Session write short circuit). (Yasuo)
+  . Implemented Request #20421 (session_abort() and session_reset() function).
+    (Yasuo)
   . Implemented Request #11100 (session_gc() function). (Yasuo)
 
 - mysqlnd:
index 7a4e601e10ea772b5d03a08b57973ef5cebffedc..402cb8b56a84bcdbaae90211baa17ae6b169a4c0 100644 (file)
@@ -1550,6 +1550,26 @@ static void php_session_flush(TSRMLS_D) /* {{{ */
 }
 /* }}} */
 
+static void php_session_abort(TSRMLS_D) /* {{{ */
+{
+       if (PS(session_status) == php_session_active) {
+               PS(session_status) = php_session_none;
+               if (PS(mod_data) || PS(mod_user_implemented)) {
+                       PS(mod)->s_close(&PS(mod_data) TSRMLS_CC);
+               }
+       }
+}
+/* }}} */
+
+static void php_session_reset(TSRMLS_D) /* {{{ */
+{
+       if (PS(session_status) == php_session_active) {
+               php_session_initialize(TSRMLS_C);
+       }
+}
+/* }}} */
+
+
 PHPAPI void session_adapt_url(const char *url, size_t urllen, char **new, size_t *newlen TSRMLS_DC) /* {{{ */
 {
        if (PS(apply_trans_sid) && (PS(session_status) == php_session_active)) {
@@ -2056,6 +2076,22 @@ static PHP_FUNCTION(session_write_close)
 }
 /* }}} */
 
+/* {{{ proto void session_abort(void)
+   Abort session and end session. Session data will not be written */
+static PHP_FUNCTION(session_abort)
+{
+       php_session_abort(TSRMLS_C);
+}
+/* }}} */
+
+/* {{{ proto void session_reset(void)
+   Reset session data from saved session data */
+static PHP_FUNCTION(session_reset)
+{
+       php_session_reset(TSRMLS_C);
+}
+/* }}} */
+
 /* {{{ proto int session_status(void)
    Returns the current session status */
 static PHP_FUNCTION(session_status)
@@ -2249,6 +2285,8 @@ static const zend_function_entry session_functions[] = {
        PHP_FE(session_set_cookie_params, arginfo_session_set_cookie_params)
        PHP_FE(session_get_cookie_params, arginfo_session_void)
        PHP_FE(session_write_close,       arginfo_session_void)
+       PHP_FE(session_abort,             arginfo_session_void)
+       PHP_FE(session_reset,             arginfo_session_void)
        PHP_FE(session_status,            arginfo_session_void)
        PHP_FE(session_gc,                arginfo_session_gc)
        PHP_FE(session_register_shutdown, arginfo_session_void)
diff --git a/ext/session/tests/session_abort_basic.phpt b/ext/session/tests/session_abort_basic.phpt
new file mode 100644 (file)
index 0000000..4a6702f
--- /dev/null
@@ -0,0 +1,51 @@
+--TEST--
+Test session_abort() function : basic functionality
+--SKIPIF--
+<?php include('skipif.inc'); ?>
+--INI--
+session.save_path=
+session.name=PHPSESSID
+--FILE--
+<?php
+
+ob_start();
+
+/*
+ * Prototype : void session_abort(void)
+ * Description : Should abort session. Session data should not be written.
+ * Source code : ext/session/session.c
+ */
+
+echo "*** Testing session_abort() : basic functionality ***\n";
+
+session_start();
+$session_id = session_id();
+$_SESSION['foo'] = 123;
+session_commit();
+
+session_id($session_id);
+session_start();
+$_SESSION['bar'] = 456;
+var_dump($_SESSION);
+session_abort();
+
+session_id($session_id);
+session_start();
+var_dump($_SESSION); // Should only have 'foo'
+
+echo "Done".PHP_EOL;
+
+?>
+--EXPECTF--
+*** Testing session_abort() : basic functionality ***
+array(2) {
+  ["foo"]=>
+  int(123)
+  ["bar"]=>
+  int(456)
+}
+array(1) {
+  ["foo"]=>
+  int(123)
+}
+Done
index 498f98031ecbd41ad07a5ab444cb4955afb83afe..f0726ce93bbbfcd541dbc7ee1257c203fbfb2a44 100644 (file)
@@ -13,7 +13,7 @@ error_reporting(E_ALL);
 ob_start();
 
 /*
- * Prototype : int session_get_cookie_params([int maxlifetime])
+ * Prototype : int session_gc([int maxlifetime])
  * Description : Execute gc and return number of deleted data
  * Source code : ext/session/session.c
  */
diff --git a/ext/session/tests/session_reset_basic.phpt b/ext/session/tests/session_reset_basic.phpt
new file mode 100644 (file)
index 0000000..75c6a04
--- /dev/null
@@ -0,0 +1,49 @@
+--TEST--
+Test session_reset() function : basic functionality
+--SKIPIF--
+<?php include('skipif.inc'); ?>
+--INI--
+session.save_path=
+session.name=PHPSESSID
+--FILE--
+<?php
+
+ob_start();
+
+/*
+ * Prototype : void session_reset(void)
+ * Description : Should abort session. Session data should not be written.
+ * Source code : ext/session/session.c
+ */
+
+echo "*** Testing session_abort() : basic functionality ***\n";
+
+session_start();
+$session_id = session_id();
+$_SESSION['foo'] = 123;
+session_commit();
+
+session_id($session_id);
+session_start();
+$_SESSION['bar'] = 456;
+var_dump($_SESSION);
+session_reset();
+
+var_dump($_SESSION); // Should only have 'foo'
+
+echo "Done".PHP_EOL;
+
+?>
+--EXPECTF--
+*** Testing session_abort() : basic functionality ***
+array(2) {
+  ["foo"]=>
+  int(123)
+  ["bar"]=>
+  int(456)
+}
+array(1) {
+  ["foo"]=>
+  int(123)
+}
+Done