| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169 | <?phpnamespace GuzzleHttp\Command\Guzzle;use GuzzleHttp\ClientInterface;use GuzzleHttp\Command\CommandInterface;use GuzzleHttp\Command\Guzzle\Handler\ValidatedDescriptionHandler;use GuzzleHttp\Command\ServiceClient;use GuzzleHttp\HandlerStack;/** * Default Guzzle web service client implementation. */class GuzzleClient extends ServiceClient{    /** @var array $config */    private $config;    /** @var DescriptionInterface Guzzle service description */    private $description;    /**     * The client constructor accepts an associative array of configuration     * options:     *     * - defaults: Associative array of default command parameters to add to     *   each command created by the client.     * - validate: Specify if command input is validated (defaults to true).     *   Changing this setting after the client has been created will have no     *   effect.     * - process: Specify if HTTP responses are parsed (defaults to true).     *   Changing this setting after the client has been created will have no     *   effect.     * - response_locations: Associative array of location types mapping to     *   ResponseLocationInterface objects.     *     * @param ClientInterface $client HTTP client to use.     * @param DescriptionInterface $description Guzzle service description     * @param callable $commandToRequestTransformer     * @param callable $responseToResultTransformer     * @param HandlerStack $commandHandlerStack     * @param array $config Configuration options     */    public function __construct(        ClientInterface $client,        DescriptionInterface $description,        callable $commandToRequestTransformer = null,        callable $responseToResultTransformer = null,        HandlerStack $commandHandlerStack = null,        array $config = []    ) {        $this->config = $config;        $this->description = $description;        $serializer = $this->getSerializer($commandToRequestTransformer);        $deserializer = $this->getDeserializer($responseToResultTransformer);        parent::__construct($client, $serializer, $deserializer, $commandHandlerStack);        $this->processConfig($config);    }    /**     * Returns the command if valid; otherwise an Exception     * @param string $name     * @param array  $args     * @return CommandInterface     * @throws \InvalidArgumentException     */    public function getCommand($name, array $args = [])    {        if (!$this->description->hasOperation($name)) {            $name = ucfirst($name);            if (!$this->description->hasOperation($name)) {                throw new \InvalidArgumentException(                    "No operation found named {$name}"                );            }        }        // Merge in default command options        $args += $this->getConfig('defaults');        return parent::getCommand($name, $args);    }    /**     * Return the description     *     * @return DescriptionInterface     */    public function getDescription()    {        return $this->description;    }    /**     * Returns the passed Serializer when set, a new instance otherwise     *     * @param callable|null $commandToRequestTransformer     * @return \GuzzleHttp\Command\Guzzle\Serializer     */    private function getSerializer($commandToRequestTransformer)    {        return $commandToRequestTransformer ==! null            ? $commandToRequestTransformer            : new Serializer($this->description);    }    /**     * Returns the passed Deserializer when set, a new instance otherwise     *     * @param callable|null $responseToResultTransformer     * @return \GuzzleHttp\Command\Guzzle\Deserializer     */    private function getDeserializer($responseToResultTransformer)    {        $process = (! isset($this->config['process']) || $this->config['process'] === true);        return $responseToResultTransformer ==! null            ? $responseToResultTransformer            : new Deserializer($this->description, $process);    }    /**     * Get the config of the client     *     * @param array|string $option     * @return mixed     */    public function getConfig($option = null)    {        return $option === null            ? $this->config            : (isset($this->config[$option]) ? $this->config[$option] : []);    }    /**     * @param $option     * @param $value     */    public function setConfig($option, $value)    {        $this->config[$option] = $value;    }    /**     * Prepares the client based on the configuration settings of the client.     *     * @param array $config Constructor config as an array     */    protected function processConfig(array $config)    {        // set defaults as an array if not provided        if (!isset($config['defaults'])) {            $config['defaults'] = [];        }        // Add the handlers based on the configuration option        $stack = $this->getHandlerStack();        if (!isset($config['validate']) || $config['validate'] === true) {            $stack->push(new ValidatedDescriptionHandler($this->description), 'validate_description');        }        if (!isset($config['process']) || $config['process'] === true) {            // TODO: This belongs to the Deserializer and should be handled there.            // Question: What is the result when the Deserializer is bypassed?            // Possible answer: The raw response.        }    }}
 |