PluginProbe
Depicter — Popup & Slider Builder / 1.3.3
Depicter — Popup & Slider Builder v1.3.3
4.8.1 trunk 1.0.0 1.1.0 1.1.2 1.1.4 1.1.6 1.1.7 1.1.8 1.1.9 1.2.0 1.3.0 1.3.1 1.3.2 1.3.3 1.3.5 1.3.8 1.5.0 1.5.1 1.5.2 1.5.5 1.6.0 1.6.1 1.6.2 1.7.0 All 76 releases
depicter / modules / GuzzleHttp / PrepareBodyMiddleware.php

PrepareBodyMiddleware.php in Depicter — Popup & Slider Builder 1.3.3, at modules/GuzzleHttp/PrepareBodyMiddleware.php

105 lines 3.1 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace Depicter\GuzzleHttp;
4
5 use Depicter\GuzzleHttp\Promise\PromiseInterface;
6 use Depicter\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 }
105