6ff23cd139fdb99affef9f1b5118ab02b902dfcb
[yaffs-website] / vendor / zendframework / zend-feed / src / Reader / Http / ZendHttpClientDecorator.php
1 <?php
2 /**
3  * Zend Framework (http://framework.zend.com/)
4  *
5  * @link      http://github.com/zendframework/zf2 for the canonical source repository
6  * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
7  * @license   http://framework.zend.com/license/new-bsd New BSD License
8  */
9
10 namespace Zend\Feed\Reader\Http;
11
12 use Zend\Feed\Reader\Exception;
13 use Zend\Http\Client as ZendHttpClient;
14 use Zend\Http\Headers;
15
16 class ZendHttpClientDecorator implements HeaderAwareClientInterface
17 {
18     /**
19      * @var ZendHttpClient
20      */
21     private $client;
22
23     /**
24      * @param ZendHttpClient $client
25      */
26     public function __construct(ZendHttpClient $client)
27     {
28         $this->client = $client;
29     }
30
31     /**
32      * @return ZendHttpClient
33      */
34     public function getDecoratedClient()
35     {
36         return $this->client;
37     }
38
39     /**
40      * {@inheritDoc}
41      */
42     public function get($uri, array $headers = [])
43     {
44         $this->client->resetParameters();
45         $this->client->setMethod('GET');
46         $this->client->setHeaders(new Headers());
47         $this->client->setUri($uri);
48         if (! empty($headers)) {
49             $this->injectHeaders($headers);
50         }
51         $response = $this->client->send();
52
53         return new Response(
54             $response->getStatusCode(),
55             $response->getBody(),
56             $this->prepareResponseHeaders($response->getHeaders())
57         );
58     }
59
60     /**
61      * Inject header values into the client.
62      *
63      * @param array $headerValues
64      */
65     private function injectHeaders(array $headerValues)
66     {
67         $headers = $this->client->getRequest()->getHeaders();
68         foreach ($headerValues as $name => $values) {
69             if (! is_string($name) || is_numeric($name) || empty($name)) {
70                 throw new Exception\InvalidArgumentException(sprintf(
71                     'Header names provided to %s::get must be non-empty, non-numeric strings; received %s',
72                     __CLASS__,
73                     $name
74                 ));
75             }
76
77             if (! is_array($values)) {
78                 throw new Exception\InvalidArgumentException(sprintf(
79                     'Header values provided to %s::get must be arrays of values; received %s',
80                     __CLASS__,
81                     (is_object($values) ? get_class($values) : gettype($values))
82                 ));
83             }
84
85             foreach ($values as $value) {
86                 if (! is_string($value) && ! is_numeric($value)) {
87                     throw new Exception\InvalidArgumentException(sprintf(
88                         'Individual header values provided to %s::get must be strings or numbers; '
89                         . 'received %s for header %s',
90                         __CLASS__,
91                         (is_object($value) ? get_class($value) : gettype($value)),
92                         $name
93                     ));
94                 }
95
96                 $headers->addHeaderLine($name, $value);
97             }
98         }
99     }
100
101     /**
102      * Normalize headers to use with HeaderAwareResponseInterface.
103      *
104      * Ensures multi-value headers are represented as a single string, via
105      * comma concatenation.
106      *
107      * @param Headers $headers
108      * @return array
109      */
110     private function prepareResponseHeaders(Headers $headers)
111     {
112         $normalized = [];
113         foreach ($headers->toArray() as $name => $value) {
114             $normalized[$name] = is_array($value) ? implode(', ', $value) : $value;
115         }
116         return $normalized;
117     }
118 }