Minor dependency updates
[yaffs-website] / vendor / fabpot / goutte / Goutte / Client.php
1 <?php
2
3 /*
4  * This file is part of the Goutte package.
5  *
6  * (c) Fabien Potencier <fabien@symfony.com>
7  *
8  * For the full copyright and license information, please view the LICENSE
9  * file that was distributed with this source code.
10  */
11
12 namespace Goutte;
13
14 use GuzzleHttp\Client as GuzzleClient;
15 use GuzzleHttp\ClientInterface as GuzzleClientInterface;
16 use GuzzleHttp\Cookie\CookieJar;
17 use GuzzleHttp\Exception\RequestException;
18 use Psr\Http\Message\ResponseInterface;
19 use Symfony\Component\BrowserKit\Client as BaseClient;
20 use Symfony\Component\BrowserKit\Request;
21 use Symfony\Component\BrowserKit\Response;
22
23 /**
24  * Client.
25  *
26  * @author Fabien Potencier <fabien.potencier@symfony-project.com>
27  * @author Michael Dowling <michael@guzzlephp.org>
28  * @author Charles Sarrazin <charles@sarraz.in>
29  */
30 class Client extends BaseClient
31 {
32     protected $client;
33
34     private $headers = array();
35     private $auth = null;
36
37     public function setClient(GuzzleClientInterface $client)
38     {
39         $this->client = $client;
40
41         return $this;
42     }
43
44     public function getClient()
45     {
46         if (!$this->client) {
47             $this->client = new GuzzleClient(array('allow_redirects' => false, 'cookies' => true));
48         }
49
50         return $this->client;
51     }
52
53     public function setHeader($name, $value)
54     {
55         $this->headers[strtolower($name)] = $value;
56
57         return $this;
58     }
59
60     public function removeHeader($name)
61     {
62         unset($this->headers[strtolower($name)]);
63     }
64
65     public function resetHeaders()
66     {
67         $this->headers = array();
68
69         return $this;
70     }
71
72     /**
73      * {@inheritdoc}
74      */
75     public function restart()
76     {
77         parent::restart();
78         $this->resetAuth()
79              ->resetHeaders();
80     }
81
82     public function setAuth($user, $password = '', $type = 'basic')
83     {
84         $this->auth = array($user, $password, $type);
85
86         return $this;
87     }
88
89     public function resetAuth()
90     {
91         $this->auth = null;
92
93         return $this;
94     }
95
96     /**
97      * @param Request $request
98      *
99      * @return Response
100      */
101     protected function doRequest($request)
102     {
103         $headers = array();
104         foreach ($request->getServer() as $key => $val) {
105             $key = strtolower(str_replace('_', '-', $key));
106             $contentHeaders = array('content-length' => true, 'content-md5' => true, 'content-type' => true);
107             if (0 === strpos($key, 'http-')) {
108                 $headers[substr($key, 5)] = $val;
109             }
110             // CONTENT_* are not prefixed with HTTP_
111             elseif (isset($contentHeaders[$key])) {
112                 $headers[$key] = $val;
113             }
114         }
115
116         $cookies = CookieJar::fromArray(
117             $this->getCookieJar()->allRawValues($request->getUri()),
118             parse_url($request->getUri(), PHP_URL_HOST)
119         );
120
121         $requestOptions = array(
122             'cookies' => $cookies,
123             'allow_redirects' => false,
124             'auth' => $this->auth,
125         );
126
127         if (!in_array($request->getMethod(), array('GET', 'HEAD'))) {
128             if (null !== $content = $request->getContent()) {
129                 $requestOptions['body'] = $content;
130             } else {
131                 if ($files = $request->getFiles()) {
132                     $requestOptions['multipart'] = [];
133
134                     $this->addPostFields($request->getParameters(), $requestOptions['multipart']);
135                     $this->addPostFiles($files, $requestOptions['multipart']);
136                 } else {
137                     $requestOptions['form_params'] = $request->getParameters();
138                 }
139             }
140         }
141
142         if (!empty($headers)) {
143             $requestOptions['headers'] = $headers;
144         }
145
146         $method = $request->getMethod();
147         $uri = $request->getUri();
148
149         foreach ($this->headers as $name => $value) {
150             $requestOptions['headers'][$name] = $value;
151         }
152
153         // Let BrowserKit handle redirects
154         try {
155             $response = $this->getClient()->request($method, $uri, $requestOptions);
156         } catch (RequestException $e) {
157             $response = $e->getResponse();
158             if (null === $response) {
159                 throw $e;
160             }
161         }
162
163         return $this->createResponse($response);
164     }
165
166     protected function addPostFiles(array $files, array &$multipart, $arrayName = '')
167     {
168         if (empty($files)) {
169             return;
170         }
171
172         foreach ($files as $name => $info) {
173             if (!empty($arrayName)) {
174                 $name = $arrayName.'['.$name.']';
175             }
176
177             $file = [
178                 'name' => $name,
179             ];
180
181             if (is_array($info)) {
182                 if (isset($info['tmp_name'])) {
183                     if ('' !== $info['tmp_name']) {
184                         $file['contents'] = fopen($info['tmp_name'], 'r');
185                         if (isset($info['name'])) {
186                             $file['filename'] = $info['name'];
187                         }
188                     } else {
189                         continue;
190                     }
191                 } else {
192                     $this->addPostFiles($info, $multipart, $name);
193                     continue;
194                 }
195             } else {
196                 $file['contents'] = fopen($info, 'r');
197             }
198
199             $multipart[] = $file;
200         }
201     }
202
203     public function addPostFields(array $formParams, array &$multipart, $arrayName = '')
204     {
205         foreach ($formParams as $name => $value) {
206             if (!empty($arrayName)) {
207                 $name = $arrayName.'['.$name.']';
208             }
209
210             if (is_array($value)) {
211                 $this->addPostFields($value, $multipart, $name);
212             } else {
213                 $multipart[] = [
214                     'name' => $name,
215                     'contents' => $value,
216                 ];
217             }
218         }
219     }
220
221     protected function createResponse(ResponseInterface $response)
222     {
223         return new Response((string) $response->getBody(), $response->getStatusCode(), $response->getHeaders());
224     }
225 }