Search moodle.org's
Developer Documentation

See Release Notes

  • Bug fixes for general core bugs in 4.2.x will end 22 April 2024 (12 months).
  • Bug fixes for security issues in 4.2.x will end 7 October 2024 (18 months).
  • PHP version: minimum PHP 8.0.0 Note: minimum PHP version has increased since Moodle 4.1. PHP 8.1.x is supported too.
   1  <?php
   2  
   3  namespace GuzzleHttp;
   4  
   5  use GuzzleHttp\Promise\PromiseInterface;
   6  use Psr\Http\Message\RequestInterface;
   7  
   8  /**
   9   * Prepares requests that contain a body, adding the Content-Length,
  10   * Content-Type, and Expect headers.
  11   *
  12   * @final
  13   */
  14  class PrepareBodyMiddleware
  15  {
  16      /**
  17       * @var callable(RequestInterface, array): PromiseInterface
  18       */
  19      private $nextHandler;
  20  
  21      /**
  22       * @param callable(RequestInterface, array): PromiseInterface $nextHandler Next handler to invoke.
  23       */
  24      public function __construct(callable $nextHandler)
  25      {
  26          $this->nextHandler = $nextHandler;
  27      }
  28  
  29      public function __invoke(RequestInterface $request, array $options): PromiseInterface
  30      {
  31          $fn = $this->nextHandler;
  32  
  33          // Don't do anything if the request has no body.
  34          if ($request->getBody()->getSize() === 0) {
  35              return $fn($request, $options);
  36          }
  37  
  38          $modify = [];
  39  
  40          // Add a default content-type if possible.
  41          if (!$request->hasHeader('Content-Type')) {
  42              if ($uri = $request->getBody()->getMetadata('uri')) {
  43                  if (is_string($uri) && $type = Psr7\MimeType::fromFilename($uri)) {
  44                      $modify['set_headers']['Content-Type'] = $type;
  45                  }
  46              }
  47          }
  48  
  49          // Add a default content-length or transfer-encoding header.
  50          if (!$request->hasHeader('Content-Length')
  51              && !$request->hasHeader('Transfer-Encoding')
  52          ) {
  53              $size = $request->getBody()->getSize();
  54              if ($size !== null) {
  55                  $modify['set_headers']['Content-Length'] = $size;
  56              } else {
  57                  $modify['set_headers']['Transfer-Encoding'] = 'chunked';
  58              }
  59          }
  60  
  61          // Add the expect header if needed.
  62          $this->addExpectHeader($request, $options, $modify);
  63  
  64          return $fn(Psr7\Utils::modifyRequest($request, $modify), $options);
  65      }
  66  
  67      /**
  68       * Add expect header
  69       */
  70      private function addExpectHeader(RequestInterface $request, array $options, array &$modify): void
  71      {
  72          // Determine if the Expect header should be used
  73          if ($request->hasHeader('Expect')) {
  74              return;
  75          }
  76  
  77          $expect = $options['expect'] ?? null;
  78  
  79          // Return if disabled or if you're not using HTTP/1.1 or HTTP/2.0
  80          if ($expect === false || $request->getProtocolVersion() < 1.1) {
  81              return;
  82          }
  83  
  84          // The expect header is unconditionally enabled
  85          if ($expect === true) {
  86              $modify['set_headers']['Expect'] = '100-Continue';
  87              return;
  88          }
  89  
  90          // By default, send the expect header when the payload is > 1mb
  91          if ($expect === null) {
  92              $expect = 1048576;
  93          }
  94  
  95          // Always add if the body cannot be rewound, the size cannot be
  96          // determined, or the size is greater than the cutoff threshold
  97          $body = $request->getBody();
  98          $size = $body->getSize();
  99  
 100          if ($size === null || $size >= (int) $expect || !$body->isSeekable()) {
 101              $modify['set_headers']['Expect'] = '100-Continue';
 102          }
 103      }
 104  }