PluginProbe ʕ •ᴥ•ʔ
SureCart – Ecommerce Made Easy For Selling Physical Products, Digital Downloads, Subscriptions, Donations, & Payments / 4.6.2
SureCart – Ecommerce Made Easy For Selling Physical Products, Digital Downloads, Subscriptions, Donations, & Payments v4.6.2
4.6.6 4.6.5 4.6.4 4.6.3 4.6.2 4.6.1 4.6.0 4.5.1 4.5.0 4.4.2 4.4.1 4.4.0 4.3.3 4.3.2 4.3.1 4.3.0 4.2.3 4.2.2 4.2.1 1.0.3 1.0.4 1.0.5 1.0.6 1.1.0 1.1.1 1.1.10 1.1.11 1.1.12 1.1.13 1.1.14 1.1.15 1.1.16 1.1.17 1.1.18 1.1.19 1.1.2 1.1.3 1.1.4 1.1.5 1.1.6 1.1.7 1.1.8 1.1.9 1.10.0 1.10.1 1.10.2 1.10.3 1.10.4 1.11.0 1.11.1 1.11.2 1.2.0 1.2.1 1.2.2 1.2.3 1.2.4 1.2.5 1.3.0 1.3.1 1.3.2 1.3.3 1.3.4 1.4.0 1.4.1 1.4.2 1.5.0 1.5.1 1.5.2 1.5.3 1.5.4 1.5.5 1.5.6 1.5.7 1.5.8 1.6.0 1.6.1 1.6.2 1.6.3 1.6.4 1.7.0 1.7.1 1.7.2 1.8.0 1.8.1 1.8.2 1.8.3 1.8.4 1.8.5 1.9.0 1.9.1 1.9.2 1.9.3 1.9.4 1.9.5 2.0.0 2.0.1 2.1.0 2.1.1 2.1.2 2.1.3 2.1.4 2.10.0 2.10.1 2.11.0 2.11.1 2.11.2 2.11.3 2.11.4 2.12.0 2.13.0 2.14.0 2.14.1 2.15.0 2.15.1 2.16.0 2.16.1 2.16.2 2.16.3 2.17.0 2.17.1 2.17.2 2.18.0 2.19.0 2.19.2 2.19.3 2.19.4 2.2.0 2.2.1 2.20.0 2.20.1 2.20.2 2.20.3 2.20.4 2.20.5 2.20.6 2.21.0 2.22.0 2.22.1 2.23.0 2.24.0 2.25.0 2.25.1 2.25.2 2.26.0 2.27.0 2.27.1 2.28.0 2.29.0 2.29.1 2.29.2 2.29.3 2.29.4 2.3.0 2.3.1 2.30.0 2.31.0 2.31.1 2.31.2 2.31.3 2.4.0 2.4.1 2.4.2 2.4.3 2.4.4 2.40.0 2.40.1 2.5.0 2.5.1 2.5.2 2.6.0 2.6.1 2.6.2 2.7.0 2.7.1 2.7.2 2.7.3 2.7.4 2.7.5 2.8.0 2.8.1 2.8.2 2.8.3 2.8.4 2.9.0 3.0.0 3.0.0-RC1 3.0.0-RC2 3.0.0-beta1 3.0.0-beta2 3.0.1 3.0.2 3.0.3 3.0.4 3.0.5 3.1.0 3.1.1 3.1.2 3.1.3 3.1.4 3.1.5 3.1.6 3.10.0 3.10.1 3.11.0 3.12.0 3.13.0 3.13.1 3.13.2 3.13.3 3.13.4 3.14.0 3.15.0 3.15.1 3.15.2 3.15.3 3.15.4 3.15.5 3.16.0 3.16.1 3.16.2 3.16.3 3.16.4 3.16.5 3.16.6 3.16.7 3.16.8 3.17.0 3.17.1 3.17.2 3.17.3 3.17.4 3.17.5 3.17.6 3.18.0 3.19.0 3.19.1 3.19.2 3.2.0 3.2.1 3.2.2 3.20.0 3.20.1 3.3.0 3.3.1 3.4.0 3.4.1 3.4.2 3.4.3 3.5.0 3.5.1 3.5.2 3.5.3 3.6.0 3.6.1 3.6.2 3.7.0 3.7.1 3.7.2 3.7.3 3.8.0 3.8.1 3.8.2 3.8.3 3.8.4 3.8.5 3.9.0 4.0.0 4.0.1 4.0.2 4.0.3 trunk 4.1.0 0.2.19.1 4.1.1 1.0.0 4.2.0 1.0.1 1.0.2
surecart / vendor / guzzlehttp / psr7 / src / MultipartStream.php
surecart / vendor / guzzlehttp / psr7 / src Last commit date
Exception 1 year ago AppendStream.php 1 year ago BufferStream.php 1 year ago CachingStream.php 1 year ago DroppingStream.php 1 year ago FnStream.php 1 year ago Header.php 1 year ago HttpFactory.php 1 year ago InflateStream.php 1 year ago LazyOpenStream.php 1 year ago LimitStream.php 1 year ago Message.php 1 year ago MessageTrait.php 1 year ago MimeType.php 1 year ago MultipartStream.php 1 year ago NoSeekStream.php 1 year ago PumpStream.php 1 year ago Query.php 1 year ago Request.php 1 year ago Response.php 1 year ago Rfc7230.php 1 year ago ServerRequest.php 1 year ago Stream.php 1 year ago StreamDecoratorTrait.php 1 year ago StreamWrapper.php 1 year ago UploadedFile.php 1 year ago Uri.php 1 year ago UriComparator.php 1 year ago UriNormalizer.php 1 year ago UriResolver.php 1 year ago Utils.php 1 year ago
MultipartStream.php
166 lines
1 <?php
2
3 declare(strict_types=1);
4
5 namespace SureCartVendors\GuzzleHttp\Psr7;
6
7 use SureCartVendors\Psr\Http\Message\StreamInterface;
8
9 /**
10 * Stream that when read returns bytes for a streaming multipart or
11 * multipart/form-data stream.
12 */
13 final class MultipartStream implements StreamInterface
14 {
15 use StreamDecoratorTrait;
16
17 /** @var string */
18 private $boundary;
19
20 /** @var StreamInterface */
21 private $stream;
22
23 /**
24 * @param array $elements Array of associative arrays, each containing a
25 * required "name" key mapping to the form field,
26 * name, a required "contents" key mapping to a
27 * StreamInterface/resource/string, an optional
28 * "headers" associative array of custom headers,
29 * and an optional "filename" key mapping to a
30 * string to send as the filename in the part.
31 * @param string $boundary You can optionally provide a specific boundary
32 *
33 * @throws \InvalidArgumentException
34 */
35 public function __construct(array $elements = [], ?string $boundary = null)
36 {
37 $this->boundary = $boundary ?: bin2hex(random_bytes(20));
38 $this->stream = $this->createStream($elements);
39 }
40
41 public function getBoundary(): string
42 {
43 return $this->boundary;
44 }
45
46 public function isWritable(): bool
47 {
48 return false;
49 }
50
51 /**
52 * Get the headers needed before transferring the content of a POST file
53 *
54 * @param string[] $headers
55 */
56 private function getHeaders(array $headers): string
57 {
58 $str = '';
59 foreach ($headers as $key => $value) {
60 $str .= "{$key}: {$value}\r\n";
61 }
62
63 return "--{$this->boundary}\r\n".trim($str)."\r\n\r\n";
64 }
65
66 /**
67 * Create the aggregate stream that will be used to upload the POST data
68 */
69 protected function createStream(array $elements = []): StreamInterface
70 {
71 $stream = new AppendStream();
72
73 foreach ($elements as $element) {
74 if (!is_array($element)) {
75 throw new \UnexpectedValueException('An array is expected');
76 }
77 $this->addElement($stream, $element);
78 }
79
80 // Add the trailing boundary with CRLF
81 $stream->addStream(Utils::streamFor("--{$this->boundary}--\r\n"));
82
83 return $stream;
84 }
85
86 private function addElement(AppendStream $stream, array $element): void
87 {
88 foreach (['contents', 'name'] as $key) {
89 if (!array_key_exists($key, $element)) {
90 throw new \InvalidArgumentException("A '{$key}' key is required");
91 }
92 }
93
94 $element['contents'] = Utils::streamFor($element['contents']);
95
96 if (empty($element['filename'])) {
97 $uri = $element['contents']->getMetadata('uri');
98 if ($uri && \is_string($uri) && \substr($uri, 0, 6) !== 'php://' && \substr($uri, 0, 7) !== 'data://') {
99 $element['filename'] = $uri;
100 }
101 }
102
103 [$body, $headers] = $this->createElement(
104 $element['name'],
105 $element['contents'],
106 $element['filename'] ?? null,
107 $element['headers'] ?? []
108 );
109
110 $stream->addStream(Utils::streamFor($this->getHeaders($headers)));
111 $stream->addStream($body);
112 $stream->addStream(Utils::streamFor("\r\n"));
113 }
114
115 /**
116 * @param string[] $headers
117 *
118 * @return array{0: StreamInterface, 1: string[]}
119 */
120 private function createElement(string $name, StreamInterface $stream, ?string $filename, array $headers): array
121 {
122 // Set a default content-disposition header if one was no provided
123 $disposition = self::getHeader($headers, 'content-disposition');
124 if (!$disposition) {
125 $headers['Content-Disposition'] = ($filename === '0' || $filename)
126 ? sprintf(
127 'form-data; name="%s"; filename="%s"',
128 $name,
129 basename($filename)
130 )
131 : "form-data; name=\"{$name}\"";
132 }
133
134 // Set a default content-length header if one was no provided
135 $length = self::getHeader($headers, 'content-length');
136 if (!$length) {
137 if ($length = $stream->getSize()) {
138 $headers['Content-Length'] = (string) $length;
139 }
140 }
141
142 // Set a default Content-Type if one was not supplied
143 $type = self::getHeader($headers, 'content-type');
144 if (!$type && ($filename === '0' || $filename)) {
145 $headers['Content-Type'] = MimeType::fromFilename($filename) ?? 'application/octet-stream';
146 }
147
148 return [$stream, $headers];
149 }
150
151 /**
152 * @param string[] $headers
153 */
154 private static function getHeader(array $headers, string $key): ?string
155 {
156 $lowercaseHeader = strtolower($key);
157 foreach ($headers as $k => $v) {
158 if (strtolower((string) $k) === $lowercaseHeader) {
159 return $v;
160 }
161 }
162
163 return null;
164 }
165 }
166