[Dotenv] Get env using $_SERVER to work with fastcgi_param and workaround thread safety issues
This commit is contained in:
parent
2204f916a3
commit
f76e420e09
@ -438,13 +438,13 @@ class Container implements ResettableContainerInterface
|
||||
if (isset($this->envCache[$name]) || array_key_exists($name, $this->envCache)) {
|
||||
return $this->envCache[$name];
|
||||
}
|
||||
if (0 !== strpos($name, 'HTTP_') && isset($_SERVER[$name])) {
|
||||
if (isset($_SERVER[$name]) && 0 !== strpos($name, 'HTTP_')) {
|
||||
return $this->envCache[$name] = $_SERVER[$name];
|
||||
}
|
||||
if (isset($_ENV[$name])) {
|
||||
return $this->envCache[$name] = $_ENV[$name];
|
||||
}
|
||||
if (false !== $env = getenv($name)) {
|
||||
if (false !== ($env = getenv($name)) && null !== $env) { // null is a possible value because of thread safety issues
|
||||
return $this->envCache[$name] = $env;
|
||||
}
|
||||
if (!$this->hasParameter("env($name)")) {
|
||||
|
@ -70,13 +70,17 @@ final class Dotenv
|
||||
unset($loadedVars['']);
|
||||
|
||||
foreach ($values as $name => $value) {
|
||||
if (!isset($loadedVars[$name]) && (isset($_ENV[$name]) || isset($_SERVER[$name]) || false !== getenv($name))) {
|
||||
$notHttpName = 0 !== strpos($name, 'HTTP_');
|
||||
// don't check existence with getenv() because of thread safety issues
|
||||
if (!isset($loadedVars[$name]) && (isset($_ENV[$name]) || (isset($_SERVER[$name]) && $notHttpName))) {
|
||||
continue;
|
||||
}
|
||||
|
||||
putenv("$name=$value");
|
||||
$_ENV[$name] = $value;
|
||||
if ($notHttpName) {
|
||||
$_SERVER[$name] = $value;
|
||||
}
|
||||
|
||||
$loadedVars[$name] = true;
|
||||
}
|
||||
@ -363,7 +367,15 @@ final class Dotenv
|
||||
}
|
||||
|
||||
$name = $matches[3];
|
||||
$value = isset($this->values[$name]) ? $this->values[$name] : (isset($_ENV[$name]) ? $_ENV[$name] : (string) getenv($name));
|
||||
if (isset($this->values[$name])) {
|
||||
$value = $this->values[$name];
|
||||
} elseif (isset($_SERVER[$name]) && 0 !== strpos($name, 'HTTP_')) {
|
||||
$value = $_SERVER[$name];
|
||||
} elseif (isset($_ENV[$name])) {
|
||||
$value = $_ENV[$name];
|
||||
} else {
|
||||
$value = (string) getenv($name);
|
||||
}
|
||||
|
||||
if (!$matches[2] && isset($matches[4])) {
|
||||
$value .= '}';
|
||||
|
@ -208,6 +208,7 @@ class DotenvTest extends TestCase
|
||||
public function testEnvVarIsNotOverriden()
|
||||
{
|
||||
putenv('TEST_ENV_VAR=original_value');
|
||||
$_SERVER['TEST_ENV_VAR'] = 'original_value';
|
||||
|
||||
$dotenv = new DotEnv();
|
||||
$dotenv->populate(array('TEST_ENV_VAR' => 'new_value'));
|
||||
@ -215,6 +216,18 @@ class DotenvTest extends TestCase
|
||||
$this->assertSame('original_value', getenv('TEST_ENV_VAR'));
|
||||
}
|
||||
|
||||
public function testHttpVarIsPartiallyOverriden()
|
||||
{
|
||||
$_SERVER['HTTP_TEST_ENV_VAR'] = 'http_value';
|
||||
|
||||
$dotenv = new DotEnv();
|
||||
$dotenv->populate(array('HTTP_TEST_ENV_VAR' => 'env_value'));
|
||||
|
||||
$this->assertSame('env_value', getenv('HTTP_TEST_ENV_VAR'));
|
||||
$this->assertSame('env_value', $_ENV['HTTP_TEST_ENV_VAR']);
|
||||
$this->assertSame('http_value', $_SERVER['HTTP_TEST_ENV_VAR']);
|
||||
}
|
||||
|
||||
public function testMemorizingLoadedVarsNamesInSpecialVar()
|
||||
{
|
||||
// Special variable not exists
|
||||
|
Reference in New Issue
Block a user