summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEmiel Bruijntjes <emiel.bruijntjes@copernica.com>2014-04-03 12:47:09 +0200
committerEmiel Bruijntjes <emiel.bruijntjes@copernica.com>2014-04-03 12:47:09 +0200
commitc9d8cabfebc9a3b757fa1492c4431b0f88e9ded0 (patch)
treec76764dcd4ae2737b2de23a8a2d0d575613cd71e
parenta5aaa0877fa586499c4be8f19df760fff11f28dd (diff)
{auto} fixed super-globals when running as apache module, and when using just-in-time setting for the super-globals (fixes issue #63)
-rw-r--r--include/super.h15
-rw-r--r--src/super.cpp24
2 files changed, 26 insertions, 13 deletions
diff --git a/include/super.h b/include/super.h
index 73e3761..97ba6b8 100644
--- a/include/super.h
+++ b/include/super.h
@@ -25,9 +25,10 @@ public:
* Extension writers do not have to access the super-globals themselves.
* They are always accessible via Php::POST, Php::GET, et cetera.
*
- * @param index number
+ * @param index index number
+ * @param name name of the variable in PHP
*/
- Super(int index) : _index(index) {}
+ Super(int index, const char *name) : _index(index), _name(name) {}
/**
* Destructor
@@ -40,7 +41,7 @@ public:
* @param key
* @return Value
*/
- Value operator[](const std::string &key) const;
+ Value operator[](const std::string &key);
/**
* Array access operator
@@ -48,7 +49,7 @@ public:
* @param key
* @return Value
*/
- Value operator[](const char *key) const;
+ Value operator[](const char *key);
private:
/**
@@ -56,6 +57,12 @@ private:
* @var int
*/
int _index;
+
+ /**
+ * Name of the variable in PHP
+ * @var name
+ */
+ const char *_name;
};
/**
diff --git a/src/super.cpp b/src/super.cpp
index b344159..b2e7ad9 100644
--- a/src/super.cpp
+++ b/src/super.cpp
@@ -14,13 +14,13 @@ namespace Php {
/**
* A number of super-globals are always accessible
*/
-Super POST (TRACK_VARS_POST);
-Super GET (TRACK_VARS_GET);
-Super COOKIE (TRACK_VARS_COOKIE);
-Super SERVER (TRACK_VARS_SERVER);
-Super ENV (TRACK_VARS_ENV);
-Super FILES (TRACK_VARS_FILES);
-Super REQUEST (TRACK_VARS_REQUEST);
+Super POST (TRACK_VARS_POST, "_POST");
+Super GET (TRACK_VARS_GET, "_GET");
+Super COOKIE (TRACK_VARS_COOKIE, "_COOKIR");
+Super SERVER (TRACK_VARS_SERVER, "_SERVER");
+Super ENV (TRACK_VARS_ENV, "_ENV");
+Super FILES (TRACK_VARS_FILES, "_FILES");
+Super REQUEST (TRACK_VARS_REQUEST, "_REQUEST");
/**
* Array access operator
@@ -28,11 +28,14 @@ Super REQUEST (TRACK_VARS_REQUEST);
* @param key
* @return Value
*/
-Value Super::operator[](const std::string &key) const
+Value Super::operator[](const std::string &key)
{
// we need the tsrm_ls pointer
TSRMLS_FETCH();
+ // call zend_is_auto_global to ensure that the just-in-time globals are loaded
+ if (_name) { zend_is_auto_global(_name, strlen(_name) TSRMLS_CC); _name = nullptr; }
+
// create a value object that wraps around the actual zval
Value value(PG(http_globals)[_index]);
@@ -46,11 +49,14 @@ Value Super::operator[](const std::string &key) const
* @param key
* @return Value
*/
-Value Super::operator[](const char *key) const
+Value Super::operator[](const char *key)
{
// we need the tsrm_ls pointer
TSRMLS_FETCH();
+ // call zend_is_auto_global to ensure that the just-in-time globals are loaded
+ if (_name) { zend_is_auto_global(_name, strlen(_name) TSRMLS_CC); _name = nullptr; }
+
// create a value object that wraps around the actual zval
Value value(PG(http_globals)[_index]);