Search moodle.org's
Developer Documentation

See Release Notes

  • Bug fixes for general core bugs in 4.3.x will end 7 October 2024 (12 months).
  • Bug fixes for security issues in 4.3.x will end 21 April 2025 (18 months).
  • PHP version: minimum PHP 8.0.0 Note: minimum PHP version has increased since Moodle 4.1. PHP 8.2.x is supported too.
   1  <?php
   2  
   3  namespace GuzzleHttp\Handler;
   4  
   5  use GuzzleHttp\Psr7\Response;
   6  use GuzzleHttp\Utils;
   7  use Psr\Http\Message\RequestInterface;
   8  use Psr\Http\Message\ResponseInterface;
   9  use Psr\Http\Message\StreamInterface;
  10  
  11  /**
  12   * Represents a cURL easy handle and the data it populates.
  13   *
  14   * @internal
  15   */
  16  final class EasyHandle
  17  {
  18      /**
  19       * @var resource|\CurlHandle cURL resource
  20       */
  21      public $handle;
  22  
  23      /**
  24       * @var StreamInterface Where data is being written
  25       */
  26      public $sink;
  27  
  28      /**
  29       * @var array Received HTTP headers so far
  30       */
  31      public $headers = [];
  32  
  33      /**
  34       * @var ResponseInterface|null Received response (if any)
  35       */
  36      public $response;
  37  
  38      /**
  39       * @var RequestInterface Request being sent
  40       */
  41      public $request;
  42  
  43      /**
  44       * @var array Request options
  45       */
  46      public $options = [];
  47  
  48      /**
  49       * @var int cURL error number (if any)
  50       */
  51      public $errno = 0;
  52  
  53      /**
  54       * @var \Throwable|null Exception during on_headers (if any)
  55       */
  56      public $onHeadersException;
  57  
  58      /**
  59       * @var \Exception|null Exception during createResponse (if any)
  60       */
  61      public $createResponseException;
  62  
  63      /**
  64       * Attach a response to the easy handle based on the received headers.
  65       *
  66       * @throws \RuntimeException if no headers have been received or the first
  67       *                           header line is invalid.
  68       */
  69      public function createResponse(): void
  70      {
  71          [$ver, $status, $reason, $headers] = HeaderProcessor::parseHeaders($this->headers);
  72  
  73          $normalizedKeys = Utils::normalizeHeaderKeys($headers);
  74  
  75          if (!empty($this->options['decode_content']) && isset($normalizedKeys['content-encoding'])) {
  76              $headers['x-encoded-content-encoding'] = $headers[$normalizedKeys['content-encoding']];
  77              unset($headers[$normalizedKeys['content-encoding']]);
  78              if (isset($normalizedKeys['content-length'])) {
  79                  $headers['x-encoded-content-length'] = $headers[$normalizedKeys['content-length']];
  80  
  81                  $bodyLength = (int) $this->sink->getSize();
  82                  if ($bodyLength) {
  83                      $headers[$normalizedKeys['content-length']] = $bodyLength;
  84                  } else {
  85                      unset($headers[$normalizedKeys['content-length']]);
  86                  }
  87              }
  88          }
  89  
  90          // Attach a response to the easy handle with the parsed headers.
  91          $this->response = new Response(
  92              $status,
  93              $headers,
  94              $this->sink,
  95              $ver,
  96              $reason
  97          );
  98      }
  99  
 100      /**
 101       * @param string $name
 102       *
 103       * @return void
 104       *
 105       * @throws \BadMethodCallException
 106       */
 107      public function __get($name)
 108      {
 109          $msg = $name === 'handle' ? 'The EasyHandle has been released' : 'Invalid property: ' . $name;
 110          throw new \BadMethodCallException($msg);
 111      }
 112  }