diff --git a/src/Symfony/Component/DependencyInjection/Container.php b/src/Symfony/Component/DependencyInjection/Container.php index 81241e3415cc..6eceb0defeba 100644 --- a/src/Symfony/Component/DependencyInjection/Container.php +++ b/src/Symfony/Component/DependencyInjection/Container.php @@ -438,13 +438,13 @@ protected function getEnv($name) 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)")) { diff --git a/src/Symfony/Component/Dotenv/Dotenv.php b/src/Symfony/Component/Dotenv/Dotenv.php index 0d3c01d93639..910a1622f303 100644 --- a/src/Symfony/Component/Dotenv/Dotenv.php +++ b/src/Symfony/Component/Dotenv/Dotenv.php @@ -70,13 +70,17 @@ public function populate($values) 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 @@ private function resolveVariables($value) } $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 .= '}'; diff --git a/src/Symfony/Component/Dotenv/Tests/DotenvTest.php b/src/Symfony/Component/Dotenv/Tests/DotenvTest.php index dc1a7b5b2c4a..ce7d3a93396b 100644 --- a/src/Symfony/Component/Dotenv/Tests/DotenvTest.php +++ b/src/Symfony/Component/Dotenv/Tests/DotenvTest.php @@ -208,6 +208,7 @@ public function testServerSuperglobalIsNotOverriden() 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 @@ public function testEnvVarIsNotOverriden() $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