Commit:    6941ce35839f255234c727634a2309b893e4f049
Author:    Yasuo Ohgaki <yohg...@php.net>         Sat, 10 Aug 2013 16:57:56 
+0900
Parents:   54a42f0d0cf85fe0c032009b1f601427ae1c8566
Branches:  master

Link:       
http://git.php.net/?p=php-src.git;a=commitdiff;h=6941ce35839f255234c727634a2309b893e4f049

Log:
Implemented Request #20421 (session_abort() and session_reset() function

Bugs:
https://bugs.php.net/20421

Changed paths:
  M  NEWS
  M  ext/session/session.c
  A  ext/session/tests/session_abort_basic.phpt
  M  ext/session/tests/session_gc_basic.phpt
  A  ext/session/tests/session_reset_basic.phpt


Diff:
diff --git a/NEWS b/NEWS
index ab9edc8..0c94ea2 100644
--- 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:
diff --git a/ext/session/session.c b/ext/session/session.c
index 7a4e601..402cb8b 100644
--- a/ext/session/session.c
+++ b/ext/session/session.c
@@ -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
index 0000000..4a6702f
--- /dev/null
+++ b/ext/session/tests/session_abort_basic.phpt
@@ -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
diff --git a/ext/session/tests/session_gc_basic.phpt 
b/ext/session/tests/session_gc_basic.phpt
index 498f980..f0726ce 100644
--- a/ext/session/tests/session_gc_basic.phpt
+++ b/ext/session/tests/session_gc_basic.phpt
@@ -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
index 0000000..75c6a04
--- /dev/null
+++ b/ext/session/tests/session_reset_basic.phpt
@@ -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


--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to