annotate vendor/guzzlehttp/guzzle/src/PrepareBodyMiddleware.php @ 19:fa3358dc1485 tip

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