--- /dev/null
+<?php
+
+/*
+ * This file is part of the Behat MinkExtension.
+ * (c) Konstantin Kudryashov <ever.zet@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Behat\MinkExtension\ServiceContainer\Driver;
+
+use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition;
+use Symfony\Component\DependencyInjection\Definition;
+
+/**
+ * @author Christophe Coevoet <stof@notk.org>
+ */
+class GoutteFactory implements DriverFactory
+{
+ /**
+ * {@inheritdoc}
+ */
+ public function getDriverName()
+ {
+ return 'goutte';
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function supportsJavascript()
+ {
+ return false;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function configure(ArrayNodeDefinition $builder)
+ {
+ $builder
+ ->children()
+ ->arrayNode('server_parameters')
+ ->useAttributeAsKey('key')
+ ->prototype('variable')->end()
+ ->end()
+ ->arrayNode('guzzle_parameters')
+ ->useAttributeAsKey('key')
+ ->prototype('variable')->end()
+ ->info(
+ "For Goutte 1.x, these are the second argument of the Guzzle3 client constructor.\n".
+ 'For Goutte 2.x, these are the elements passed in the "defaults" key of the Guzzle4 config.'
+ )
+ ->end()
+ ->end()
+ ;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function buildDriver(array $config)
+ {
+ if (!class_exists('Behat\Mink\Driver\GoutteDriver')) {
+ throw new \RuntimeException(
+ 'Install MinkGoutteDriver in order to use goutte driver.'
+ );
+ }
+
+ if ($this->isGoutte1()) {
+ $guzzleClient = $this->buildGuzzle3Client($config['guzzle_parameters']);
+ } else {
+ $guzzleClient = $this->buildGuzzle4Client($config['guzzle_parameters']);
+ }
+
+ $clientDefinition = new Definition('Behat\Mink\Driver\Goutte\Client', array(
+ $config['server_parameters'],
+ ));
+ $clientDefinition->addMethodCall('setClient', array($guzzleClient));
+
+ return new Definition('Behat\Mink\Driver\GoutteDriver', array(
+ $clientDefinition,
+ ));
+ }
+
+ private function buildGuzzle4Client(array $parameters)
+ {
+ // Force the parameters set by default in Goutte to reproduce its behavior
+ $parameters['allow_redirects'] = false;
+ $parameters['cookies'] = true;
+
+ return new Definition('GuzzleHttp\Client', array($parameters));
+
+ }
+
+ private function buildGuzzle3Client(array $parameters)
+ {
+ // Force the parameters set by default in Goutte to reproduce its behavior
+ $parameters['redirect.disable'] = true;
+
+ return new Definition('Guzzle\Http\Client', array(null, $parameters));
+ }
+
+ private function isGoutte1()
+ {
+ $refl = new \ReflectionParameter(array('Goutte\Client', 'setClient'), 0);
+
+ if ($refl->getClass() && 'Guzzle\Http\ClientInterface' === $refl->getClass()->getName()) {
+ return true;
+ }
+
+ return false;
+ }
+}