[Dotenv] Get env using $_SERVER to work with fastcgi_param and workaround thread safety issues

This commit is contained in:
Nicolas Grekas 2017-08-22 15:31:38 +02:00
parent 2204f916a3
commit f76e420e09
3 changed files with 30 additions and 5 deletions

View File

@ -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)")) {

View File

@ -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;
$_SERVER[$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 .= '}';

View File

@ -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