Spaces:
Sleeping
Sleeping
| /* | |
| * This file is part of the Symfony package. | |
| * | |
| * (c) Fabien Potencier <fabien@symfony.com> | |
| * | |
| * For the full copyright and license information, please view the LICENSE | |
| * file that was distributed with this source code. | |
| */ | |
| namespace Symfony\Component\Process; | |
| use Symfony\Component\Process\Exception\InvalidArgumentException; | |
| /** | |
| * ProcessUtils is a bunch of utility methods. | |
| * | |
| * This class contains static methods only and is not meant to be instantiated. | |
| * | |
| * @author Martin Hasoň <martin.hason@gmail.com> | |
| */ | |
| class ProcessUtils | |
| { | |
| /** | |
| * This class should not be instantiated. | |
| */ | |
| private function __construct() | |
| { | |
| } | |
| /** | |
| * Escapes a string to be used as a shell argument. | |
| * | |
| * @param string $argument The argument that will be escaped | |
| * | |
| * @return string The escaped argument | |
| * | |
| * @deprecated since version 3.3, to be removed in 4.0. Use a command line array or give env vars to the `Process::start/run()` method instead. | |
| */ | |
| public static function escapeArgument($argument) | |
| { | |
| @trigger_error('The '.__METHOD__.'() method is deprecated since version 3.3 and will be removed in 4.0. Use a command line array or give env vars to the Process::start/run() method instead.', E_USER_DEPRECATED); | |
| //Fix for PHP bug #43784 escapeshellarg removes % from given string | |
| //Fix for PHP bug #49446 escapeshellarg doesn't work on Windows | |
| //@see https://bugs.php.net/bug.php?id=43784 | |
| //@see https://bugs.php.net/bug.php?id=49446 | |
| if ('\\' === DIRECTORY_SEPARATOR) { | |
| if ('' === $argument) { | |
| return escapeshellarg($argument); | |
| } | |
| $escapedArgument = ''; | |
| $quote = false; | |
| foreach (preg_split('/(")/', $argument, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE) as $part) { | |
| if ('"' === $part) { | |
| $escapedArgument .= '\\"'; | |
| } elseif (self::isSurroundedBy($part, '%')) { | |
| // Avoid environment variable expansion | |
| $escapedArgument .= '^%"'.substr($part, 1, -1).'"^%'; | |
| } else { | |
| // escape trailing backslash | |
| if ('\\' === substr($part, -1)) { | |
| $part .= '\\'; | |
| } | |
| $quote = true; | |
| $escapedArgument .= $part; | |
| } | |
| } | |
| if ($quote) { | |
| $escapedArgument = '"'.$escapedArgument.'"'; | |
| } | |
| return $escapedArgument; | |
| } | |
| return "'".str_replace("'", "'\\''", $argument)."'"; | |
| } | |
| /** | |
| * Validates and normalizes a Process input. | |
| * | |
| * @param string $caller The name of method call that validates the input | |
| * @param mixed $input The input to validate | |
| * | |
| * @return mixed The validated input | |
| * | |
| * @throws InvalidArgumentException In case the input is not valid | |
| */ | |
| public static function validateInput($caller, $input) | |
| { | |
| if (null !== $input) { | |
| if (is_resource($input)) { | |
| return $input; | |
| } | |
| if (is_string($input)) { | |
| return $input; | |
| } | |
| if (is_scalar($input)) { | |
| return (string) $input; | |
| } | |
| if ($input instanceof Process) { | |
| return $input->getIterator($input::ITER_SKIP_ERR); | |
| } | |
| if ($input instanceof \Iterator) { | |
| return $input; | |
| } | |
| if ($input instanceof \Traversable) { | |
| return new \IteratorIterator($input); | |
| } | |
| throw new InvalidArgumentException(sprintf('%s only accepts strings, Traversable objects or stream resources.', $caller)); | |
| } | |
| return $input; | |
| } | |
| private static function isSurroundedBy($arg, $char) | |
| { | |
| return 2 < strlen($arg) && $char === $arg[0] && $char === $arg[strlen($arg) - 1]; | |
| } | |
| } | |