Verzeichnisstruktur phpBB-3.2.0


Veröffentlicht
06.01.2017

So funktioniert es


Auf das letzte Element klicken. Dies geht jeweils ein Schritt zurück

Auf das Icon klicken, dies öffnet das Verzeichnis. Nochmal klicken schließt das Verzeichnis.
Auf den Verzeichnisnamen klicken, dies zeigt nur das Verzeichnis mit Inhalt an

(Beispiel Datei-Icons)

Auf das Icon klicken um den Quellcode anzuzeigen

Client.php

Zuletzt modifiziert: 09.10.2024, 12:56 - Dateigröße: 11.40 KiB


001  <?php
002  namespace GuzzleHttp;
003   
004  use GuzzleHttp\Event\HasEmitterTrait;
005  use GuzzleHttp\Message\MessageFactory;
006  use GuzzleHttp\Message\MessageFactoryInterface;
007  use GuzzleHttp\Message\RequestInterface;
008  use GuzzleHttp\Message\FutureResponse;
009  use GuzzleHttp\Ring\Core;
010  use GuzzleHttp\Ring\Future\FutureInterface;
011  use GuzzleHttp\Exception\RequestException;
012  use React\Promise\FulfilledPromise;
013  use React\Promise\RejectedPromise;
014   
015  /**
016   * HTTP client
017   */
018  class Client implements ClientInterface
019  {
020      use HasEmitterTrait;
021   
022      /** @var MessageFactoryInterface Request factory used by the client */
023      private $messageFactory;
024   
025      /** @var Url Base URL of the client */
026      private $baseUrl;
027   
028      /** @var array Default request options */
029      private $defaults;
030   
031      /** @var callable Request state machine */
032      private $fsm;
033   
034      /**
035       * Clients accept an array of constructor parameters.
036       *
037       * Here's an example of creating a client using an URI template for the
038       * client's base_url and an array of default request options to apply
039       * to each request:
040       *
041       *     $client = new Client([
042       *         'base_url' => [
043       *              'http://www.foo.com/{version}/',
044       *              ['version' => '123']
045       *          ],
046       *         'defaults' => [
047       *             'timeout'         => 10,
048       *             'allow_redirects' => false,
049       *             'proxy'           => '192.168.16.1:10'
050       *         ]
051       *     ]);
052       *
053       * @param array $config Client configuration settings
054       *     - base_url: Base URL of the client that is merged into relative URLs.
055       *       Can be a string or an array that contains a URI template followed
056       *       by an associative array of expansion variables to inject into the
057       *       URI template.
058       *     - handler: callable RingPHP handler used to transfer requests
059       *     - message_factory: Factory used to create request and response object
060       *     - defaults: Default request options to apply to each request
061       *     - emitter: Event emitter used for request events
062       *     - fsm: (internal use only) The request finite state machine. A
063       *       function that accepts a transaction and optional final state. The
064       *       function is responsible for transitioning a request through its
065       *       lifecycle events.
066       */
067      public function __construct(array $config = [])
068      {
069          $this->configureBaseUrl($config);
070          $this->configureDefaults($config);
071   
072          if (isset($config['emitter'])) {
073              $this->emitter = $config['emitter'];
074          }
075   
076          $this->messageFactory = isset($config['message_factory'])
077              ? $config['message_factory']
078              : new MessageFactory();
079   
080          if (isset($config['fsm'])) {
081              $this->fsm = $config['fsm'];
082          } else {
083              if (isset($config['handler'])) {
084                  $handler = $config['handler'];
085              } elseif (isset($config['adapter'])) {
086                  $handler = $config['adapter'];
087              } else {
088                  $handler = Utils::getDefaultHandler();
089              }
090              $this->fsm = new RequestFsm($handler, $this->messageFactory);
091          }
092      }
093   
094      public function getDefaultOption($keyOrPath = null)
095      {
096          return $keyOrPath === null
097              ? $this->defaults
098              : Utils::getPath($this->defaults, $keyOrPath);
099      }
100   
101      public function setDefaultOption($keyOrPath, $value)
102      {
103          Utils::setPath($this->defaults, $keyOrPath, $value);
104      }
105   
106      public function getBaseUrl()
107      {
108          return (string) $this->baseUrl;
109      }
110   
111      public function createRequest($method, $url = null, array $options = [])
112      {
113          $options = $this->mergeDefaults($options);
114          // Use a clone of the client's emitter
115          $options['config']['emitter'] = clone $this->getEmitter();
116          $url = $url || (is_string($url) && strlen($url))
117              ? $this->buildUrl($url)
118              : (string) $this->baseUrl;
119   
120          return $this->messageFactory->createRequest($method, $url, $options);
121      }
122   
123      public function get($url = null, $options = [])
124      {
125          return $this->send($this->createRequest('GET', $url, $options));
126      }
127   
128      public function head($url = null, array $options = [])
129      {
130          return $this->send($this->createRequest('HEAD', $url, $options));
131      }
132   
133      public function delete($url = null, array $options = [])
134      {
135          return $this->send($this->createRequest('DELETE', $url, $options));
136      }
137   
138      public function put($url = null, array $options = [])
139      {
140          return $this->send($this->createRequest('PUT', $url, $options));
141      }
142   
143      public function patch($url = null, array $options = [])
144      {
145          return $this->send($this->createRequest('PATCH', $url, $options));
146      }
147   
148      public function post($url = null, array $options = [])
149      {
150          return $this->send($this->createRequest('POST', $url, $options));
151      }
152   
153      public function options($url = null, array $options = [])
154      {
155          return $this->send($this->createRequest('OPTIONS', $url, $options));
156      }
157   
158      public function send(RequestInterface $request)
159      {
160          $isFuture = $request->getConfig()->get('future');
161          $trans = new Transaction($this, $request, $isFuture);
162          $fn = $this->fsm;
163   
164          try {
165              $fn($trans);
166              if ($isFuture) {
167                  // Turn the normal response into a future if needed.
168                  return $trans->response instanceof FutureInterface
169                      ? $trans->response
170                      : new FutureResponse(new FulfilledPromise($trans->response));
171              }
172              // Resolve deep futures if this is not a future
173              // transaction. This accounts for things like retries
174              // that do not have an immediate side-effect.
175              while ($trans->response instanceof FutureInterface) {
176                  $trans->response = $trans->response->wait();
177              }
178              return $trans->response;
179          } catch (\Exception $e) {
180              if ($isFuture) {
181                  // Wrap the exception in a promise
182                  return new FutureResponse(new RejectedPromise($e));
183              }
184              throw RequestException::wrapException($trans->request, $e);
185          }
186      }
187   
188      /**
189       * Get an array of default options to apply to the client
190       *
191       * @return array
192       */
193      protected function getDefaultOptions()
194      {
195          $settings = [
196              'allow_redirects' => true,
197              'exceptions'      => true,
198              'decode_content'  => true,
199              'verify'          => true
200          ];
201   
202          // Use the standard Linux HTTP_PROXY and HTTPS_PROXY if set.
203          // We can only trust the HTTP_PROXY environment variable in a CLI
204          // process due to the fact that PHP has no reliable mechanism to
205          // get environment variables that start with "HTTP_".
206          if (php_sapi_name() == 'cli' && getenv('HTTP_PROXY')) {
207              $settings['proxy']['http'] = getenv('HTTP_PROXY');
208          }
209   
210          if ($proxy = getenv('HTTPS_PROXY')) {
211              $settings['proxy']['https'] = $proxy;
212          }
213   
214          return $settings;
215      }
216   
217      /**
218       * Expand a URI template and inherit from the base URL if it's relative
219       *
220       * @param string|array $url URL or an array of the URI template to expand
221       *                          followed by a hash of template varnames.
222       * @return string
223       * @throws \InvalidArgumentException
224       */
225      private function buildUrl($url)
226      {
227          // URI template (absolute or relative)
228          if (!is_array($url)) {
229              return strpos($url, '://')
230                  ? (string) $url
231                  : (string) $this->baseUrl->combine($url);
232          }
233   
234          if (!isset($url[1])) {
235              throw new \InvalidArgumentException('You must provide a hash of '
236                  . 'varname options in the second element of a URL array.');
237          }
238   
239          // Absolute URL
240          if (strpos($url[0], '://')) {
241              return Utils::uriTemplate($url[0], $url[1]);
242          }
243   
244          // Combine the relative URL with the base URL
245          return (string) $this->baseUrl->combine(
246              Utils::uriTemplate($url[0], $url[1])
247          );
248      }
249   
250      private function configureBaseUrl(&$config)
251      {
252          if (!isset($config['base_url'])) {
253              $this->baseUrl = new Url('', '');
254          } elseif (!is_array($config['base_url'])) {
255              $this->baseUrl = Url::fromString($config['base_url']);
256          } elseif (count($config['base_url']) < 2) {
257              throw new \InvalidArgumentException('You must provide a hash of '
258                  . 'varname options in the second element of a base_url array.');
259          } else {
260              $this->baseUrl = Url::fromString(
261                  Utils::uriTemplate(
262                      $config['base_url'][0],
263                      $config['base_url'][1]
264                  )
265              );
266              $config['base_url'] = (string) $this->baseUrl;
267          }
268      }
269   
270      private function configureDefaults($config)
271      {
272          if (!isset($config['defaults'])) {
273              $this->defaults = $this->getDefaultOptions();
274          } else {
275              $this->defaults = array_replace(
276                  $this->getDefaultOptions(),
277                  $config['defaults']
278              );
279          }
280   
281          // Add the default user-agent header
282          if (!isset($this->defaults['headers'])) {
283              $this->defaults['headers'] = [
284                  'User-Agent' => Utils::getDefaultUserAgent()
285              ];
286          } elseif (!Core::hasHeader($this->defaults, 'User-Agent')) {
287              // Add the User-Agent header if one was not already set
288              $this->defaults['headers']['User-Agent'] = Utils::getDefaultUserAgent();
289          }
290      }
291   
292      /**
293       * Merges default options into the array passed by reference.
294       *
295       * @param array $options Options to modify by reference
296       *
297       * @return array
298       */
299      private function mergeDefaults($options)
300      {
301          $defaults = $this->defaults;
302   
303          // Case-insensitively merge in default headers if both defaults and
304          // options have headers specified.
305          if (!empty($defaults['headers']) && !empty($options['headers'])) {
306              // Create a set of lowercased keys that are present.
307              $lkeys = [];
308              foreach (array_keys($options['headers']) as $k) {
309                  $lkeys[strtolower($k)] = true;
310              }
311              // Merge in lowercase default keys when not present in above set.
312              foreach ($defaults['headers'] as $key => $value) {
313                  if (!isset($lkeys[strtolower($key)])) {
314                      $options['headers'][$key] = $value;
315                  }
316              }
317              // No longer need to merge in headers.
318              unset($defaults['headers']);
319          }
320   
321          $result = array_replace_recursive($defaults, $options);
322          foreach ($options as $k => $v) {
323              if ($v === null) {
324                  unset($result[$k]);
325              }
326          }
327   
328          return $result;
329      }
330   
331      /**
332       * @deprecated Use {@see GuzzleHttp\Pool} instead.
333       * @see GuzzleHttp\Pool
334       */
335      public function sendAll($requests, array $options = [])
336      {
337          Pool::send($this, $requests, $options);
338      }
339   
340      /**
341       * @deprecated Use GuzzleHttp\Utils::getDefaultHandler
342       */
343      public static function getDefaultHandler()
344      {
345          return Utils::getDefaultHandler();
346      }
347   
348      /**
349       * @deprecated Use GuzzleHttp\Utils::getDefaultUserAgent
350       */
351      public static function getDefaultUserAgent()
352      {
353          return Utils::getDefaultUserAgent();
354      }
355  }
356