Completed
Pull Request — master (#359)
by Maxence
41s
created
lib/Vendor/GuzzleHttp/Psr7/Response.php 3 patches
Indentation   +146 added lines, -146 removed lines patch added patch discarded remove patch
@@ -12,150 +12,150 @@
 block discarded – undo
12 12
  */
13 13
 class Response implements ResponseInterface
14 14
 {
15
-    use MessageTrait;
16
-
17
-    /** Map of standard HTTP status code/reason phrases */
18
-    private const PHRASES = [
19
-        100 => 'Continue',
20
-        101 => 'Switching Protocols',
21
-        102 => 'Processing',
22
-        200 => 'OK',
23
-        201 => 'Created',
24
-        202 => 'Accepted',
25
-        203 => 'Non-Authoritative Information',
26
-        204 => 'No Content',
27
-        205 => 'Reset Content',
28
-        206 => 'Partial Content',
29
-        207 => 'Multi-status',
30
-        208 => 'Already Reported',
31
-        300 => 'Multiple Choices',
32
-        301 => 'Moved Permanently',
33
-        302 => 'Found',
34
-        303 => 'See Other',
35
-        304 => 'Not Modified',
36
-        305 => 'Use Proxy',
37
-        306 => 'Switch Proxy',
38
-        307 => 'Temporary Redirect',
39
-        308 => 'Permanent Redirect',
40
-        400 => 'Bad Request',
41
-        401 => 'Unauthorized',
42
-        402 => 'Payment Required',
43
-        403 => 'Forbidden',
44
-        404 => 'Not Found',
45
-        405 => 'Method Not Allowed',
46
-        406 => 'Not Acceptable',
47
-        407 => 'Proxy Authentication Required',
48
-        408 => 'Request Time-out',
49
-        409 => 'Conflict',
50
-        410 => 'Gone',
51
-        411 => 'Length Required',
52
-        412 => 'Precondition Failed',
53
-        413 => 'Request Entity Too Large',
54
-        414 => 'Request-URI Too Large',
55
-        415 => 'Unsupported Media Type',
56
-        416 => 'Requested range not satisfiable',
57
-        417 => 'Expectation Failed',
58
-        418 => 'I\'m a teapot',
59
-        422 => 'Unprocessable Entity',
60
-        423 => 'Locked',
61
-        424 => 'Failed Dependency',
62
-        425 => 'Unordered Collection',
63
-        426 => 'Upgrade Required',
64
-        428 => 'Precondition Required',
65
-        429 => 'Too Many Requests',
66
-        431 => 'Request Header Fields Too Large',
67
-        451 => 'Unavailable For Legal Reasons',
68
-        500 => 'Internal Server Error',
69
-        501 => 'Not Implemented',
70
-        502 => 'Bad Gateway',
71
-        503 => 'Service Unavailable',
72
-        504 => 'Gateway Time-out',
73
-        505 => 'HTTP Version not supported',
74
-        506 => 'Variant Also Negotiates',
75
-        507 => 'Insufficient Storage',
76
-        508 => 'Loop Detected',
77
-        510 => 'Not Extended',
78
-        511 => 'Network Authentication Required',
79
-    ];
80
-
81
-    /** @var string */
82
-    private $reasonPhrase;
83
-
84
-    /** @var int */
85
-    private $statusCode;
86
-
87
-    /**
88
-     * @param int                                  $status  Status code
89
-     * @param (string|string[])[]                  $headers Response headers
90
-     * @param string|resource|StreamInterface|null $body    Response body
91
-     * @param string                               $version Protocol version
92
-     * @param string|null                          $reason  Reason phrase (when empty a default will be used based on the status code)
93
-     */
94
-    public function __construct(
95
-        int $status = 200,
96
-        array $headers = [],
97
-        $body = null,
98
-        string $version = '1.1',
99
-        string $reason = null
100
-    ) {
101
-        $this->assertStatusCodeRange($status);
102
-
103
-        $this->statusCode = $status;
104
-
105
-        if ($body !== '' && $body !== null) {
106
-            $this->stream = Utils::streamFor($body);
107
-        }
108
-
109
-        $this->setHeaders($headers);
110
-        if ($reason == '' && isset(self::PHRASES[$this->statusCode])) {
111
-            $this->reasonPhrase = self::PHRASES[$this->statusCode];
112
-        } else {
113
-            $this->reasonPhrase = (string) $reason;
114
-        }
115
-
116
-        $this->protocol = $version;
117
-    }
118
-
119
-    public function getStatusCode(): int
120
-    {
121
-        return $this->statusCode;
122
-    }
123
-
124
-    public function getReasonPhrase(): string
125
-    {
126
-        return $this->reasonPhrase;
127
-    }
128
-
129
-    public function withStatus($code, $reasonPhrase = ''): ResponseInterface
130
-    {
131
-        $this->assertStatusCodeIsInteger($code);
132
-        $code = (int) $code;
133
-        $this->assertStatusCodeRange($code);
134
-
135
-        $new = clone $this;
136
-        $new->statusCode = $code;
137
-        if ($reasonPhrase == '' && isset(self::PHRASES[$new->statusCode])) {
138
-            $reasonPhrase = self::PHRASES[$new->statusCode];
139
-        }
140
-        $new->reasonPhrase = (string) $reasonPhrase;
141
-
142
-        return $new;
143
-    }
144
-
145
-    /**
146
-     * @param mixed $statusCode
147
-     */
148
-    private function assertStatusCodeIsInteger($statusCode): void
149
-    {
150
-        if (filter_var($statusCode, FILTER_VALIDATE_INT) === false) {
151
-            throw new \InvalidArgumentException('Status code must be an integer value.');
152
-        }
153
-    }
154
-
155
-    private function assertStatusCodeRange(int $statusCode): void
156
-    {
157
-        if ($statusCode < 100 || $statusCode >= 600) {
158
-            throw new \InvalidArgumentException('Status code must be an integer value between 1xx and 5xx.');
159
-        }
160
-    }
15
+	use MessageTrait;
16
+
17
+	/** Map of standard HTTP status code/reason phrases */
18
+	private const PHRASES = [
19
+		100 => 'Continue',
20
+		101 => 'Switching Protocols',
21
+		102 => 'Processing',
22
+		200 => 'OK',
23
+		201 => 'Created',
24
+		202 => 'Accepted',
25
+		203 => 'Non-Authoritative Information',
26
+		204 => 'No Content',
27
+		205 => 'Reset Content',
28
+		206 => 'Partial Content',
29
+		207 => 'Multi-status',
30
+		208 => 'Already Reported',
31
+		300 => 'Multiple Choices',
32
+		301 => 'Moved Permanently',
33
+		302 => 'Found',
34
+		303 => 'See Other',
35
+		304 => 'Not Modified',
36
+		305 => 'Use Proxy',
37
+		306 => 'Switch Proxy',
38
+		307 => 'Temporary Redirect',
39
+		308 => 'Permanent Redirect',
40
+		400 => 'Bad Request',
41
+		401 => 'Unauthorized',
42
+		402 => 'Payment Required',
43
+		403 => 'Forbidden',
44
+		404 => 'Not Found',
45
+		405 => 'Method Not Allowed',
46
+		406 => 'Not Acceptable',
47
+		407 => 'Proxy Authentication Required',
48
+		408 => 'Request Time-out',
49
+		409 => 'Conflict',
50
+		410 => 'Gone',
51
+		411 => 'Length Required',
52
+		412 => 'Precondition Failed',
53
+		413 => 'Request Entity Too Large',
54
+		414 => 'Request-URI Too Large',
55
+		415 => 'Unsupported Media Type',
56
+		416 => 'Requested range not satisfiable',
57
+		417 => 'Expectation Failed',
58
+		418 => 'I\'m a teapot',
59
+		422 => 'Unprocessable Entity',
60
+		423 => 'Locked',
61
+		424 => 'Failed Dependency',
62
+		425 => 'Unordered Collection',
63
+		426 => 'Upgrade Required',
64
+		428 => 'Precondition Required',
65
+		429 => 'Too Many Requests',
66
+		431 => 'Request Header Fields Too Large',
67
+		451 => 'Unavailable For Legal Reasons',
68
+		500 => 'Internal Server Error',
69
+		501 => 'Not Implemented',
70
+		502 => 'Bad Gateway',
71
+		503 => 'Service Unavailable',
72
+		504 => 'Gateway Time-out',
73
+		505 => 'HTTP Version not supported',
74
+		506 => 'Variant Also Negotiates',
75
+		507 => 'Insufficient Storage',
76
+		508 => 'Loop Detected',
77
+		510 => 'Not Extended',
78
+		511 => 'Network Authentication Required',
79
+	];
80
+
81
+	/** @var string */
82
+	private $reasonPhrase;
83
+
84
+	/** @var int */
85
+	private $statusCode;
86
+
87
+	/**
88
+	 * @param int                                  $status  Status code
89
+	 * @param (string|string[])[]                  $headers Response headers
90
+	 * @param string|resource|StreamInterface|null $body    Response body
91
+	 * @param string                               $version Protocol version
92
+	 * @param string|null                          $reason  Reason phrase (when empty a default will be used based on the status code)
93
+	 */
94
+	public function __construct(
95
+		int $status = 200,
96
+		array $headers = [],
97
+		$body = null,
98
+		string $version = '1.1',
99
+		string $reason = null
100
+	) {
101
+		$this->assertStatusCodeRange($status);
102
+
103
+		$this->statusCode = $status;
104
+
105
+		if ($body !== '' && $body !== null) {
106
+			$this->stream = Utils::streamFor($body);
107
+		}
108
+
109
+		$this->setHeaders($headers);
110
+		if ($reason == '' && isset(self::PHRASES[$this->statusCode])) {
111
+			$this->reasonPhrase = self::PHRASES[$this->statusCode];
112
+		} else {
113
+			$this->reasonPhrase = (string) $reason;
114
+		}
115
+
116
+		$this->protocol = $version;
117
+	}
118
+
119
+	public function getStatusCode(): int
120
+	{
121
+		return $this->statusCode;
122
+	}
123
+
124
+	public function getReasonPhrase(): string
125
+	{
126
+		return $this->reasonPhrase;
127
+	}
128
+
129
+	public function withStatus($code, $reasonPhrase = ''): ResponseInterface
130
+	{
131
+		$this->assertStatusCodeIsInteger($code);
132
+		$code = (int) $code;
133
+		$this->assertStatusCodeRange($code);
134
+
135
+		$new = clone $this;
136
+		$new->statusCode = $code;
137
+		if ($reasonPhrase == '' && isset(self::PHRASES[$new->statusCode])) {
138
+			$reasonPhrase = self::PHRASES[$new->statusCode];
139
+		}
140
+		$new->reasonPhrase = (string) $reasonPhrase;
141
+
142
+		return $new;
143
+	}
144
+
145
+	/**
146
+	 * @param mixed $statusCode
147
+	 */
148
+	private function assertStatusCodeIsInteger($statusCode): void
149
+	{
150
+		if (filter_var($statusCode, FILTER_VALIDATE_INT) === false) {
151
+			throw new \InvalidArgumentException('Status code must be an integer value.');
152
+		}
153
+	}
154
+
155
+	private function assertStatusCodeRange(int $statusCode): void
156
+	{
157
+		if ($statusCode < 100 || $statusCode >= 600) {
158
+			throw new \InvalidArgumentException('Status code must be an integer value between 1xx and 5xx.');
159
+		}
160
+	}
161 161
 }
Please login to merge, or discard this patch.
Spacing   +3 added lines, -3 removed lines patch added patch discarded remove patch
@@ -110,7 +110,7 @@  discard block
 block discarded – undo
110 110
         if ($reason == '' && isset(self::PHRASES[$this->statusCode])) {
111 111
             $this->reasonPhrase = self::PHRASES[$this->statusCode];
112 112
         } else {
113
-            $this->reasonPhrase = (string) $reason;
113
+            $this->reasonPhrase = (string)$reason;
114 114
         }
115 115
 
116 116
         $this->protocol = $version;
@@ -129,7 +129,7 @@  discard block
 block discarded – undo
129 129
     public function withStatus($code, $reasonPhrase = ''): ResponseInterface
130 130
     {
131 131
         $this->assertStatusCodeIsInteger($code);
132
-        $code = (int) $code;
132
+        $code = (int)$code;
133 133
         $this->assertStatusCodeRange($code);
134 134
 
135 135
         $new = clone $this;
@@ -137,7 +137,7 @@  discard block
 block discarded – undo
137 137
         if ($reasonPhrase == '' && isset(self::PHRASES[$new->statusCode])) {
138 138
             $reasonPhrase = self::PHRASES[$new->statusCode];
139 139
         }
140
-        $new->reasonPhrase = (string) $reasonPhrase;
140
+        $new->reasonPhrase = (string)$reasonPhrase;
141 141
 
142 142
         return $new;
143 143
     }
Please login to merge, or discard this patch.
Braces   +1 added lines, -2 removed lines patch added patch discarded remove patch
@@ -10,8 +10,7 @@
 block discarded – undo
10 10
 /**
11 11
  * PSR-7 response implementation.
12 12
  */
13
-class Response implements ResponseInterface
14
-{
13
+class Response implements ResponseInterface {
15 14
     use MessageTrait;
16 15
 
17 16
     /** Map of standard HTTP status code/reason phrases */
Please login to merge, or discard this patch.
lib/Vendor/GuzzleHttp/Psr7/StreamDecoratorTrait.php 3 patches
Indentation   +140 added lines, -140 removed lines patch added patch discarded remove patch
@@ -13,144 +13,144 @@
 block discarded – undo
13 13
  */
14 14
 trait StreamDecoratorTrait
15 15
 {
16
-    /**
17
-     * @param StreamInterface $stream Stream to decorate
18
-     */
19
-    public function __construct(StreamInterface $stream)
20
-    {
21
-        $this->stream = $stream;
22
-    }
23
-
24
-    /**
25
-     * Magic method used to create a new stream if streams are not added in
26
-     * the constructor of a decorator (e.g., LazyOpenStream).
27
-     *
28
-     * @return StreamInterface
29
-     */
30
-    public function __get(string $name)
31
-    {
32
-        if ($name === 'stream') {
33
-            $this->stream = $this->createStream();
34
-
35
-            return $this->stream;
36
-        }
37
-
38
-        throw new \UnexpectedValueException("$name not found on class");
39
-    }
40
-
41
-    public function __toString(): string
42
-    {
43
-        try {
44
-            if ($this->isSeekable()) {
45
-                $this->seek(0);
46
-            }
47
-
48
-            return $this->getContents();
49
-        } catch (\Throwable $e) {
50
-            if (\PHP_VERSION_ID >= 70400) {
51
-                throw $e;
52
-            }
53
-            trigger_error(sprintf('%s::__toString exception: %s', self::class, (string) $e), E_USER_ERROR);
54
-
55
-            return '';
56
-        }
57
-    }
58
-
59
-    public function getContents(): string
60
-    {
61
-        return Utils::copyToString($this);
62
-    }
63
-
64
-    /**
65
-     * Allow decorators to implement custom methods
66
-     *
67
-     * @return mixed
68
-     */
69
-    public function __call(string $method, array $args)
70
-    {
71
-        /** @var callable $callable */
72
-        $callable = [$this->stream, $method];
73
-        $result = ($callable)(...$args);
74
-
75
-        // Always return the wrapped object if the result is a return $this
76
-        return $result === $this->stream ? $this : $result;
77
-    }
78
-
79
-    public function close(): void
80
-    {
81
-        $this->stream->close();
82
-    }
83
-
84
-    /**
85
-     * @return mixed
86
-     */
87
-    public function getMetadata($key = null)
88
-    {
89
-        return $this->stream->getMetadata($key);
90
-    }
91
-
92
-    public function detach()
93
-    {
94
-        return $this->stream->detach();
95
-    }
96
-
97
-    public function getSize(): ?int
98
-    {
99
-        return $this->stream->getSize();
100
-    }
101
-
102
-    public function eof(): bool
103
-    {
104
-        return $this->stream->eof();
105
-    }
106
-
107
-    public function tell(): int
108
-    {
109
-        return $this->stream->tell();
110
-    }
111
-
112
-    public function isReadable(): bool
113
-    {
114
-        return $this->stream->isReadable();
115
-    }
116
-
117
-    public function isWritable(): bool
118
-    {
119
-        return $this->stream->isWritable();
120
-    }
121
-
122
-    public function isSeekable(): bool
123
-    {
124
-        return $this->stream->isSeekable();
125
-    }
126
-
127
-    public function rewind(): void
128
-    {
129
-        $this->seek(0);
130
-    }
131
-
132
-    public function seek($offset, $whence = SEEK_SET): void
133
-    {
134
-        $this->stream->seek($offset, $whence);
135
-    }
136
-
137
-    public function read($length): string
138
-    {
139
-        return $this->stream->read($length);
140
-    }
141
-
142
-    public function write($string): int
143
-    {
144
-        return $this->stream->write($string);
145
-    }
146
-
147
-    /**
148
-     * Implement in subclasses to dynamically create streams when requested.
149
-     *
150
-     * @throws \BadMethodCallException
151
-     */
152
-    protected function createStream(): StreamInterface
153
-    {
154
-        throw new \BadMethodCallException('Not implemented');
155
-    }
16
+	/**
17
+	 * @param StreamInterface $stream Stream to decorate
18
+	 */
19
+	public function __construct(StreamInterface $stream)
20
+	{
21
+		$this->stream = $stream;
22
+	}
23
+
24
+	/**
25
+	 * Magic method used to create a new stream if streams are not added in
26
+	 * the constructor of a decorator (e.g., LazyOpenStream).
27
+	 *
28
+	 * @return StreamInterface
29
+	 */
30
+	public function __get(string $name)
31
+	{
32
+		if ($name === 'stream') {
33
+			$this->stream = $this->createStream();
34
+
35
+			return $this->stream;
36
+		}
37
+
38
+		throw new \UnexpectedValueException("$name not found on class");
39
+	}
40
+
41
+	public function __toString(): string
42
+	{
43
+		try {
44
+			if ($this->isSeekable()) {
45
+				$this->seek(0);
46
+			}
47
+
48
+			return $this->getContents();
49
+		} catch (\Throwable $e) {
50
+			if (\PHP_VERSION_ID >= 70400) {
51
+				throw $e;
52
+			}
53
+			trigger_error(sprintf('%s::__toString exception: %s', self::class, (string) $e), E_USER_ERROR);
54
+
55
+			return '';
56
+		}
57
+	}
58
+
59
+	public function getContents(): string
60
+	{
61
+		return Utils::copyToString($this);
62
+	}
63
+
64
+	/**
65
+	 * Allow decorators to implement custom methods
66
+	 *
67
+	 * @return mixed
68
+	 */
69
+	public function __call(string $method, array $args)
70
+	{
71
+		/** @var callable $callable */
72
+		$callable = [$this->stream, $method];
73
+		$result = ($callable)(...$args);
74
+
75
+		// Always return the wrapped object if the result is a return $this
76
+		return $result === $this->stream ? $this : $result;
77
+	}
78
+
79
+	public function close(): void
80
+	{
81
+		$this->stream->close();
82
+	}
83
+
84
+	/**
85
+	 * @return mixed
86
+	 */
87
+	public function getMetadata($key = null)
88
+	{
89
+		return $this->stream->getMetadata($key);
90
+	}
91
+
92
+	public function detach()
93
+	{
94
+		return $this->stream->detach();
95
+	}
96
+
97
+	public function getSize(): ?int
98
+	{
99
+		return $this->stream->getSize();
100
+	}
101
+
102
+	public function eof(): bool
103
+	{
104
+		return $this->stream->eof();
105
+	}
106
+
107
+	public function tell(): int
108
+	{
109
+		return $this->stream->tell();
110
+	}
111
+
112
+	public function isReadable(): bool
113
+	{
114
+		return $this->stream->isReadable();
115
+	}
116
+
117
+	public function isWritable(): bool
118
+	{
119
+		return $this->stream->isWritable();
120
+	}
121
+
122
+	public function isSeekable(): bool
123
+	{
124
+		return $this->stream->isSeekable();
125
+	}
126
+
127
+	public function rewind(): void
128
+	{
129
+		$this->seek(0);
130
+	}
131
+
132
+	public function seek($offset, $whence = SEEK_SET): void
133
+	{
134
+		$this->stream->seek($offset, $whence);
135
+	}
136
+
137
+	public function read($length): string
138
+	{
139
+		return $this->stream->read($length);
140
+	}
141
+
142
+	public function write($string): int
143
+	{
144
+		return $this->stream->write($string);
145
+	}
146
+
147
+	/**
148
+	 * Implement in subclasses to dynamically create streams when requested.
149
+	 *
150
+	 * @throws \BadMethodCallException
151
+	 */
152
+	protected function createStream(): StreamInterface
153
+	{
154
+		throw new \BadMethodCallException('Not implemented');
155
+	}
156 156
 }
Please login to merge, or discard this patch.
Spacing   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -50,7 +50,7 @@
 block discarded – undo
50 50
             if (\PHP_VERSION_ID >= 70400) {
51 51
                 throw $e;
52 52
             }
53
-            trigger_error(sprintf('%s::__toString exception: %s', self::class, (string) $e), E_USER_ERROR);
53
+            trigger_error(sprintf('%s::__toString exception: %s', self::class, (string)$e), E_USER_ERROR);
54 54
 
55 55
             return '';
56 56
         }
Please login to merge, or discard this patch.
Braces   +1 added lines, -2 removed lines patch added patch discarded remove patch
@@ -11,8 +11,7 @@
 block discarded – undo
11 11
  *
12 12
  * @property StreamInterface $stream
13 13
  */
14
-trait StreamDecoratorTrait
15
-{
14
+trait StreamDecoratorTrait {
16 15
     /**
17 16
      * @param StreamInterface $stream Stream to decorate
18 17
      */
Please login to merge, or discard this patch.
lib/Vendor/GuzzleHttp/Psr7/MessageTrait.php 3 patches
Indentation   +250 added lines, -250 removed lines patch added patch discarded remove patch
@@ -12,254 +12,254 @@
 block discarded – undo
12 12
  */
13 13
 trait MessageTrait
14 14
 {
15
-    /** @var string[][] Map of all registered headers, as original name => array of values */
16
-    private $headers = [];
17
-
18
-    /** @var string[] Map of lowercase header name => original name at registration */
19
-    private $headerNames = [];
20
-
21
-    /** @var string */
22
-    private $protocol = '1.1';
23
-
24
-    /** @var StreamInterface|null */
25
-    private $stream;
26
-
27
-    public function getProtocolVersion(): string
28
-    {
29
-        return $this->protocol;
30
-    }
31
-
32
-    public function withProtocolVersion($version): MessageInterface
33
-    {
34
-        if ($this->protocol === $version) {
35
-            return $this;
36
-        }
37
-
38
-        $new = clone $this;
39
-        $new->protocol = $version;
40
-
41
-        return $new;
42
-    }
43
-
44
-    public function getHeaders(): array
45
-    {
46
-        return $this->headers;
47
-    }
48
-
49
-    public function hasHeader($header): bool
50
-    {
51
-        return isset($this->headerNames[strtolower($header)]);
52
-    }
53
-
54
-    public function getHeader($header): array
55
-    {
56
-        $header = strtolower($header);
57
-
58
-        if (!isset($this->headerNames[$header])) {
59
-            return [];
60
-        }
61
-
62
-        $header = $this->headerNames[$header];
63
-
64
-        return $this->headers[$header];
65
-    }
66
-
67
-    public function getHeaderLine($header): string
68
-    {
69
-        return implode(', ', $this->getHeader($header));
70
-    }
71
-
72
-    public function withHeader($header, $value): MessageInterface
73
-    {
74
-        $this->assertHeader($header);
75
-        $value = $this->normalizeHeaderValue($value);
76
-        $normalized = strtolower($header);
77
-
78
-        $new = clone $this;
79
-        if (isset($new->headerNames[$normalized])) {
80
-            unset($new->headers[$new->headerNames[$normalized]]);
81
-        }
82
-        $new->headerNames[$normalized] = $header;
83
-        $new->headers[$header] = $value;
84
-
85
-        return $new;
86
-    }
87
-
88
-    public function withAddedHeader($header, $value): MessageInterface
89
-    {
90
-        $this->assertHeader($header);
91
-        $value = $this->normalizeHeaderValue($value);
92
-        $normalized = strtolower($header);
93
-
94
-        $new = clone $this;
95
-        if (isset($new->headerNames[$normalized])) {
96
-            $header = $this->headerNames[$normalized];
97
-            $new->headers[$header] = array_merge($this->headers[$header], $value);
98
-        } else {
99
-            $new->headerNames[$normalized] = $header;
100
-            $new->headers[$header] = $value;
101
-        }
102
-
103
-        return $new;
104
-    }
105
-
106
-    public function withoutHeader($header): MessageInterface
107
-    {
108
-        $normalized = strtolower($header);
109
-
110
-        if (!isset($this->headerNames[$normalized])) {
111
-            return $this;
112
-        }
113
-
114
-        $header = $this->headerNames[$normalized];
115
-
116
-        $new = clone $this;
117
-        unset($new->headers[$header], $new->headerNames[$normalized]);
118
-
119
-        return $new;
120
-    }
121
-
122
-    public function getBody(): StreamInterface
123
-    {
124
-        if (!$this->stream) {
125
-            $this->stream = Utils::streamFor('');
126
-        }
127
-
128
-        return $this->stream;
129
-    }
130
-
131
-    public function withBody(StreamInterface $body): MessageInterface
132
-    {
133
-        if ($body === $this->stream) {
134
-            return $this;
135
-        }
136
-
137
-        $new = clone $this;
138
-        $new->stream = $body;
139
-
140
-        return $new;
141
-    }
142
-
143
-    /**
144
-     * @param (string|string[])[] $headers
145
-     */
146
-    private function setHeaders(array $headers): void
147
-    {
148
-        $this->headerNames = $this->headers = [];
149
-        foreach ($headers as $header => $value) {
150
-            // Numeric array keys are converted to int by PHP.
151
-            $header = (string) $header;
152
-
153
-            $this->assertHeader($header);
154
-            $value = $this->normalizeHeaderValue($value);
155
-            $normalized = strtolower($header);
156
-            if (isset($this->headerNames[$normalized])) {
157
-                $header = $this->headerNames[$normalized];
158
-                $this->headers[$header] = array_merge($this->headers[$header], $value);
159
-            } else {
160
-                $this->headerNames[$normalized] = $header;
161
-                $this->headers[$header] = $value;
162
-            }
163
-        }
164
-    }
165
-
166
-    /**
167
-     * @param mixed $value
168
-     *
169
-     * @return string[]
170
-     */
171
-    private function normalizeHeaderValue($value): array
172
-    {
173
-        if (!is_array($value)) {
174
-            return $this->trimAndValidateHeaderValues([$value]);
175
-        }
176
-
177
-        if (count($value) === 0) {
178
-            throw new \InvalidArgumentException('Header value can not be an empty array.');
179
-        }
180
-
181
-        return $this->trimAndValidateHeaderValues($value);
182
-    }
183
-
184
-    /**
185
-     * Trims whitespace from the header values.
186
-     *
187
-     * Spaces and tabs ought to be excluded by parsers when extracting the field value from a header field.
188
-     *
189
-     * header-field = field-name ":" OWS field-value OWS
190
-     * OWS          = *( SP / HTAB )
191
-     *
192
-     * @param mixed[] $values Header values
193
-     *
194
-     * @return string[] Trimmed header values
195
-     *
196
-     * @see https://datatracker.ietf.org/doc/html/rfc7230#section-3.2.4
197
-     */
198
-    private function trimAndValidateHeaderValues(array $values): array
199
-    {
200
-        return array_map(function ($value) {
201
-            if (!is_scalar($value) && null !== $value) {
202
-                throw new \InvalidArgumentException(sprintf(
203
-                    'Header value must be scalar or null but %s provided.',
204
-                    is_object($value) ? get_class($value) : gettype($value)
205
-                ));
206
-            }
207
-
208
-            $trimmed = trim((string) $value, " \t");
209
-            $this->assertValue($trimmed);
210
-
211
-            return $trimmed;
212
-        }, array_values($values));
213
-    }
214
-
215
-    /**
216
-     * @see https://datatracker.ietf.org/doc/html/rfc7230#section-3.2
217
-     *
218
-     * @param mixed $header
219
-     */
220
-    private function assertHeader($header): void
221
-    {
222
-        if (!is_string($header)) {
223
-            throw new \InvalidArgumentException(sprintf(
224
-                'Header name must be a string but %s provided.',
225
-                is_object($header) ? get_class($header) : gettype($header)
226
-            ));
227
-        }
228
-
229
-        if (!preg_match('/^[a-zA-Z0-9\'`#$%&*+.^_|~!-]+$/D', $header)) {
230
-            throw new \InvalidArgumentException(
231
-                sprintf('"%s" is not valid header name.', $header)
232
-            );
233
-        }
234
-    }
235
-
236
-    /**
237
-     * @see https://datatracker.ietf.org/doc/html/rfc7230#section-3.2
238
-     *
239
-     * field-value    = *( field-content / obs-fold )
240
-     * field-content  = field-vchar [ 1*( SP / HTAB ) field-vchar ]
241
-     * field-vchar    = VCHAR / obs-text
242
-     * VCHAR          = %x21-7E
243
-     * obs-text       = %x80-FF
244
-     * obs-fold       = CRLF 1*( SP / HTAB )
245
-     */
246
-    private function assertValue(string $value): void
247
-    {
248
-        // The regular expression intentionally does not support the obs-fold production, because as
249
-        // per RFC 7230#3.2.4:
250
-        //
251
-        // A sender MUST NOT generate a message that includes
252
-        // line folding (i.e., that has any field-value that contains a match to
253
-        // the obs-fold rule) unless the message is intended for packaging
254
-        // within the message/http media type.
255
-        //
256
-        // Clients must not send a request with line folding and a server sending folded headers is
257
-        // likely very rare. Line folding is a fairly obscure feature of HTTP/1.1 and thus not accepting
258
-        // folding is not likely to break any legitimate use case.
259
-        if (!preg_match('/^[\x20\x09\x21-\x7E\x80-\xFF]*$/D', $value)) {
260
-            throw new \InvalidArgumentException(
261
-                sprintf('"%s" is not valid header value.', $value)
262
-            );
263
-        }
264
-    }
15
+	/** @var string[][] Map of all registered headers, as original name => array of values */
16
+	private $headers = [];
17
+
18
+	/** @var string[] Map of lowercase header name => original name at registration */
19
+	private $headerNames = [];
20
+
21
+	/** @var string */
22
+	private $protocol = '1.1';
23
+
24
+	/** @var StreamInterface|null */
25
+	private $stream;
26
+
27
+	public function getProtocolVersion(): string
28
+	{
29
+		return $this->protocol;
30
+	}
31
+
32
+	public function withProtocolVersion($version): MessageInterface
33
+	{
34
+		if ($this->protocol === $version) {
35
+			return $this;
36
+		}
37
+
38
+		$new = clone $this;
39
+		$new->protocol = $version;
40
+
41
+		return $new;
42
+	}
43
+
44
+	public function getHeaders(): array
45
+	{
46
+		return $this->headers;
47
+	}
48
+
49
+	public function hasHeader($header): bool
50
+	{
51
+		return isset($this->headerNames[strtolower($header)]);
52
+	}
53
+
54
+	public function getHeader($header): array
55
+	{
56
+		$header = strtolower($header);
57
+
58
+		if (!isset($this->headerNames[$header])) {
59
+			return [];
60
+		}
61
+
62
+		$header = $this->headerNames[$header];
63
+
64
+		return $this->headers[$header];
65
+	}
66
+
67
+	public function getHeaderLine($header): string
68
+	{
69
+		return implode(', ', $this->getHeader($header));
70
+	}
71
+
72
+	public function withHeader($header, $value): MessageInterface
73
+	{
74
+		$this->assertHeader($header);
75
+		$value = $this->normalizeHeaderValue($value);
76
+		$normalized = strtolower($header);
77
+
78
+		$new = clone $this;
79
+		if (isset($new->headerNames[$normalized])) {
80
+			unset($new->headers[$new->headerNames[$normalized]]);
81
+		}
82
+		$new->headerNames[$normalized] = $header;
83
+		$new->headers[$header] = $value;
84
+
85
+		return $new;
86
+	}
87
+
88
+	public function withAddedHeader($header, $value): MessageInterface
89
+	{
90
+		$this->assertHeader($header);
91
+		$value = $this->normalizeHeaderValue($value);
92
+		$normalized = strtolower($header);
93
+
94
+		$new = clone $this;
95
+		if (isset($new->headerNames[$normalized])) {
96
+			$header = $this->headerNames[$normalized];
97
+			$new->headers[$header] = array_merge($this->headers[$header], $value);
98
+		} else {
99
+			$new->headerNames[$normalized] = $header;
100
+			$new->headers[$header] = $value;
101
+		}
102
+
103
+		return $new;
104
+	}
105
+
106
+	public function withoutHeader($header): MessageInterface
107
+	{
108
+		$normalized = strtolower($header);
109
+
110
+		if (!isset($this->headerNames[$normalized])) {
111
+			return $this;
112
+		}
113
+
114
+		$header = $this->headerNames[$normalized];
115
+
116
+		$new = clone $this;
117
+		unset($new->headers[$header], $new->headerNames[$normalized]);
118
+
119
+		return $new;
120
+	}
121
+
122
+	public function getBody(): StreamInterface
123
+	{
124
+		if (!$this->stream) {
125
+			$this->stream = Utils::streamFor('');
126
+		}
127
+
128
+		return $this->stream;
129
+	}
130
+
131
+	public function withBody(StreamInterface $body): MessageInterface
132
+	{
133
+		if ($body === $this->stream) {
134
+			return $this;
135
+		}
136
+
137
+		$new = clone $this;
138
+		$new->stream = $body;
139
+
140
+		return $new;
141
+	}
142
+
143
+	/**
144
+	 * @param (string|string[])[] $headers
145
+	 */
146
+	private function setHeaders(array $headers): void
147
+	{
148
+		$this->headerNames = $this->headers = [];
149
+		foreach ($headers as $header => $value) {
150
+			// Numeric array keys are converted to int by PHP.
151
+			$header = (string) $header;
152
+
153
+			$this->assertHeader($header);
154
+			$value = $this->normalizeHeaderValue($value);
155
+			$normalized = strtolower($header);
156
+			if (isset($this->headerNames[$normalized])) {
157
+				$header = $this->headerNames[$normalized];
158
+				$this->headers[$header] = array_merge($this->headers[$header], $value);
159
+			} else {
160
+				$this->headerNames[$normalized] = $header;
161
+				$this->headers[$header] = $value;
162
+			}
163
+		}
164
+	}
165
+
166
+	/**
167
+	 * @param mixed $value
168
+	 *
169
+	 * @return string[]
170
+	 */
171
+	private function normalizeHeaderValue($value): array
172
+	{
173
+		if (!is_array($value)) {
174
+			return $this->trimAndValidateHeaderValues([$value]);
175
+		}
176
+
177
+		if (count($value) === 0) {
178
+			throw new \InvalidArgumentException('Header value can not be an empty array.');
179
+		}
180
+
181
+		return $this->trimAndValidateHeaderValues($value);
182
+	}
183
+
184
+	/**
185
+	 * Trims whitespace from the header values.
186
+	 *
187
+	 * Spaces and tabs ought to be excluded by parsers when extracting the field value from a header field.
188
+	 *
189
+	 * header-field = field-name ":" OWS field-value OWS
190
+	 * OWS          = *( SP / HTAB )
191
+	 *
192
+	 * @param mixed[] $values Header values
193
+	 *
194
+	 * @return string[] Trimmed header values
195
+	 *
196
+	 * @see https://datatracker.ietf.org/doc/html/rfc7230#section-3.2.4
197
+	 */
198
+	private function trimAndValidateHeaderValues(array $values): array
199
+	{
200
+		return array_map(function ($value) {
201
+			if (!is_scalar($value) && null !== $value) {
202
+				throw new \InvalidArgumentException(sprintf(
203
+					'Header value must be scalar or null but %s provided.',
204
+					is_object($value) ? get_class($value) : gettype($value)
205
+				));
206
+			}
207
+
208
+			$trimmed = trim((string) $value, " \t");
209
+			$this->assertValue($trimmed);
210
+
211
+			return $trimmed;
212
+		}, array_values($values));
213
+	}
214
+
215
+	/**
216
+	 * @see https://datatracker.ietf.org/doc/html/rfc7230#section-3.2
217
+	 *
218
+	 * @param mixed $header
219
+	 */
220
+	private function assertHeader($header): void
221
+	{
222
+		if (!is_string($header)) {
223
+			throw new \InvalidArgumentException(sprintf(
224
+				'Header name must be a string but %s provided.',
225
+				is_object($header) ? get_class($header) : gettype($header)
226
+			));
227
+		}
228
+
229
+		if (!preg_match('/^[a-zA-Z0-9\'`#$%&*+.^_|~!-]+$/D', $header)) {
230
+			throw new \InvalidArgumentException(
231
+				sprintf('"%s" is not valid header name.', $header)
232
+			);
233
+		}
234
+	}
235
+
236
+	/**
237
+	 * @see https://datatracker.ietf.org/doc/html/rfc7230#section-3.2
238
+	 *
239
+	 * field-value    = *( field-content / obs-fold )
240
+	 * field-content  = field-vchar [ 1*( SP / HTAB ) field-vchar ]
241
+	 * field-vchar    = VCHAR / obs-text
242
+	 * VCHAR          = %x21-7E
243
+	 * obs-text       = %x80-FF
244
+	 * obs-fold       = CRLF 1*( SP / HTAB )
245
+	 */
246
+	private function assertValue(string $value): void
247
+	{
248
+		// The regular expression intentionally does not support the obs-fold production, because as
249
+		// per RFC 7230#3.2.4:
250
+		//
251
+		// A sender MUST NOT generate a message that includes
252
+		// line folding (i.e., that has any field-value that contains a match to
253
+		// the obs-fold rule) unless the message is intended for packaging
254
+		// within the message/http media type.
255
+		//
256
+		// Clients must not send a request with line folding and a server sending folded headers is
257
+		// likely very rare. Line folding is a fairly obscure feature of HTTP/1.1 and thus not accepting
258
+		// folding is not likely to break any legitimate use case.
259
+		if (!preg_match('/^[\x20\x09\x21-\x7E\x80-\xFF]*$/D', $value)) {
260
+			throw new \InvalidArgumentException(
261
+				sprintf('"%s" is not valid header value.', $value)
262
+			);
263
+		}
264
+	}
265 265
 }
Please login to merge, or discard this patch.
Spacing   +3 added lines, -3 removed lines patch added patch discarded remove patch
@@ -148,7 +148,7 @@  discard block
 block discarded – undo
148 148
         $this->headerNames = $this->headers = [];
149 149
         foreach ($headers as $header => $value) {
150 150
             // Numeric array keys are converted to int by PHP.
151
-            $header = (string) $header;
151
+            $header = (string)$header;
152 152
 
153 153
             $this->assertHeader($header);
154 154
             $value = $this->normalizeHeaderValue($value);
@@ -197,7 +197,7 @@  discard block
 block discarded – undo
197 197
      */
198 198
     private function trimAndValidateHeaderValues(array $values): array
199 199
     {
200
-        return array_map(function ($value) {
200
+        return array_map(function($value) {
201 201
             if (!is_scalar($value) && null !== $value) {
202 202
                 throw new \InvalidArgumentException(sprintf(
203 203
                     'Header value must be scalar or null but %s provided.',
@@ -205,7 +205,7 @@  discard block
 block discarded – undo
205 205
                 ));
206 206
             }
207 207
 
208
-            $trimmed = trim((string) $value, " \t");
208
+            $trimmed = trim((string)$value, " \t");
209 209
             $this->assertValue($trimmed);
210 210
 
211 211
             return $trimmed;
Please login to merge, or discard this patch.
Braces   +1 added lines, -2 removed lines patch added patch discarded remove patch
@@ -10,8 +10,7 @@
 block discarded – undo
10 10
 /**
11 11
  * Trait implementing functionality common to requests and responses.
12 12
  */
13
-trait MessageTrait
14
-{
13
+trait MessageTrait {
15 14
     /** @var string[][] Map of all registered headers, as original name => array of values */
16 15
     private $headers = [];
17 16
 
Please login to merge, or discard this patch.
lib/Vendor/GuzzleHttp/Psr7/CachingStream.php 2 patches
Indentation   +138 added lines, -138 removed lines patch added patch discarded remove patch
@@ -12,142 +12,142 @@
 block discarded – undo
12 12
  */
13 13
 final class CachingStream implements StreamInterface
14 14
 {
15
-    use StreamDecoratorTrait;
16
-
17
-    /** @var StreamInterface Stream being wrapped */
18
-    private $remoteStream;
19
-
20
-    /** @var int Number of bytes to skip reading due to a write on the buffer */
21
-    private $skipReadBytes = 0;
22
-
23
-    /**
24
-     * @var StreamInterface
25
-     */
26
-    private $stream;
27
-
28
-    /**
29
-     * We will treat the buffer object as the body of the stream
30
-     *
31
-     * @param StreamInterface $stream Stream to cache. The cursor is assumed to be at the beginning of the stream.
32
-     * @param StreamInterface $target Optionally specify where data is cached
33
-     */
34
-    public function __construct(
35
-        StreamInterface $stream,
36
-        StreamInterface $target = null
37
-    ) {
38
-        $this->remoteStream = $stream;
39
-        $this->stream = $target ?: new Stream(Utils::tryFopen('php://temp', 'r+'));
40
-    }
41
-
42
-    public function getSize(): ?int
43
-    {
44
-        $remoteSize = $this->remoteStream->getSize();
45
-
46
-        if (null === $remoteSize) {
47
-            return null;
48
-        }
49
-
50
-        return max($this->stream->getSize(), $remoteSize);
51
-    }
52
-
53
-    public function rewind(): void
54
-    {
55
-        $this->seek(0);
56
-    }
57
-
58
-    public function seek($offset, $whence = SEEK_SET): void
59
-    {
60
-        if ($whence === SEEK_SET) {
61
-            $byte = $offset;
62
-        } elseif ($whence === SEEK_CUR) {
63
-            $byte = $offset + $this->tell();
64
-        } elseif ($whence === SEEK_END) {
65
-            $size = $this->remoteStream->getSize();
66
-            if ($size === null) {
67
-                $size = $this->cacheEntireStream();
68
-            }
69
-            $byte = $size + $offset;
70
-        } else {
71
-            throw new \InvalidArgumentException('Invalid whence');
72
-        }
73
-
74
-        $diff = $byte - $this->stream->getSize();
75
-
76
-        if ($diff > 0) {
77
-            // Read the remoteStream until we have read in at least the amount
78
-            // of bytes requested, or we reach the end of the file.
79
-            while ($diff > 0 && !$this->remoteStream->eof()) {
80
-                $this->read($diff);
81
-                $diff = $byte - $this->stream->getSize();
82
-            }
83
-        } else {
84
-            // We can just do a normal seek since we've already seen this byte.
85
-            $this->stream->seek($byte);
86
-        }
87
-    }
88
-
89
-    public function read($length): string
90
-    {
91
-        // Perform a regular read on any previously read data from the buffer
92
-        $data = $this->stream->read($length);
93
-        $remaining = $length - strlen($data);
94
-
95
-        // More data was requested so read from the remote stream
96
-        if ($remaining) {
97
-            // If data was written to the buffer in a position that would have
98
-            // been filled from the remote stream, then we must skip bytes on
99
-            // the remote stream to emulate overwriting bytes from that
100
-            // position. This mimics the behavior of other PHP stream wrappers.
101
-            $remoteData = $this->remoteStream->read(
102
-                $remaining + $this->skipReadBytes
103
-            );
104
-
105
-            if ($this->skipReadBytes) {
106
-                $len = strlen($remoteData);
107
-                $remoteData = substr($remoteData, $this->skipReadBytes);
108
-                $this->skipReadBytes = max(0, $this->skipReadBytes - $len);
109
-            }
110
-
111
-            $data .= $remoteData;
112
-            $this->stream->write($remoteData);
113
-        }
114
-
115
-        return $data;
116
-    }
117
-
118
-    public function write($string): int
119
-    {
120
-        // When appending to the end of the currently read stream, you'll want
121
-        // to skip bytes from being read from the remote stream to emulate
122
-        // other stream wrappers. Basically replacing bytes of data of a fixed
123
-        // length.
124
-        $overflow = (strlen($string) + $this->tell()) - $this->remoteStream->tell();
125
-        if ($overflow > 0) {
126
-            $this->skipReadBytes += $overflow;
127
-        }
128
-
129
-        return $this->stream->write($string);
130
-    }
131
-
132
-    public function eof(): bool
133
-    {
134
-        return $this->stream->eof() && $this->remoteStream->eof();
135
-    }
136
-
137
-    /**
138
-     * Close both the remote stream and buffer stream
139
-     */
140
-    public function close(): void
141
-    {
142
-        $this->remoteStream->close();
143
-        $this->stream->close();
144
-    }
145
-
146
-    private function cacheEntireStream(): int
147
-    {
148
-        $target = new FnStream(['write' => 'strlen']);
149
-        Utils::copyToStream($this, $target);
150
-
151
-        return $this->tell();
152
-    }
15
+	use StreamDecoratorTrait;
16
+
17
+	/** @var StreamInterface Stream being wrapped */
18
+	private $remoteStream;
19
+
20
+	/** @var int Number of bytes to skip reading due to a write on the buffer */
21
+	private $skipReadBytes = 0;
22
+
23
+	/**
24
+	 * @var StreamInterface
25
+	 */
26
+	private $stream;
27
+
28
+	/**
29
+	 * We will treat the buffer object as the body of the stream
30
+	 *
31
+	 * @param StreamInterface $stream Stream to cache. The cursor is assumed to be at the beginning of the stream.
32
+	 * @param StreamInterface $target Optionally specify where data is cached
33
+	 */
34
+	public function __construct(
35
+		StreamInterface $stream,
36
+		StreamInterface $target = null
37
+	) {
38
+		$this->remoteStream = $stream;
39
+		$this->stream = $target ?: new Stream(Utils::tryFopen('php://temp', 'r+'));
40
+	}
41
+
42
+	public function getSize(): ?int
43
+	{
44
+		$remoteSize = $this->remoteStream->getSize();
45
+
46
+		if (null === $remoteSize) {
47
+			return null;
48
+		}
49
+
50
+		return max($this->stream->getSize(), $remoteSize);
51
+	}
52
+
53
+	public function rewind(): void
54
+	{
55
+		$this->seek(0);
56
+	}
57
+
58
+	public function seek($offset, $whence = SEEK_SET): void
59
+	{
60
+		if ($whence === SEEK_SET) {
61
+			$byte = $offset;
62
+		} elseif ($whence === SEEK_CUR) {
63
+			$byte = $offset + $this->tell();
64
+		} elseif ($whence === SEEK_END) {
65
+			$size = $this->remoteStream->getSize();
66
+			if ($size === null) {
67
+				$size = $this->cacheEntireStream();
68
+			}
69
+			$byte = $size + $offset;
70
+		} else {
71
+			throw new \InvalidArgumentException('Invalid whence');
72
+		}
73
+
74
+		$diff = $byte - $this->stream->getSize();
75
+
76
+		if ($diff > 0) {
77
+			// Read the remoteStream until we have read in at least the amount
78
+			// of bytes requested, or we reach the end of the file.
79
+			while ($diff > 0 && !$this->remoteStream->eof()) {
80
+				$this->read($diff);
81
+				$diff = $byte - $this->stream->getSize();
82
+			}
83
+		} else {
84
+			// We can just do a normal seek since we've already seen this byte.
85
+			$this->stream->seek($byte);
86
+		}
87
+	}
88
+
89
+	public function read($length): string
90
+	{
91
+		// Perform a regular read on any previously read data from the buffer
92
+		$data = $this->stream->read($length);
93
+		$remaining = $length - strlen($data);
94
+
95
+		// More data was requested so read from the remote stream
96
+		if ($remaining) {
97
+			// If data was written to the buffer in a position that would have
98
+			// been filled from the remote stream, then we must skip bytes on
99
+			// the remote stream to emulate overwriting bytes from that
100
+			// position. This mimics the behavior of other PHP stream wrappers.
101
+			$remoteData = $this->remoteStream->read(
102
+				$remaining + $this->skipReadBytes
103
+			);
104
+
105
+			if ($this->skipReadBytes) {
106
+				$len = strlen($remoteData);
107
+				$remoteData = substr($remoteData, $this->skipReadBytes);
108
+				$this->skipReadBytes = max(0, $this->skipReadBytes - $len);
109
+			}
110
+
111
+			$data .= $remoteData;
112
+			$this->stream->write($remoteData);
113
+		}
114
+
115
+		return $data;
116
+	}
117
+
118
+	public function write($string): int
119
+	{
120
+		// When appending to the end of the currently read stream, you'll want
121
+		// to skip bytes from being read from the remote stream to emulate
122
+		// other stream wrappers. Basically replacing bytes of data of a fixed
123
+		// length.
124
+		$overflow = (strlen($string) + $this->tell()) - $this->remoteStream->tell();
125
+		if ($overflow > 0) {
126
+			$this->skipReadBytes += $overflow;
127
+		}
128
+
129
+		return $this->stream->write($string);
130
+	}
131
+
132
+	public function eof(): bool
133
+	{
134
+		return $this->stream->eof() && $this->remoteStream->eof();
135
+	}
136
+
137
+	/**
138
+	 * Close both the remote stream and buffer stream
139
+	 */
140
+	public function close(): void
141
+	{
142
+		$this->remoteStream->close();
143
+		$this->stream->close();
144
+	}
145
+
146
+	private function cacheEntireStream(): int
147
+	{
148
+		$target = new FnStream(['write' => 'strlen']);
149
+		Utils::copyToStream($this, $target);
150
+
151
+		return $this->tell();
152
+	}
153 153
 }
Please login to merge, or discard this patch.
Braces   +1 added lines, -2 removed lines patch added patch discarded remove patch
@@ -10,8 +10,7 @@
 block discarded – undo
10 10
  * Stream decorator that can cache previously read bytes from a sequentially
11 11
  * read stream.
12 12
  */
13
-final class CachingStream implements StreamInterface
14
-{
13
+final class CachingStream implements StreamInterface {
15 14
     use StreamDecoratorTrait;
16 15
 
17 16
     /** @var StreamInterface Stream being wrapped */
Please login to merge, or discard this patch.
lib/Vendor/GuzzleHttp/Psr7/Uri.php 2 patches
Indentation   +724 added lines, -724 removed lines patch added patch discarded remove patch
@@ -16,728 +16,728 @@
 block discarded – undo
16 16
  */
17 17
 class Uri implements UriInterface, \JsonSerializable
18 18
 {
19
-    /**
20
-     * Absolute http and https URIs require a host per RFC 7230 Section 2.7
21
-     * but in generic URIs the host can be empty. So for http(s) URIs
22
-     * we apply this default host when no host is given yet to form a
23
-     * valid URI.
24
-     */
25
-    private const HTTP_DEFAULT_HOST = 'localhost';
26
-
27
-    private const DEFAULT_PORTS = [
28
-        'http' => 80,
29
-        'https' => 443,
30
-        'ftp' => 21,
31
-        'gopher' => 70,
32
-        'nntp' => 119,
33
-        'news' => 119,
34
-        'telnet' => 23,
35
-        'tn3270' => 23,
36
-        'imap' => 143,
37
-        'pop' => 110,
38
-        'ldap' => 389,
39
-    ];
40
-
41
-    /**
42
-     * Unreserved characters for use in a regex.
43
-     *
44
-     * @see https://datatracker.ietf.org/doc/html/rfc3986#section-2.3
45
-     */
46
-    private const CHAR_UNRESERVED = 'a-zA-Z0-9_\-\.~';
47
-
48
-    /**
49
-     * Sub-delims for use in a regex.
50
-     *
51
-     * @see https://datatracker.ietf.org/doc/html/rfc3986#section-2.2
52
-     */
53
-    private const CHAR_SUB_DELIMS = '!\$&\'\(\)\*\+,;=';
54
-    private const QUERY_SEPARATORS_REPLACEMENT = ['=' => '%3D', '&' => '%26'];
55
-
56
-    /** @var string Uri scheme. */
57
-    private $scheme = '';
58
-
59
-    /** @var string Uri user info. */
60
-    private $userInfo = '';
61
-
62
-    /** @var string Uri host. */
63
-    private $host = '';
64
-
65
-    /** @var int|null Uri port. */
66
-    private $port;
67
-
68
-    /** @var string Uri path. */
69
-    private $path = '';
70
-
71
-    /** @var string Uri query string. */
72
-    private $query = '';
73
-
74
-    /** @var string Uri fragment. */
75
-    private $fragment = '';
76
-
77
-    /** @var string|null String representation */
78
-    private $composedComponents;
79
-
80
-    public function __construct(string $uri = '')
81
-    {
82
-        if ($uri !== '') {
83
-            $parts = self::parse($uri);
84
-            if ($parts === false) {
85
-                throw new MalformedUriException("Unable to parse URI: $uri");
86
-            }
87
-            $this->applyParts($parts);
88
-        }
89
-    }
90
-
91
-    /**
92
-     * UTF-8 aware \parse_url() replacement.
93
-     *
94
-     * The internal function produces broken output for non ASCII domain names
95
-     * (IDN) when used with locales other than "C".
96
-     *
97
-     * On the other hand, cURL understands IDN correctly only when UTF-8 locale
98
-     * is configured ("C.UTF-8", "en_US.UTF-8", etc.).
99
-     *
100
-     * @see https://bugs.php.net/bug.php?id=52923
101
-     * @see https://www.php.net/manual/en/function.parse-url.php#114817
102
-     * @see https://curl.haxx.se/libcurl/c/CURLOPT_URL.html#ENCODING
103
-     *
104
-     * @return array|false
105
-     */
106
-    private static function parse(string $url)
107
-    {
108
-        // If IPv6
109
-        $prefix = '';
110
-        if (preg_match('%^(.*://\[[0-9:a-f]+\])(.*?)$%', $url, $matches)) {
111
-            /** @var array{0:string, 1:string, 2:string} $matches */
112
-            $prefix = $matches[1];
113
-            $url = $matches[2];
114
-        }
115
-
116
-        /** @var string */
117
-        $encodedUrl = preg_replace_callback(
118
-            '%[^:/@?&=#]+%usD',
119
-            static function ($matches) {
120
-                return urlencode($matches[0]);
121
-            },
122
-            $url
123
-        );
124
-
125
-        $result = parse_url($prefix.$encodedUrl);
126
-
127
-        if ($result === false) {
128
-            return false;
129
-        }
130
-
131
-        return array_map('urldecode', $result);
132
-    }
133
-
134
-    public function __toString(): string
135
-    {
136
-        if ($this->composedComponents === null) {
137
-            $this->composedComponents = self::composeComponents(
138
-                $this->scheme,
139
-                $this->getAuthority(),
140
-                $this->path,
141
-                $this->query,
142
-                $this->fragment
143
-            );
144
-        }
145
-
146
-        return $this->composedComponents;
147
-    }
148
-
149
-    /**
150
-     * Composes a URI reference string from its various components.
151
-     *
152
-     * Usually this method does not need to be called manually but instead is used indirectly via
153
-     * `OCA\FullTextSearch_Elasticsearch\Vendor\Psr\Http\Message\UriInterface::__toString`.
154
-     *
155
-     * PSR-7 UriInterface treats an empty component the same as a missing component as
156
-     * getQuery(), getFragment() etc. always return a string. This explains the slight
157
-     * difference to RFC 3986 Section 5.3.
158
-     *
159
-     * Another adjustment is that the authority separator is added even when the authority is missing/empty
160
-     * for the "file" scheme. This is because PHP stream functions like `file_get_contents` only work with
161
-     * `file:///myfile` but not with `file:/myfile` although they are equivalent according to RFC 3986. But
162
-     * `file:///` is the more common syntax for the file scheme anyway (Chrome for example redirects to
163
-     * that format).
164
-     *
165
-     * @see https://datatracker.ietf.org/doc/html/rfc3986#section-5.3
166
-     */
167
-    public static function composeComponents(?string $scheme, ?string $authority, string $path, ?string $query, ?string $fragment): string
168
-    {
169
-        $uri = '';
170
-
171
-        // weak type checks to also accept null until we can add scalar type hints
172
-        if ($scheme != '') {
173
-            $uri .= $scheme.':';
174
-        }
175
-
176
-        if ($authority != '' || $scheme === 'file') {
177
-            $uri .= '//'.$authority;
178
-        }
179
-
180
-        if ($authority != '' && $path != '' && $path[0] != '/') {
181
-            $path = '/'.$path;
182
-        }
183
-
184
-        $uri .= $path;
185
-
186
-        if ($query != '') {
187
-            $uri .= '?'.$query;
188
-        }
189
-
190
-        if ($fragment != '') {
191
-            $uri .= '#'.$fragment;
192
-        }
193
-
194
-        return $uri;
195
-    }
196
-
197
-    /**
198
-     * Whether the URI has the default port of the current scheme.
199
-     *
200
-     * `OCA\FullTextSearch_Elasticsearch\Vendor\Psr\Http\Message\UriInterface::getPort` may return null or the standard port. This method can be used
201
-     * independently of the implementation.
202
-     */
203
-    public static function isDefaultPort(UriInterface $uri): bool
204
-    {
205
-        return $uri->getPort() === null
206
-            || (isset(self::DEFAULT_PORTS[$uri->getScheme()]) && $uri->getPort() === self::DEFAULT_PORTS[$uri->getScheme()]);
207
-    }
208
-
209
-    /**
210
-     * Whether the URI is absolute, i.e. it has a scheme.
211
-     *
212
-     * An instance of UriInterface can either be an absolute URI or a relative reference. This method returns true
213
-     * if it is the former. An absolute URI has a scheme. A relative reference is used to express a URI relative
214
-     * to another URI, the base URI. Relative references can be divided into several forms:
215
-     * - network-path references, e.g. '//example.com/path'
216
-     * - absolute-path references, e.g. '/path'
217
-     * - relative-path references, e.g. 'subpath'
218
-     *
219
-     * @see Uri::isNetworkPathReference
220
-     * @see Uri::isAbsolutePathReference
221
-     * @see Uri::isRelativePathReference
222
-     * @see https://datatracker.ietf.org/doc/html/rfc3986#section-4
223
-     */
224
-    public static function isAbsolute(UriInterface $uri): bool
225
-    {
226
-        return $uri->getScheme() !== '';
227
-    }
228
-
229
-    /**
230
-     * Whether the URI is a network-path reference.
231
-     *
232
-     * A relative reference that begins with two slash characters is termed an network-path reference.
233
-     *
234
-     * @see https://datatracker.ietf.org/doc/html/rfc3986#section-4.2
235
-     */
236
-    public static function isNetworkPathReference(UriInterface $uri): bool
237
-    {
238
-        return $uri->getScheme() === '' && $uri->getAuthority() !== '';
239
-    }
240
-
241
-    /**
242
-     * Whether the URI is a absolute-path reference.
243
-     *
244
-     * A relative reference that begins with a single slash character is termed an absolute-path reference.
245
-     *
246
-     * @see https://datatracker.ietf.org/doc/html/rfc3986#section-4.2
247
-     */
248
-    public static function isAbsolutePathReference(UriInterface $uri): bool
249
-    {
250
-        return $uri->getScheme() === ''
251
-            && $uri->getAuthority() === ''
252
-            && isset($uri->getPath()[0])
253
-            && $uri->getPath()[0] === '/';
254
-    }
255
-
256
-    /**
257
-     * Whether the URI is a relative-path reference.
258
-     *
259
-     * A relative reference that does not begin with a slash character is termed a relative-path reference.
260
-     *
261
-     * @see https://datatracker.ietf.org/doc/html/rfc3986#section-4.2
262
-     */
263
-    public static function isRelativePathReference(UriInterface $uri): bool
264
-    {
265
-        return $uri->getScheme() === ''
266
-            && $uri->getAuthority() === ''
267
-            && (!isset($uri->getPath()[0]) || $uri->getPath()[0] !== '/');
268
-    }
269
-
270
-    /**
271
-     * Whether the URI is a same-document reference.
272
-     *
273
-     * A same-document reference refers to a URI that is, aside from its fragment
274
-     * component, identical to the base URI. When no base URI is given, only an empty
275
-     * URI reference (apart from its fragment) is considered a same-document reference.
276
-     *
277
-     * @param UriInterface      $uri  The URI to check
278
-     * @param UriInterface|null $base An optional base URI to compare against
279
-     *
280
-     * @see https://datatracker.ietf.org/doc/html/rfc3986#section-4.4
281
-     */
282
-    public static function isSameDocumentReference(UriInterface $uri, UriInterface $base = null): bool
283
-    {
284
-        if ($base !== null) {
285
-            $uri = UriResolver::resolve($base, $uri);
286
-
287
-            return ($uri->getScheme() === $base->getScheme())
288
-                && ($uri->getAuthority() === $base->getAuthority())
289
-                && ($uri->getPath() === $base->getPath())
290
-                && ($uri->getQuery() === $base->getQuery());
291
-        }
292
-
293
-        return $uri->getScheme() === '' && $uri->getAuthority() === '' && $uri->getPath() === '' && $uri->getQuery() === '';
294
-    }
295
-
296
-    /**
297
-     * Creates a new URI with a specific query string value removed.
298
-     *
299
-     * Any existing query string values that exactly match the provided key are
300
-     * removed.
301
-     *
302
-     * @param UriInterface $uri URI to use as a base.
303
-     * @param string       $key Query string key to remove.
304
-     */
305
-    public static function withoutQueryValue(UriInterface $uri, string $key): UriInterface
306
-    {
307
-        $result = self::getFilteredQueryString($uri, [$key]);
308
-
309
-        return $uri->withQuery(implode('&', $result));
310
-    }
311
-
312
-    /**
313
-     * Creates a new URI with a specific query string value.
314
-     *
315
-     * Any existing query string values that exactly match the provided key are
316
-     * removed and replaced with the given key value pair.
317
-     *
318
-     * A value of null will set the query string key without a value, e.g. "key"
319
-     * instead of "key=value".
320
-     *
321
-     * @param UriInterface $uri   URI to use as a base.
322
-     * @param string       $key   Key to set.
323
-     * @param string|null  $value Value to set
324
-     */
325
-    public static function withQueryValue(UriInterface $uri, string $key, ?string $value): UriInterface
326
-    {
327
-        $result = self::getFilteredQueryString($uri, [$key]);
328
-
329
-        $result[] = self::generateQueryString($key, $value);
330
-
331
-        return $uri->withQuery(implode('&', $result));
332
-    }
333
-
334
-    /**
335
-     * Creates a new URI with multiple specific query string values.
336
-     *
337
-     * It has the same behavior as withQueryValue() but for an associative array of key => value.
338
-     *
339
-     * @param UriInterface    $uri           URI to use as a base.
340
-     * @param (string|null)[] $keyValueArray Associative array of key and values
341
-     */
342
-    public static function withQueryValues(UriInterface $uri, array $keyValueArray): UriInterface
343
-    {
344
-        $result = self::getFilteredQueryString($uri, array_keys($keyValueArray));
345
-
346
-        foreach ($keyValueArray as $key => $value) {
347
-            $result[] = self::generateQueryString((string) $key, $value !== null ? (string) $value : null);
348
-        }
349
-
350
-        return $uri->withQuery(implode('&', $result));
351
-    }
352
-
353
-    /**
354
-     * Creates a URI from a hash of `parse_url` components.
355
-     *
356
-     * @see https://www.php.net/manual/en/function.parse-url.php
357
-     *
358
-     * @throws MalformedUriException If the components do not form a valid URI.
359
-     */
360
-    public static function fromParts(array $parts): UriInterface
361
-    {
362
-        $uri = new self();
363
-        $uri->applyParts($parts);
364
-        $uri->validateState();
365
-
366
-        return $uri;
367
-    }
368
-
369
-    public function getScheme(): string
370
-    {
371
-        return $this->scheme;
372
-    }
373
-
374
-    public function getAuthority(): string
375
-    {
376
-        $authority = $this->host;
377
-        if ($this->userInfo !== '') {
378
-            $authority = $this->userInfo.'@'.$authority;
379
-        }
380
-
381
-        if ($this->port !== null) {
382
-            $authority .= ':'.$this->port;
383
-        }
384
-
385
-        return $authority;
386
-    }
387
-
388
-    public function getUserInfo(): string
389
-    {
390
-        return $this->userInfo;
391
-    }
392
-
393
-    public function getHost(): string
394
-    {
395
-        return $this->host;
396
-    }
397
-
398
-    public function getPort(): ?int
399
-    {
400
-        return $this->port;
401
-    }
402
-
403
-    public function getPath(): string
404
-    {
405
-        return $this->path;
406
-    }
407
-
408
-    public function getQuery(): string
409
-    {
410
-        return $this->query;
411
-    }
412
-
413
-    public function getFragment(): string
414
-    {
415
-        return $this->fragment;
416
-    }
417
-
418
-    public function withScheme($scheme): UriInterface
419
-    {
420
-        $scheme = $this->filterScheme($scheme);
421
-
422
-        if ($this->scheme === $scheme) {
423
-            return $this;
424
-        }
425
-
426
-        $new = clone $this;
427
-        $new->scheme = $scheme;
428
-        $new->composedComponents = null;
429
-        $new->removeDefaultPort();
430
-        $new->validateState();
431
-
432
-        return $new;
433
-    }
434
-
435
-    public function withUserInfo($user, $password = null): UriInterface
436
-    {
437
-        $info = $this->filterUserInfoComponent($user);
438
-        if ($password !== null) {
439
-            $info .= ':'.$this->filterUserInfoComponent($password);
440
-        }
441
-
442
-        if ($this->userInfo === $info) {
443
-            return $this;
444
-        }
445
-
446
-        $new = clone $this;
447
-        $new->userInfo = $info;
448
-        $new->composedComponents = null;
449
-        $new->validateState();
450
-
451
-        return $new;
452
-    }
453
-
454
-    public function withHost($host): UriInterface
455
-    {
456
-        $host = $this->filterHost($host);
457
-
458
-        if ($this->host === $host) {
459
-            return $this;
460
-        }
461
-
462
-        $new = clone $this;
463
-        $new->host = $host;
464
-        $new->composedComponents = null;
465
-        $new->validateState();
466
-
467
-        return $new;
468
-    }
469
-
470
-    public function withPort($port): UriInterface
471
-    {
472
-        $port = $this->filterPort($port);
473
-
474
-        if ($this->port === $port) {
475
-            return $this;
476
-        }
477
-
478
-        $new = clone $this;
479
-        $new->port = $port;
480
-        $new->composedComponents = null;
481
-        $new->removeDefaultPort();
482
-        $new->validateState();
483
-
484
-        return $new;
485
-    }
486
-
487
-    public function withPath($path): UriInterface
488
-    {
489
-        $path = $this->filterPath($path);
490
-
491
-        if ($this->path === $path) {
492
-            return $this;
493
-        }
494
-
495
-        $new = clone $this;
496
-        $new->path = $path;
497
-        $new->composedComponents = null;
498
-        $new->validateState();
499
-
500
-        return $new;
501
-    }
502
-
503
-    public function withQuery($query): UriInterface
504
-    {
505
-        $query = $this->filterQueryAndFragment($query);
506
-
507
-        if ($this->query === $query) {
508
-            return $this;
509
-        }
510
-
511
-        $new = clone $this;
512
-        $new->query = $query;
513
-        $new->composedComponents = null;
514
-
515
-        return $new;
516
-    }
517
-
518
-    public function withFragment($fragment): UriInterface
519
-    {
520
-        $fragment = $this->filterQueryAndFragment($fragment);
521
-
522
-        if ($this->fragment === $fragment) {
523
-            return $this;
524
-        }
525
-
526
-        $new = clone $this;
527
-        $new->fragment = $fragment;
528
-        $new->composedComponents = null;
529
-
530
-        return $new;
531
-    }
532
-
533
-    public function jsonSerialize(): string
534
-    {
535
-        return $this->__toString();
536
-    }
537
-
538
-    /**
539
-     * Apply parse_url parts to a URI.
540
-     *
541
-     * @param array $parts Array of parse_url parts to apply.
542
-     */
543
-    private function applyParts(array $parts): void
544
-    {
545
-        $this->scheme = isset($parts['scheme'])
546
-            ? $this->filterScheme($parts['scheme'])
547
-            : '';
548
-        $this->userInfo = isset($parts['user'])
549
-            ? $this->filterUserInfoComponent($parts['user'])
550
-            : '';
551
-        $this->host = isset($parts['host'])
552
-            ? $this->filterHost($parts['host'])
553
-            : '';
554
-        $this->port = isset($parts['port'])
555
-            ? $this->filterPort($parts['port'])
556
-            : null;
557
-        $this->path = isset($parts['path'])
558
-            ? $this->filterPath($parts['path'])
559
-            : '';
560
-        $this->query = isset($parts['query'])
561
-            ? $this->filterQueryAndFragment($parts['query'])
562
-            : '';
563
-        $this->fragment = isset($parts['fragment'])
564
-            ? $this->filterQueryAndFragment($parts['fragment'])
565
-            : '';
566
-        if (isset($parts['pass'])) {
567
-            $this->userInfo .= ':'.$this->filterUserInfoComponent($parts['pass']);
568
-        }
569
-
570
-        $this->removeDefaultPort();
571
-    }
572
-
573
-    /**
574
-     * @param mixed $scheme
575
-     *
576
-     * @throws \InvalidArgumentException If the scheme is invalid.
577
-     */
578
-    private function filterScheme($scheme): string
579
-    {
580
-        if (!is_string($scheme)) {
581
-            throw new \InvalidArgumentException('Scheme must be a string');
582
-        }
583
-
584
-        return \strtr($scheme, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz');
585
-    }
586
-
587
-    /**
588
-     * @param mixed $component
589
-     *
590
-     * @throws \InvalidArgumentException If the user info is invalid.
591
-     */
592
-    private function filterUserInfoComponent($component): string
593
-    {
594
-        if (!is_string($component)) {
595
-            throw new \InvalidArgumentException('User info must be a string');
596
-        }
597
-
598
-        return preg_replace_callback(
599
-            '/(?:[^%'.self::CHAR_UNRESERVED.self::CHAR_SUB_DELIMS.']+|%(?![A-Fa-f0-9]{2}))/',
600
-            [$this, 'rawurlencodeMatchZero'],
601
-            $component
602
-        );
603
-    }
604
-
605
-    /**
606
-     * @param mixed $host
607
-     *
608
-     * @throws \InvalidArgumentException If the host is invalid.
609
-     */
610
-    private function filterHost($host): string
611
-    {
612
-        if (!is_string($host)) {
613
-            throw new \InvalidArgumentException('Host must be a string');
614
-        }
615
-
616
-        return \strtr($host, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz');
617
-    }
618
-
619
-    /**
620
-     * @param mixed $port
621
-     *
622
-     * @throws \InvalidArgumentException If the port is invalid.
623
-     */
624
-    private function filterPort($port): ?int
625
-    {
626
-        if ($port === null) {
627
-            return null;
628
-        }
629
-
630
-        $port = (int) $port;
631
-        if (0 > $port || 0xFFFF < $port) {
632
-            throw new \InvalidArgumentException(
633
-                sprintf('Invalid port: %d. Must be between 0 and 65535', $port)
634
-            );
635
-        }
636
-
637
-        return $port;
638
-    }
639
-
640
-    /**
641
-     * @param (string|int)[] $keys
642
-     *
643
-     * @return string[]
644
-     */
645
-    private static function getFilteredQueryString(UriInterface $uri, array $keys): array
646
-    {
647
-        $current = $uri->getQuery();
648
-
649
-        if ($current === '') {
650
-            return [];
651
-        }
652
-
653
-        $decodedKeys = array_map(function ($k): string {
654
-            return rawurldecode((string) $k);
655
-        }, $keys);
656
-
657
-        return array_filter(explode('&', $current), function ($part) use ($decodedKeys) {
658
-            return !in_array(rawurldecode(explode('=', $part)[0]), $decodedKeys, true);
659
-        });
660
-    }
661
-
662
-    private static function generateQueryString(string $key, ?string $value): string
663
-    {
664
-        // Query string separators ("=", "&") within the key or value need to be encoded
665
-        // (while preventing double-encoding) before setting the query string. All other
666
-        // chars that need percent-encoding will be encoded by withQuery().
667
-        $queryString = strtr($key, self::QUERY_SEPARATORS_REPLACEMENT);
668
-
669
-        if ($value !== null) {
670
-            $queryString .= '='.strtr($value, self::QUERY_SEPARATORS_REPLACEMENT);
671
-        }
672
-
673
-        return $queryString;
674
-    }
675
-
676
-    private function removeDefaultPort(): void
677
-    {
678
-        if ($this->port !== null && self::isDefaultPort($this)) {
679
-            $this->port = null;
680
-        }
681
-    }
682
-
683
-    /**
684
-     * Filters the path of a URI
685
-     *
686
-     * @param mixed $path
687
-     *
688
-     * @throws \InvalidArgumentException If the path is invalid.
689
-     */
690
-    private function filterPath($path): string
691
-    {
692
-        if (!is_string($path)) {
693
-            throw new \InvalidArgumentException('Path must be a string');
694
-        }
695
-
696
-        return preg_replace_callback(
697
-            '/(?:[^'.self::CHAR_UNRESERVED.self::CHAR_SUB_DELIMS.'%:@\/]++|%(?![A-Fa-f0-9]{2}))/',
698
-            [$this, 'rawurlencodeMatchZero'],
699
-            $path
700
-        );
701
-    }
702
-
703
-    /**
704
-     * Filters the query string or fragment of a URI.
705
-     *
706
-     * @param mixed $str
707
-     *
708
-     * @throws \InvalidArgumentException If the query or fragment is invalid.
709
-     */
710
-    private function filterQueryAndFragment($str): string
711
-    {
712
-        if (!is_string($str)) {
713
-            throw new \InvalidArgumentException('Query and fragment must be a string');
714
-        }
715
-
716
-        return preg_replace_callback(
717
-            '/(?:[^'.self::CHAR_UNRESERVED.self::CHAR_SUB_DELIMS.'%:@\/\?]++|%(?![A-Fa-f0-9]{2}))/',
718
-            [$this, 'rawurlencodeMatchZero'],
719
-            $str
720
-        );
721
-    }
722
-
723
-    private function rawurlencodeMatchZero(array $match): string
724
-    {
725
-        return rawurlencode($match[0]);
726
-    }
727
-
728
-    private function validateState(): void
729
-    {
730
-        if ($this->host === '' && ($this->scheme === 'http' || $this->scheme === 'https')) {
731
-            $this->host = self::HTTP_DEFAULT_HOST;
732
-        }
733
-
734
-        if ($this->getAuthority() === '') {
735
-            if (0 === strpos($this->path, '//')) {
736
-                throw new MalformedUriException('The path of a URI without an authority must not start with two slashes "//"');
737
-            }
738
-            if ($this->scheme === '' && false !== strpos(explode('/', $this->path, 2)[0], ':')) {
739
-                throw new MalformedUriException('A relative URI must not have a path beginning with a segment containing a colon');
740
-            }
741
-        }
742
-    }
19
+	/**
20
+	 * Absolute http and https URIs require a host per RFC 7230 Section 2.7
21
+	 * but in generic URIs the host can be empty. So for http(s) URIs
22
+	 * we apply this default host when no host is given yet to form a
23
+	 * valid URI.
24
+	 */
25
+	private const HTTP_DEFAULT_HOST = 'localhost';
26
+
27
+	private const DEFAULT_PORTS = [
28
+		'http' => 80,
29
+		'https' => 443,
30
+		'ftp' => 21,
31
+		'gopher' => 70,
32
+		'nntp' => 119,
33
+		'news' => 119,
34
+		'telnet' => 23,
35
+		'tn3270' => 23,
36
+		'imap' => 143,
37
+		'pop' => 110,
38
+		'ldap' => 389,
39
+	];
40
+
41
+	/**
42
+	 * Unreserved characters for use in a regex.
43
+	 *
44
+	 * @see https://datatracker.ietf.org/doc/html/rfc3986#section-2.3
45
+	 */
46
+	private const CHAR_UNRESERVED = 'a-zA-Z0-9_\-\.~';
47
+
48
+	/**
49
+	 * Sub-delims for use in a regex.
50
+	 *
51
+	 * @see https://datatracker.ietf.org/doc/html/rfc3986#section-2.2
52
+	 */
53
+	private const CHAR_SUB_DELIMS = '!\$&\'\(\)\*\+,;=';
54
+	private const QUERY_SEPARATORS_REPLACEMENT = ['=' => '%3D', '&' => '%26'];
55
+
56
+	/** @var string Uri scheme. */
57
+	private $scheme = '';
58
+
59
+	/** @var string Uri user info. */
60
+	private $userInfo = '';
61
+
62
+	/** @var string Uri host. */
63
+	private $host = '';
64
+
65
+	/** @var int|null Uri port. */
66
+	private $port;
67
+
68
+	/** @var string Uri path. */
69
+	private $path = '';
70
+
71
+	/** @var string Uri query string. */
72
+	private $query = '';
73
+
74
+	/** @var string Uri fragment. */
75
+	private $fragment = '';
76
+
77
+	/** @var string|null String representation */
78
+	private $composedComponents;
79
+
80
+	public function __construct(string $uri = '')
81
+	{
82
+		if ($uri !== '') {
83
+			$parts = self::parse($uri);
84
+			if ($parts === false) {
85
+				throw new MalformedUriException("Unable to parse URI: $uri");
86
+			}
87
+			$this->applyParts($parts);
88
+		}
89
+	}
90
+
91
+	/**
92
+	 * UTF-8 aware \parse_url() replacement.
93
+	 *
94
+	 * The internal function produces broken output for non ASCII domain names
95
+	 * (IDN) when used with locales other than "C".
96
+	 *
97
+	 * On the other hand, cURL understands IDN correctly only when UTF-8 locale
98
+	 * is configured ("C.UTF-8", "en_US.UTF-8", etc.).
99
+	 *
100
+	 * @see https://bugs.php.net/bug.php?id=52923
101
+	 * @see https://www.php.net/manual/en/function.parse-url.php#114817
102
+	 * @see https://curl.haxx.se/libcurl/c/CURLOPT_URL.html#ENCODING
103
+	 *
104
+	 * @return array|false
105
+	 */
106
+	private static function parse(string $url)
107
+	{
108
+		// If IPv6
109
+		$prefix = '';
110
+		if (preg_match('%^(.*://\[[0-9:a-f]+\])(.*?)$%', $url, $matches)) {
111
+			/** @var array{0:string, 1:string, 2:string} $matches */
112
+			$prefix = $matches[1];
113
+			$url = $matches[2];
114
+		}
115
+
116
+		/** @var string */
117
+		$encodedUrl = preg_replace_callback(
118
+			'%[^:/@?&=#]+%usD',
119
+			static function ($matches) {
120
+				return urlencode($matches[0]);
121
+			},
122
+			$url
123
+		);
124
+
125
+		$result = parse_url($prefix.$encodedUrl);
126
+
127
+		if ($result === false) {
128
+			return false;
129
+		}
130
+
131
+		return array_map('urldecode', $result);
132
+	}
133
+
134
+	public function __toString(): string
135
+	{
136
+		if ($this->composedComponents === null) {
137
+			$this->composedComponents = self::composeComponents(
138
+				$this->scheme,
139
+				$this->getAuthority(),
140
+				$this->path,
141
+				$this->query,
142
+				$this->fragment
143
+			);
144
+		}
145
+
146
+		return $this->composedComponents;
147
+	}
148
+
149
+	/**
150
+	 * Composes a URI reference string from its various components.
151
+	 *
152
+	 * Usually this method does not need to be called manually but instead is used indirectly via
153
+	 * `OCA\FullTextSearch_Elasticsearch\Vendor\Psr\Http\Message\UriInterface::__toString`.
154
+	 *
155
+	 * PSR-7 UriInterface treats an empty component the same as a missing component as
156
+	 * getQuery(), getFragment() etc. always return a string. This explains the slight
157
+	 * difference to RFC 3986 Section 5.3.
158
+	 *
159
+	 * Another adjustment is that the authority separator is added even when the authority is missing/empty
160
+	 * for the "file" scheme. This is because PHP stream functions like `file_get_contents` only work with
161
+	 * `file:///myfile` but not with `file:/myfile` although they are equivalent according to RFC 3986. But
162
+	 * `file:///` is the more common syntax for the file scheme anyway (Chrome for example redirects to
163
+	 * that format).
164
+	 *
165
+	 * @see https://datatracker.ietf.org/doc/html/rfc3986#section-5.3
166
+	 */
167
+	public static function composeComponents(?string $scheme, ?string $authority, string $path, ?string $query, ?string $fragment): string
168
+	{
169
+		$uri = '';
170
+
171
+		// weak type checks to also accept null until we can add scalar type hints
172
+		if ($scheme != '') {
173
+			$uri .= $scheme.':';
174
+		}
175
+
176
+		if ($authority != '' || $scheme === 'file') {
177
+			$uri .= '//'.$authority;
178
+		}
179
+
180
+		if ($authority != '' && $path != '' && $path[0] != '/') {
181
+			$path = '/'.$path;
182
+		}
183
+
184
+		$uri .= $path;
185
+
186
+		if ($query != '') {
187
+			$uri .= '?'.$query;
188
+		}
189
+
190
+		if ($fragment != '') {
191
+			$uri .= '#'.$fragment;
192
+		}
193
+
194
+		return $uri;
195
+	}
196
+
197
+	/**
198
+	 * Whether the URI has the default port of the current scheme.
199
+	 *
200
+	 * `OCA\FullTextSearch_Elasticsearch\Vendor\Psr\Http\Message\UriInterface::getPort` may return null or the standard port. This method can be used
201
+	 * independently of the implementation.
202
+	 */
203
+	public static function isDefaultPort(UriInterface $uri): bool
204
+	{
205
+		return $uri->getPort() === null
206
+			|| (isset(self::DEFAULT_PORTS[$uri->getScheme()]) && $uri->getPort() === self::DEFAULT_PORTS[$uri->getScheme()]);
207
+	}
208
+
209
+	/**
210
+	 * Whether the URI is absolute, i.e. it has a scheme.
211
+	 *
212
+	 * An instance of UriInterface can either be an absolute URI or a relative reference. This method returns true
213
+	 * if it is the former. An absolute URI has a scheme. A relative reference is used to express a URI relative
214
+	 * to another URI, the base URI. Relative references can be divided into several forms:
215
+	 * - network-path references, e.g. '//example.com/path'
216
+	 * - absolute-path references, e.g. '/path'
217
+	 * - relative-path references, e.g. 'subpath'
218
+	 *
219
+	 * @see Uri::isNetworkPathReference
220
+	 * @see Uri::isAbsolutePathReference
221
+	 * @see Uri::isRelativePathReference
222
+	 * @see https://datatracker.ietf.org/doc/html/rfc3986#section-4
223
+	 */
224
+	public static function isAbsolute(UriInterface $uri): bool
225
+	{
226
+		return $uri->getScheme() !== '';
227
+	}
228
+
229
+	/**
230
+	 * Whether the URI is a network-path reference.
231
+	 *
232
+	 * A relative reference that begins with two slash characters is termed an network-path reference.
233
+	 *
234
+	 * @see https://datatracker.ietf.org/doc/html/rfc3986#section-4.2
235
+	 */
236
+	public static function isNetworkPathReference(UriInterface $uri): bool
237
+	{
238
+		return $uri->getScheme() === '' && $uri->getAuthority() !== '';
239
+	}
240
+
241
+	/**
242
+	 * Whether the URI is a absolute-path reference.
243
+	 *
244
+	 * A relative reference that begins with a single slash character is termed an absolute-path reference.
245
+	 *
246
+	 * @see https://datatracker.ietf.org/doc/html/rfc3986#section-4.2
247
+	 */
248
+	public static function isAbsolutePathReference(UriInterface $uri): bool
249
+	{
250
+		return $uri->getScheme() === ''
251
+			&& $uri->getAuthority() === ''
252
+			&& isset($uri->getPath()[0])
253
+			&& $uri->getPath()[0] === '/';
254
+	}
255
+
256
+	/**
257
+	 * Whether the URI is a relative-path reference.
258
+	 *
259
+	 * A relative reference that does not begin with a slash character is termed a relative-path reference.
260
+	 *
261
+	 * @see https://datatracker.ietf.org/doc/html/rfc3986#section-4.2
262
+	 */
263
+	public static function isRelativePathReference(UriInterface $uri): bool
264
+	{
265
+		return $uri->getScheme() === ''
266
+			&& $uri->getAuthority() === ''
267
+			&& (!isset($uri->getPath()[0]) || $uri->getPath()[0] !== '/');
268
+	}
269
+
270
+	/**
271
+	 * Whether the URI is a same-document reference.
272
+	 *
273
+	 * A same-document reference refers to a URI that is, aside from its fragment
274
+	 * component, identical to the base URI. When no base URI is given, only an empty
275
+	 * URI reference (apart from its fragment) is considered a same-document reference.
276
+	 *
277
+	 * @param UriInterface      $uri  The URI to check
278
+	 * @param UriInterface|null $base An optional base URI to compare against
279
+	 *
280
+	 * @see https://datatracker.ietf.org/doc/html/rfc3986#section-4.4
281
+	 */
282
+	public static function isSameDocumentReference(UriInterface $uri, UriInterface $base = null): bool
283
+	{
284
+		if ($base !== null) {
285
+			$uri = UriResolver::resolve($base, $uri);
286
+
287
+			return ($uri->getScheme() === $base->getScheme())
288
+				&& ($uri->getAuthority() === $base->getAuthority())
289
+				&& ($uri->getPath() === $base->getPath())
290
+				&& ($uri->getQuery() === $base->getQuery());
291
+		}
292
+
293
+		return $uri->getScheme() === '' && $uri->getAuthority() === '' && $uri->getPath() === '' && $uri->getQuery() === '';
294
+	}
295
+
296
+	/**
297
+	 * Creates a new URI with a specific query string value removed.
298
+	 *
299
+	 * Any existing query string values that exactly match the provided key are
300
+	 * removed.
301
+	 *
302
+	 * @param UriInterface $uri URI to use as a base.
303
+	 * @param string       $key Query string key to remove.
304
+	 */
305
+	public static function withoutQueryValue(UriInterface $uri, string $key): UriInterface
306
+	{
307
+		$result = self::getFilteredQueryString($uri, [$key]);
308
+
309
+		return $uri->withQuery(implode('&', $result));
310
+	}
311
+
312
+	/**
313
+	 * Creates a new URI with a specific query string value.
314
+	 *
315
+	 * Any existing query string values that exactly match the provided key are
316
+	 * removed and replaced with the given key value pair.
317
+	 *
318
+	 * A value of null will set the query string key without a value, e.g. "key"
319
+	 * instead of "key=value".
320
+	 *
321
+	 * @param UriInterface $uri   URI to use as a base.
322
+	 * @param string       $key   Key to set.
323
+	 * @param string|null  $value Value to set
324
+	 */
325
+	public static function withQueryValue(UriInterface $uri, string $key, ?string $value): UriInterface
326
+	{
327
+		$result = self::getFilteredQueryString($uri, [$key]);
328
+
329
+		$result[] = self::generateQueryString($key, $value);
330
+
331
+		return $uri->withQuery(implode('&', $result));
332
+	}
333
+
334
+	/**
335
+	 * Creates a new URI with multiple specific query string values.
336
+	 *
337
+	 * It has the same behavior as withQueryValue() but for an associative array of key => value.
338
+	 *
339
+	 * @param UriInterface    $uri           URI to use as a base.
340
+	 * @param (string|null)[] $keyValueArray Associative array of key and values
341
+	 */
342
+	public static function withQueryValues(UriInterface $uri, array $keyValueArray): UriInterface
343
+	{
344
+		$result = self::getFilteredQueryString($uri, array_keys($keyValueArray));
345
+
346
+		foreach ($keyValueArray as $key => $value) {
347
+			$result[] = self::generateQueryString((string) $key, $value !== null ? (string) $value : null);
348
+		}
349
+
350
+		return $uri->withQuery(implode('&', $result));
351
+	}
352
+
353
+	/**
354
+	 * Creates a URI from a hash of `parse_url` components.
355
+	 *
356
+	 * @see https://www.php.net/manual/en/function.parse-url.php
357
+	 *
358
+	 * @throws MalformedUriException If the components do not form a valid URI.
359
+	 */
360
+	public static function fromParts(array $parts): UriInterface
361
+	{
362
+		$uri = new self();
363
+		$uri->applyParts($parts);
364
+		$uri->validateState();
365
+
366
+		return $uri;
367
+	}
368
+
369
+	public function getScheme(): string
370
+	{
371
+		return $this->scheme;
372
+	}
373
+
374
+	public function getAuthority(): string
375
+	{
376
+		$authority = $this->host;
377
+		if ($this->userInfo !== '') {
378
+			$authority = $this->userInfo.'@'.$authority;
379
+		}
380
+
381
+		if ($this->port !== null) {
382
+			$authority .= ':'.$this->port;
383
+		}
384
+
385
+		return $authority;
386
+	}
387
+
388
+	public function getUserInfo(): string
389
+	{
390
+		return $this->userInfo;
391
+	}
392
+
393
+	public function getHost(): string
394
+	{
395
+		return $this->host;
396
+	}
397
+
398
+	public function getPort(): ?int
399
+	{
400
+		return $this->port;
401
+	}
402
+
403
+	public function getPath(): string
404
+	{
405
+		return $this->path;
406
+	}
407
+
408
+	public function getQuery(): string
409
+	{
410
+		return $this->query;
411
+	}
412
+
413
+	public function getFragment(): string
414
+	{
415
+		return $this->fragment;
416
+	}
417
+
418
+	public function withScheme($scheme): UriInterface
419
+	{
420
+		$scheme = $this->filterScheme($scheme);
421
+
422
+		if ($this->scheme === $scheme) {
423
+			return $this;
424
+		}
425
+
426
+		$new = clone $this;
427
+		$new->scheme = $scheme;
428
+		$new->composedComponents = null;
429
+		$new->removeDefaultPort();
430
+		$new->validateState();
431
+
432
+		return $new;
433
+	}
434
+
435
+	public function withUserInfo($user, $password = null): UriInterface
436
+	{
437
+		$info = $this->filterUserInfoComponent($user);
438
+		if ($password !== null) {
439
+			$info .= ':'.$this->filterUserInfoComponent($password);
440
+		}
441
+
442
+		if ($this->userInfo === $info) {
443
+			return $this;
444
+		}
445
+
446
+		$new = clone $this;
447
+		$new->userInfo = $info;
448
+		$new->composedComponents = null;
449
+		$new->validateState();
450
+
451
+		return $new;
452
+	}
453
+
454
+	public function withHost($host): UriInterface
455
+	{
456
+		$host = $this->filterHost($host);
457
+
458
+		if ($this->host === $host) {
459
+			return $this;
460
+		}
461
+
462
+		$new = clone $this;
463
+		$new->host = $host;
464
+		$new->composedComponents = null;
465
+		$new->validateState();
466
+
467
+		return $new;
468
+	}
469
+
470
+	public function withPort($port): UriInterface
471
+	{
472
+		$port = $this->filterPort($port);
473
+
474
+		if ($this->port === $port) {
475
+			return $this;
476
+		}
477
+
478
+		$new = clone $this;
479
+		$new->port = $port;
480
+		$new->composedComponents = null;
481
+		$new->removeDefaultPort();
482
+		$new->validateState();
483
+
484
+		return $new;
485
+	}
486
+
487
+	public function withPath($path): UriInterface
488
+	{
489
+		$path = $this->filterPath($path);
490
+
491
+		if ($this->path === $path) {
492
+			return $this;
493
+		}
494
+
495
+		$new = clone $this;
496
+		$new->path = $path;
497
+		$new->composedComponents = null;
498
+		$new->validateState();
499
+
500
+		return $new;
501
+	}
502
+
503
+	public function withQuery($query): UriInterface
504
+	{
505
+		$query = $this->filterQueryAndFragment($query);
506
+
507
+		if ($this->query === $query) {
508
+			return $this;
509
+		}
510
+
511
+		$new = clone $this;
512
+		$new->query = $query;
513
+		$new->composedComponents = null;
514
+
515
+		return $new;
516
+	}
517
+
518
+	public function withFragment($fragment): UriInterface
519
+	{
520
+		$fragment = $this->filterQueryAndFragment($fragment);
521
+
522
+		if ($this->fragment === $fragment) {
523
+			return $this;
524
+		}
525
+
526
+		$new = clone $this;
527
+		$new->fragment = $fragment;
528
+		$new->composedComponents = null;
529
+
530
+		return $new;
531
+	}
532
+
533
+	public function jsonSerialize(): string
534
+	{
535
+		return $this->__toString();
536
+	}
537
+
538
+	/**
539
+	 * Apply parse_url parts to a URI.
540
+	 *
541
+	 * @param array $parts Array of parse_url parts to apply.
542
+	 */
543
+	private function applyParts(array $parts): void
544
+	{
545
+		$this->scheme = isset($parts['scheme'])
546
+			? $this->filterScheme($parts['scheme'])
547
+			: '';
548
+		$this->userInfo = isset($parts['user'])
549
+			? $this->filterUserInfoComponent($parts['user'])
550
+			: '';
551
+		$this->host = isset($parts['host'])
552
+			? $this->filterHost($parts['host'])
553
+			: '';
554
+		$this->port = isset($parts['port'])
555
+			? $this->filterPort($parts['port'])
556
+			: null;
557
+		$this->path = isset($parts['path'])
558
+			? $this->filterPath($parts['path'])
559
+			: '';
560
+		$this->query = isset($parts['query'])
561
+			? $this->filterQueryAndFragment($parts['query'])
562
+			: '';
563
+		$this->fragment = isset($parts['fragment'])
564
+			? $this->filterQueryAndFragment($parts['fragment'])
565
+			: '';
566
+		if (isset($parts['pass'])) {
567
+			$this->userInfo .= ':'.$this->filterUserInfoComponent($parts['pass']);
568
+		}
569
+
570
+		$this->removeDefaultPort();
571
+	}
572
+
573
+	/**
574
+	 * @param mixed $scheme
575
+	 *
576
+	 * @throws \InvalidArgumentException If the scheme is invalid.
577
+	 */
578
+	private function filterScheme($scheme): string
579
+	{
580
+		if (!is_string($scheme)) {
581
+			throw new \InvalidArgumentException('Scheme must be a string');
582
+		}
583
+
584
+		return \strtr($scheme, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz');
585
+	}
586
+
587
+	/**
588
+	 * @param mixed $component
589
+	 *
590
+	 * @throws \InvalidArgumentException If the user info is invalid.
591
+	 */
592
+	private function filterUserInfoComponent($component): string
593
+	{
594
+		if (!is_string($component)) {
595
+			throw new \InvalidArgumentException('User info must be a string');
596
+		}
597
+
598
+		return preg_replace_callback(
599
+			'/(?:[^%'.self::CHAR_UNRESERVED.self::CHAR_SUB_DELIMS.']+|%(?![A-Fa-f0-9]{2}))/',
600
+			[$this, 'rawurlencodeMatchZero'],
601
+			$component
602
+		);
603
+	}
604
+
605
+	/**
606
+	 * @param mixed $host
607
+	 *
608
+	 * @throws \InvalidArgumentException If the host is invalid.
609
+	 */
610
+	private function filterHost($host): string
611
+	{
612
+		if (!is_string($host)) {
613
+			throw new \InvalidArgumentException('Host must be a string');
614
+		}
615
+
616
+		return \strtr($host, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz');
617
+	}
618
+
619
+	/**
620
+	 * @param mixed $port
621
+	 *
622
+	 * @throws \InvalidArgumentException If the port is invalid.
623
+	 */
624
+	private function filterPort($port): ?int
625
+	{
626
+		if ($port === null) {
627
+			return null;
628
+		}
629
+
630
+		$port = (int) $port;
631
+		if (0 > $port || 0xFFFF < $port) {
632
+			throw new \InvalidArgumentException(
633
+				sprintf('Invalid port: %d. Must be between 0 and 65535', $port)
634
+			);
635
+		}
636
+
637
+		return $port;
638
+	}
639
+
640
+	/**
641
+	 * @param (string|int)[] $keys
642
+	 *
643
+	 * @return string[]
644
+	 */
645
+	private static function getFilteredQueryString(UriInterface $uri, array $keys): array
646
+	{
647
+		$current = $uri->getQuery();
648
+
649
+		if ($current === '') {
650
+			return [];
651
+		}
652
+
653
+		$decodedKeys = array_map(function ($k): string {
654
+			return rawurldecode((string) $k);
655
+		}, $keys);
656
+
657
+		return array_filter(explode('&', $current), function ($part) use ($decodedKeys) {
658
+			return !in_array(rawurldecode(explode('=', $part)[0]), $decodedKeys, true);
659
+		});
660
+	}
661
+
662
+	private static function generateQueryString(string $key, ?string $value): string
663
+	{
664
+		// Query string separators ("=", "&") within the key or value need to be encoded
665
+		// (while preventing double-encoding) before setting the query string. All other
666
+		// chars that need percent-encoding will be encoded by withQuery().
667
+		$queryString = strtr($key, self::QUERY_SEPARATORS_REPLACEMENT);
668
+
669
+		if ($value !== null) {
670
+			$queryString .= '='.strtr($value, self::QUERY_SEPARATORS_REPLACEMENT);
671
+		}
672
+
673
+		return $queryString;
674
+	}
675
+
676
+	private function removeDefaultPort(): void
677
+	{
678
+		if ($this->port !== null && self::isDefaultPort($this)) {
679
+			$this->port = null;
680
+		}
681
+	}
682
+
683
+	/**
684
+	 * Filters the path of a URI
685
+	 *
686
+	 * @param mixed $path
687
+	 *
688
+	 * @throws \InvalidArgumentException If the path is invalid.
689
+	 */
690
+	private function filterPath($path): string
691
+	{
692
+		if (!is_string($path)) {
693
+			throw new \InvalidArgumentException('Path must be a string');
694
+		}
695
+
696
+		return preg_replace_callback(
697
+			'/(?:[^'.self::CHAR_UNRESERVED.self::CHAR_SUB_DELIMS.'%:@\/]++|%(?![A-Fa-f0-9]{2}))/',
698
+			[$this, 'rawurlencodeMatchZero'],
699
+			$path
700
+		);
701
+	}
702
+
703
+	/**
704
+	 * Filters the query string or fragment of a URI.
705
+	 *
706
+	 * @param mixed $str
707
+	 *
708
+	 * @throws \InvalidArgumentException If the query or fragment is invalid.
709
+	 */
710
+	private function filterQueryAndFragment($str): string
711
+	{
712
+		if (!is_string($str)) {
713
+			throw new \InvalidArgumentException('Query and fragment must be a string');
714
+		}
715
+
716
+		return preg_replace_callback(
717
+			'/(?:[^'.self::CHAR_UNRESERVED.self::CHAR_SUB_DELIMS.'%:@\/\?]++|%(?![A-Fa-f0-9]{2}))/',
718
+			[$this, 'rawurlencodeMatchZero'],
719
+			$str
720
+		);
721
+	}
722
+
723
+	private function rawurlencodeMatchZero(array $match): string
724
+	{
725
+		return rawurlencode($match[0]);
726
+	}
727
+
728
+	private function validateState(): void
729
+	{
730
+		if ($this->host === '' && ($this->scheme === 'http' || $this->scheme === 'https')) {
731
+			$this->host = self::HTTP_DEFAULT_HOST;
732
+		}
733
+
734
+		if ($this->getAuthority() === '') {
735
+			if (0 === strpos($this->path, '//')) {
736
+				throw new MalformedUriException('The path of a URI without an authority must not start with two slashes "//"');
737
+			}
738
+			if ($this->scheme === '' && false !== strpos(explode('/', $this->path, 2)[0], ':')) {
739
+				throw new MalformedUriException('A relative URI must not have a path beginning with a segment containing a colon');
740
+			}
741
+		}
742
+	}
743 743
 }
Please login to merge, or discard this patch.
Spacing   +6 added lines, -6 removed lines patch added patch discarded remove patch
@@ -116,7 +116,7 @@  discard block
 block discarded – undo
116 116
         /** @var string */
117 117
         $encodedUrl = preg_replace_callback(
118 118
             '%[^:/@?&=#]+%usD',
119
-            static function ($matches) {
119
+            static function($matches) {
120 120
                 return urlencode($matches[0]);
121 121
             },
122 122
             $url
@@ -344,7 +344,7 @@  discard block
 block discarded – undo
344 344
         $result = self::getFilteredQueryString($uri, array_keys($keyValueArray));
345 345
 
346 346
         foreach ($keyValueArray as $key => $value) {
347
-            $result[] = self::generateQueryString((string) $key, $value !== null ? (string) $value : null);
347
+            $result[] = self::generateQueryString((string)$key, $value !== null ? (string)$value : null);
348 348
         }
349 349
 
350 350
         return $uri->withQuery(implode('&', $result));
@@ -627,7 +627,7 @@  discard block
 block discarded – undo
627 627
             return null;
628 628
         }
629 629
 
630
-        $port = (int) $port;
630
+        $port = (int)$port;
631 631
         if (0 > $port || 0xFFFF < $port) {
632 632
             throw new \InvalidArgumentException(
633 633
                 sprintf('Invalid port: %d. Must be between 0 and 65535', $port)
@@ -650,11 +650,11 @@  discard block
 block discarded – undo
650 650
             return [];
651 651
         }
652 652
 
653
-        $decodedKeys = array_map(function ($k): string {
654
-            return rawurldecode((string) $k);
653
+        $decodedKeys = array_map(function($k): string {
654
+            return rawurldecode((string)$k);
655 655
         }, $keys);
656 656
 
657
-        return array_filter(explode('&', $current), function ($part) use ($decodedKeys) {
657
+        return array_filter(explode('&', $current), function($part) use ($decodedKeys) {
658 658
             return !in_array(rawurldecode(explode('=', $part)[0]), $decodedKeys, true);
659 659
         });
660 660
     }
Please login to merge, or discard this patch.
lib/Vendor/GuzzleHttp/Psr7/Request.php 2 patches
Indentation   +142 added lines, -142 removed lines patch added patch discarded remove patch
@@ -14,146 +14,146 @@
 block discarded – undo
14 14
  */
15 15
 class Request implements RequestInterface
16 16
 {
17
-    use MessageTrait;
18
-
19
-    /** @var string */
20
-    private $method;
21
-
22
-    /** @var string|null */
23
-    private $requestTarget;
24
-
25
-    /** @var UriInterface */
26
-    private $uri;
27
-
28
-    /**
29
-     * @param string                               $method  HTTP method
30
-     * @param string|UriInterface                  $uri     URI
31
-     * @param (string|string[])[]                  $headers Request headers
32
-     * @param string|resource|StreamInterface|null $body    Request body
33
-     * @param string                               $version Protocol version
34
-     */
35
-    public function __construct(
36
-        string $method,
37
-        $uri,
38
-        array $headers = [],
39
-        $body = null,
40
-        string $version = '1.1'
41
-    ) {
42
-        $this->assertMethod($method);
43
-        if (!($uri instanceof UriInterface)) {
44
-            $uri = new Uri($uri);
45
-        }
46
-
47
-        $this->method = strtoupper($method);
48
-        $this->uri = $uri;
49
-        $this->setHeaders($headers);
50
-        $this->protocol = $version;
51
-
52
-        if (!isset($this->headerNames['host'])) {
53
-            $this->updateHostFromUri();
54
-        }
55
-
56
-        if ($body !== '' && $body !== null) {
57
-            $this->stream = Utils::streamFor($body);
58
-        }
59
-    }
60
-
61
-    public function getRequestTarget(): string
62
-    {
63
-        if ($this->requestTarget !== null) {
64
-            return $this->requestTarget;
65
-        }
66
-
67
-        $target = $this->uri->getPath();
68
-        if ($target === '') {
69
-            $target = '/';
70
-        }
71
-        if ($this->uri->getQuery() != '') {
72
-            $target .= '?'.$this->uri->getQuery();
73
-        }
74
-
75
-        return $target;
76
-    }
77
-
78
-    public function withRequestTarget($requestTarget): RequestInterface
79
-    {
80
-        if (preg_match('#\s#', $requestTarget)) {
81
-            throw new InvalidArgumentException(
82
-                'Invalid request target provided; cannot contain whitespace'
83
-            );
84
-        }
85
-
86
-        $new = clone $this;
87
-        $new->requestTarget = $requestTarget;
88
-
89
-        return $new;
90
-    }
91
-
92
-    public function getMethod(): string
93
-    {
94
-        return $this->method;
95
-    }
96
-
97
-    public function withMethod($method): RequestInterface
98
-    {
99
-        $this->assertMethod($method);
100
-        $new = clone $this;
101
-        $new->method = strtoupper($method);
102
-
103
-        return $new;
104
-    }
105
-
106
-    public function getUri(): UriInterface
107
-    {
108
-        return $this->uri;
109
-    }
110
-
111
-    public function withUri(UriInterface $uri, $preserveHost = false): RequestInterface
112
-    {
113
-        if ($uri === $this->uri) {
114
-            return $this;
115
-        }
116
-
117
-        $new = clone $this;
118
-        $new->uri = $uri;
119
-
120
-        if (!$preserveHost || !isset($this->headerNames['host'])) {
121
-            $new->updateHostFromUri();
122
-        }
123
-
124
-        return $new;
125
-    }
126
-
127
-    private function updateHostFromUri(): void
128
-    {
129
-        $host = $this->uri->getHost();
130
-
131
-        if ($host == '') {
132
-            return;
133
-        }
134
-
135
-        if (($port = $this->uri->getPort()) !== null) {
136
-            $host .= ':'.$port;
137
-        }
138
-
139
-        if (isset($this->headerNames['host'])) {
140
-            $header = $this->headerNames['host'];
141
-        } else {
142
-            $header = 'Host';
143
-            $this->headerNames['host'] = 'Host';
144
-        }
145
-        // Ensure Host is the first header.
146
-        // See: https://datatracker.ietf.org/doc/html/rfc7230#section-5.4
147
-        $this->headers = [$header => [$host]] + $this->headers;
148
-    }
149
-
150
-    /**
151
-     * @param mixed $method
152
-     */
153
-    private function assertMethod($method): void
154
-    {
155
-        if (!is_string($method) || $method === '') {
156
-            throw new InvalidArgumentException('Method must be a non-empty string.');
157
-        }
158
-    }
17
+	use MessageTrait;
18
+
19
+	/** @var string */
20
+	private $method;
21
+
22
+	/** @var string|null */
23
+	private $requestTarget;
24
+
25
+	/** @var UriInterface */
26
+	private $uri;
27
+
28
+	/**
29
+	 * @param string                               $method  HTTP method
30
+	 * @param string|UriInterface                  $uri     URI
31
+	 * @param (string|string[])[]                  $headers Request headers
32
+	 * @param string|resource|StreamInterface|null $body    Request body
33
+	 * @param string                               $version Protocol version
34
+	 */
35
+	public function __construct(
36
+		string $method,
37
+		$uri,
38
+		array $headers = [],
39
+		$body = null,
40
+		string $version = '1.1'
41
+	) {
42
+		$this->assertMethod($method);
43
+		if (!($uri instanceof UriInterface)) {
44
+			$uri = new Uri($uri);
45
+		}
46
+
47
+		$this->method = strtoupper($method);
48
+		$this->uri = $uri;
49
+		$this->setHeaders($headers);
50
+		$this->protocol = $version;
51
+
52
+		if (!isset($this->headerNames['host'])) {
53
+			$this->updateHostFromUri();
54
+		}
55
+
56
+		if ($body !== '' && $body !== null) {
57
+			$this->stream = Utils::streamFor($body);
58
+		}
59
+	}
60
+
61
+	public function getRequestTarget(): string
62
+	{
63
+		if ($this->requestTarget !== null) {
64
+			return $this->requestTarget;
65
+		}
66
+
67
+		$target = $this->uri->getPath();
68
+		if ($target === '') {
69
+			$target = '/';
70
+		}
71
+		if ($this->uri->getQuery() != '') {
72
+			$target .= '?'.$this->uri->getQuery();
73
+		}
74
+
75
+		return $target;
76
+	}
77
+
78
+	public function withRequestTarget($requestTarget): RequestInterface
79
+	{
80
+		if (preg_match('#\s#', $requestTarget)) {
81
+			throw new InvalidArgumentException(
82
+				'Invalid request target provided; cannot contain whitespace'
83
+			);
84
+		}
85
+
86
+		$new = clone $this;
87
+		$new->requestTarget = $requestTarget;
88
+
89
+		return $new;
90
+	}
91
+
92
+	public function getMethod(): string
93
+	{
94
+		return $this->method;
95
+	}
96
+
97
+	public function withMethod($method): RequestInterface
98
+	{
99
+		$this->assertMethod($method);
100
+		$new = clone $this;
101
+		$new->method = strtoupper($method);
102
+
103
+		return $new;
104
+	}
105
+
106
+	public function getUri(): UriInterface
107
+	{
108
+		return $this->uri;
109
+	}
110
+
111
+	public function withUri(UriInterface $uri, $preserveHost = false): RequestInterface
112
+	{
113
+		if ($uri === $this->uri) {
114
+			return $this;
115
+		}
116
+
117
+		$new = clone $this;
118
+		$new->uri = $uri;
119
+
120
+		if (!$preserveHost || !isset($this->headerNames['host'])) {
121
+			$new->updateHostFromUri();
122
+		}
123
+
124
+		return $new;
125
+	}
126
+
127
+	private function updateHostFromUri(): void
128
+	{
129
+		$host = $this->uri->getHost();
130
+
131
+		if ($host == '') {
132
+			return;
133
+		}
134
+
135
+		if (($port = $this->uri->getPort()) !== null) {
136
+			$host .= ':'.$port;
137
+		}
138
+
139
+		if (isset($this->headerNames['host'])) {
140
+			$header = $this->headerNames['host'];
141
+		} else {
142
+			$header = 'Host';
143
+			$this->headerNames['host'] = 'Host';
144
+		}
145
+		// Ensure Host is the first header.
146
+		// See: https://datatracker.ietf.org/doc/html/rfc7230#section-5.4
147
+		$this->headers = [$header => [$host]] + $this->headers;
148
+	}
149
+
150
+	/**
151
+	 * @param mixed $method
152
+	 */
153
+	private function assertMethod($method): void
154
+	{
155
+		if (!is_string($method) || $method === '') {
156
+			throw new InvalidArgumentException('Method must be a non-empty string.');
157
+		}
158
+	}
159 159
 }
Please login to merge, or discard this patch.
Braces   +1 added lines, -2 removed lines patch added patch discarded remove patch
@@ -12,8 +12,7 @@
 block discarded – undo
12 12
 /**
13 13
  * PSR-7 request implementation.
14 14
  */
15
-class Request implements RequestInterface
16
-{
15
+class Request implements RequestInterface {
17 16
     use MessageTrait;
18 17
 
19 18
     /** @var string */
Please login to merge, or discard this patch.
lib/Vendor/GuzzleHttp/Psr7/UploadedFile.php 2 patches
Indentation   +197 added lines, -197 removed lines patch added patch discarded remove patch
@@ -11,201 +11,201 @@
 block discarded – undo
11 11
 
12 12
 class UploadedFile implements UploadedFileInterface
13 13
 {
14
-    private const ERRORS = [
15
-        UPLOAD_ERR_OK,
16
-        UPLOAD_ERR_INI_SIZE,
17
-        UPLOAD_ERR_FORM_SIZE,
18
-        UPLOAD_ERR_PARTIAL,
19
-        UPLOAD_ERR_NO_FILE,
20
-        UPLOAD_ERR_NO_TMP_DIR,
21
-        UPLOAD_ERR_CANT_WRITE,
22
-        UPLOAD_ERR_EXTENSION,
23
-    ];
24
-
25
-    /**
26
-     * @var string|null
27
-     */
28
-    private $clientFilename;
29
-
30
-    /**
31
-     * @var string|null
32
-     */
33
-    private $clientMediaType;
34
-
35
-    /**
36
-     * @var int
37
-     */
38
-    private $error;
39
-
40
-    /**
41
-     * @var string|null
42
-     */
43
-    private $file;
44
-
45
-    /**
46
-     * @var bool
47
-     */
48
-    private $moved = false;
49
-
50
-    /**
51
-     * @var int|null
52
-     */
53
-    private $size;
54
-
55
-    /**
56
-     * @var StreamInterface|null
57
-     */
58
-    private $stream;
59
-
60
-    /**
61
-     * @param StreamInterface|string|resource $streamOrFile
62
-     */
63
-    public function __construct(
64
-        $streamOrFile,
65
-        ?int $size,
66
-        int $errorStatus,
67
-        string $clientFilename = null,
68
-        string $clientMediaType = null
69
-    ) {
70
-        $this->setError($errorStatus);
71
-        $this->size = $size;
72
-        $this->clientFilename = $clientFilename;
73
-        $this->clientMediaType = $clientMediaType;
74
-
75
-        if ($this->isOk()) {
76
-            $this->setStreamOrFile($streamOrFile);
77
-        }
78
-    }
79
-
80
-    /**
81
-     * Depending on the value set file or stream variable
82
-     *
83
-     * @param StreamInterface|string|resource $streamOrFile
84
-     *
85
-     * @throws InvalidArgumentException
86
-     */
87
-    private function setStreamOrFile($streamOrFile): void
88
-    {
89
-        if (is_string($streamOrFile)) {
90
-            $this->file = $streamOrFile;
91
-        } elseif (is_resource($streamOrFile)) {
92
-            $this->stream = new Stream($streamOrFile);
93
-        } elseif ($streamOrFile instanceof StreamInterface) {
94
-            $this->stream = $streamOrFile;
95
-        } else {
96
-            throw new InvalidArgumentException(
97
-                'Invalid stream or file provided for UploadedFile'
98
-            );
99
-        }
100
-    }
101
-
102
-    /**
103
-     * @throws InvalidArgumentException
104
-     */
105
-    private function setError(int $error): void
106
-    {
107
-        if (false === in_array($error, UploadedFile::ERRORS, true)) {
108
-            throw new InvalidArgumentException(
109
-                'Invalid error status for UploadedFile'
110
-            );
111
-        }
112
-
113
-        $this->error = $error;
114
-    }
115
-
116
-    private static function isStringNotEmpty($param): bool
117
-    {
118
-        return is_string($param) && false === empty($param);
119
-    }
120
-
121
-    /**
122
-     * Return true if there is no upload error
123
-     */
124
-    private function isOk(): bool
125
-    {
126
-        return $this->error === UPLOAD_ERR_OK;
127
-    }
128
-
129
-    public function isMoved(): bool
130
-    {
131
-        return $this->moved;
132
-    }
133
-
134
-    /**
135
-     * @throws RuntimeException if is moved or not ok
136
-     */
137
-    private function validateActive(): void
138
-    {
139
-        if (false === $this->isOk()) {
140
-            throw new RuntimeException('Cannot retrieve stream due to upload error');
141
-        }
142
-
143
-        if ($this->isMoved()) {
144
-            throw new RuntimeException('Cannot retrieve stream after it has already been moved');
145
-        }
146
-    }
147
-
148
-    public function getStream(): StreamInterface
149
-    {
150
-        $this->validateActive();
151
-
152
-        if ($this->stream instanceof StreamInterface) {
153
-            return $this->stream;
154
-        }
155
-
156
-        /** @var string $file */
157
-        $file = $this->file;
158
-
159
-        return new LazyOpenStream($file, 'r+');
160
-    }
161
-
162
-    public function moveTo($targetPath): void
163
-    {
164
-        $this->validateActive();
165
-
166
-        if (false === self::isStringNotEmpty($targetPath)) {
167
-            throw new InvalidArgumentException(
168
-                'Invalid path provided for move operation; must be a non-empty string'
169
-            );
170
-        }
171
-
172
-        if ($this->file) {
173
-            $this->moved = PHP_SAPI === 'cli'
174
-                ? rename($this->file, $targetPath)
175
-                : move_uploaded_file($this->file, $targetPath);
176
-        } else {
177
-            Utils::copyToStream(
178
-                $this->getStream(),
179
-                new LazyOpenStream($targetPath, 'w')
180
-            );
181
-
182
-            $this->moved = true;
183
-        }
184
-
185
-        if (false === $this->moved) {
186
-            throw new RuntimeException(
187
-                sprintf('Uploaded file could not be moved to %s', $targetPath)
188
-            );
189
-        }
190
-    }
191
-
192
-    public function getSize(): ?int
193
-    {
194
-        return $this->size;
195
-    }
196
-
197
-    public function getError(): int
198
-    {
199
-        return $this->error;
200
-    }
201
-
202
-    public function getClientFilename(): ?string
203
-    {
204
-        return $this->clientFilename;
205
-    }
206
-
207
-    public function getClientMediaType(): ?string
208
-    {
209
-        return $this->clientMediaType;
210
-    }
14
+	private const ERRORS = [
15
+		UPLOAD_ERR_OK,
16
+		UPLOAD_ERR_INI_SIZE,
17
+		UPLOAD_ERR_FORM_SIZE,
18
+		UPLOAD_ERR_PARTIAL,
19
+		UPLOAD_ERR_NO_FILE,
20
+		UPLOAD_ERR_NO_TMP_DIR,
21
+		UPLOAD_ERR_CANT_WRITE,
22
+		UPLOAD_ERR_EXTENSION,
23
+	];
24
+
25
+	/**
26
+	 * @var string|null
27
+	 */
28
+	private $clientFilename;
29
+
30
+	/**
31
+	 * @var string|null
32
+	 */
33
+	private $clientMediaType;
34
+
35
+	/**
36
+	 * @var int
37
+	 */
38
+	private $error;
39
+
40
+	/**
41
+	 * @var string|null
42
+	 */
43
+	private $file;
44
+
45
+	/**
46
+	 * @var bool
47
+	 */
48
+	private $moved = false;
49
+
50
+	/**
51
+	 * @var int|null
52
+	 */
53
+	private $size;
54
+
55
+	/**
56
+	 * @var StreamInterface|null
57
+	 */
58
+	private $stream;
59
+
60
+	/**
61
+	 * @param StreamInterface|string|resource $streamOrFile
62
+	 */
63
+	public function __construct(
64
+		$streamOrFile,
65
+		?int $size,
66
+		int $errorStatus,
67
+		string $clientFilename = null,
68
+		string $clientMediaType = null
69
+	) {
70
+		$this->setError($errorStatus);
71
+		$this->size = $size;
72
+		$this->clientFilename = $clientFilename;
73
+		$this->clientMediaType = $clientMediaType;
74
+
75
+		if ($this->isOk()) {
76
+			$this->setStreamOrFile($streamOrFile);
77
+		}
78
+	}
79
+
80
+	/**
81
+	 * Depending on the value set file or stream variable
82
+	 *
83
+	 * @param StreamInterface|string|resource $streamOrFile
84
+	 *
85
+	 * @throws InvalidArgumentException
86
+	 */
87
+	private function setStreamOrFile($streamOrFile): void
88
+	{
89
+		if (is_string($streamOrFile)) {
90
+			$this->file = $streamOrFile;
91
+		} elseif (is_resource($streamOrFile)) {
92
+			$this->stream = new Stream($streamOrFile);
93
+		} elseif ($streamOrFile instanceof StreamInterface) {
94
+			$this->stream = $streamOrFile;
95
+		} else {
96
+			throw new InvalidArgumentException(
97
+				'Invalid stream or file provided for UploadedFile'
98
+			);
99
+		}
100
+	}
101
+
102
+	/**
103
+	 * @throws InvalidArgumentException
104
+	 */
105
+	private function setError(int $error): void
106
+	{
107
+		if (false === in_array($error, UploadedFile::ERRORS, true)) {
108
+			throw new InvalidArgumentException(
109
+				'Invalid error status for UploadedFile'
110
+			);
111
+		}
112
+
113
+		$this->error = $error;
114
+	}
115
+
116
+	private static function isStringNotEmpty($param): bool
117
+	{
118
+		return is_string($param) && false === empty($param);
119
+	}
120
+
121
+	/**
122
+	 * Return true if there is no upload error
123
+	 */
124
+	private function isOk(): bool
125
+	{
126
+		return $this->error === UPLOAD_ERR_OK;
127
+	}
128
+
129
+	public function isMoved(): bool
130
+	{
131
+		return $this->moved;
132
+	}
133
+
134
+	/**
135
+	 * @throws RuntimeException if is moved or not ok
136
+	 */
137
+	private function validateActive(): void
138
+	{
139
+		if (false === $this->isOk()) {
140
+			throw new RuntimeException('Cannot retrieve stream due to upload error');
141
+		}
142
+
143
+		if ($this->isMoved()) {
144
+			throw new RuntimeException('Cannot retrieve stream after it has already been moved');
145
+		}
146
+	}
147
+
148
+	public function getStream(): StreamInterface
149
+	{
150
+		$this->validateActive();
151
+
152
+		if ($this->stream instanceof StreamInterface) {
153
+			return $this->stream;
154
+		}
155
+
156
+		/** @var string $file */
157
+		$file = $this->file;
158
+
159
+		return new LazyOpenStream($file, 'r+');
160
+	}
161
+
162
+	public function moveTo($targetPath): void
163
+	{
164
+		$this->validateActive();
165
+
166
+		if (false === self::isStringNotEmpty($targetPath)) {
167
+			throw new InvalidArgumentException(
168
+				'Invalid path provided for move operation; must be a non-empty string'
169
+			);
170
+		}
171
+
172
+		if ($this->file) {
173
+			$this->moved = PHP_SAPI === 'cli'
174
+				? rename($this->file, $targetPath)
175
+				: move_uploaded_file($this->file, $targetPath);
176
+		} else {
177
+			Utils::copyToStream(
178
+				$this->getStream(),
179
+				new LazyOpenStream($targetPath, 'w')
180
+			);
181
+
182
+			$this->moved = true;
183
+		}
184
+
185
+		if (false === $this->moved) {
186
+			throw new RuntimeException(
187
+				sprintf('Uploaded file could not be moved to %s', $targetPath)
188
+			);
189
+		}
190
+	}
191
+
192
+	public function getSize(): ?int
193
+	{
194
+		return $this->size;
195
+	}
196
+
197
+	public function getError(): int
198
+	{
199
+		return $this->error;
200
+	}
201
+
202
+	public function getClientFilename(): ?string
203
+	{
204
+		return $this->clientFilename;
205
+	}
206
+
207
+	public function getClientMediaType(): ?string
208
+	{
209
+		return $this->clientMediaType;
210
+	}
211 211
 }
Please login to merge, or discard this patch.
Braces   +1 added lines, -2 removed lines patch added patch discarded remove patch
@@ -9,8 +9,7 @@
 block discarded – undo
9 9
 use OCA\FullTextSearch_Elasticsearch\Vendor\Psr\Http\Message\UploadedFileInterface;
10 10
 use RuntimeException;
11 11
 
12
-class UploadedFile implements UploadedFileInterface
13
-{
12
+class UploadedFile implements UploadedFileInterface {
14 13
     private const ERRORS = [
15 14
         UPLOAD_ERR_OK,
16 15
         UPLOAD_ERR_INI_SIZE,
Please login to merge, or discard this patch.
lib/Vendor/GuzzleHttp/Psr7/MimeType.php 2 patches
Indentation   +1248 added lines, -1248 removed lines patch added patch discarded remove patch
@@ -6,1254 +6,1254 @@
 block discarded – undo
6 6
 
7 7
 final class MimeType
8 8
 {
9
-    private const MIME_TYPES = [
10
-        '1km' => 'application/vnd.1000minds.decision-model+xml',
11
-        '3dml' => 'text/vnd.in3d.3dml',
12
-        '3ds' => 'image/x-3ds',
13
-        '3g2' => 'video/3gpp2',
14
-        '3gp' => 'video/3gp',
15
-        '3gpp' => 'video/3gpp',
16
-        '3mf' => 'model/3mf',
17
-        '7z' => 'application/x-7z-compressed',
18
-        '7zip' => 'application/x-7z-compressed',
19
-        '123' => 'application/vnd.lotus-1-2-3',
20
-        'aab' => 'application/x-authorware-bin',
21
-        'aac' => 'audio/aac',
22
-        'aam' => 'application/x-authorware-map',
23
-        'aas' => 'application/x-authorware-seg',
24
-        'abw' => 'application/x-abiword',
25
-        'ac' => 'application/vnd.nokia.n-gage.ac+xml',
26
-        'ac3' => 'audio/ac3',
27
-        'acc' => 'application/vnd.americandynamics.acc',
28
-        'ace' => 'application/x-ace-compressed',
29
-        'acu' => 'application/vnd.acucobol',
30
-        'acutc' => 'application/vnd.acucorp',
31
-        'adp' => 'audio/adpcm',
32
-        'adts' => 'audio/aac',
33
-        'aep' => 'application/vnd.audiograph',
34
-        'afm' => 'application/x-font-type1',
35
-        'afp' => 'application/vnd.ibm.modcap',
36
-        'age' => 'application/vnd.age',
37
-        'ahead' => 'application/vnd.ahead.space',
38
-        'ai' => 'application/pdf',
39
-        'aif' => 'audio/x-aiff',
40
-        'aifc' => 'audio/x-aiff',
41
-        'aiff' => 'audio/x-aiff',
42
-        'air' => 'application/vnd.adobe.air-application-installer-package+zip',
43
-        'ait' => 'application/vnd.dvb.ait',
44
-        'ami' => 'application/vnd.amiga.ami',
45
-        'aml' => 'application/automationml-aml+xml',
46
-        'amlx' => 'application/automationml-amlx+zip',
47
-        'amr' => 'audio/amr',
48
-        'apk' => 'application/vnd.android.package-archive',
49
-        'apng' => 'image/apng',
50
-        'appcache' => 'text/cache-manifest',
51
-        'appinstaller' => 'application/appinstaller',
52
-        'application' => 'application/x-ms-application',
53
-        'appx' => 'application/appx',
54
-        'appxbundle' => 'application/appxbundle',
55
-        'apr' => 'application/vnd.lotus-approach',
56
-        'arc' => 'application/x-freearc',
57
-        'arj' => 'application/x-arj',
58
-        'asc' => 'application/pgp-signature',
59
-        'asf' => 'video/x-ms-asf',
60
-        'asm' => 'text/x-asm',
61
-        'aso' => 'application/vnd.accpac.simply.aso',
62
-        'asx' => 'video/x-ms-asf',
63
-        'atc' => 'application/vnd.acucorp',
64
-        'atom' => 'application/atom+xml',
65
-        'atomcat' => 'application/atomcat+xml',
66
-        'atomdeleted' => 'application/atomdeleted+xml',
67
-        'atomsvc' => 'application/atomsvc+xml',
68
-        'atx' => 'application/vnd.antix.game-component',
69
-        'au' => 'audio/x-au',
70
-        'avci' => 'image/avci',
71
-        'avcs' => 'image/avcs',
72
-        'avi' => 'video/x-msvideo',
73
-        'avif' => 'image/avif',
74
-        'aw' => 'application/applixware',
75
-        'azf' => 'application/vnd.airzip.filesecure.azf',
76
-        'azs' => 'application/vnd.airzip.filesecure.azs',
77
-        'azv' => 'image/vnd.airzip.accelerator.azv',
78
-        'azw' => 'application/vnd.amazon.ebook',
79
-        'b16' => 'image/vnd.pco.b16',
80
-        'bat' => 'application/x-msdownload',
81
-        'bcpio' => 'application/x-bcpio',
82
-        'bdf' => 'application/x-font-bdf',
83
-        'bdm' => 'application/vnd.syncml.dm+wbxml',
84
-        'bdoc' => 'application/x-bdoc',
85
-        'bed' => 'application/vnd.realvnc.bed',
86
-        'bh2' => 'application/vnd.fujitsu.oasysprs',
87
-        'bin' => 'application/octet-stream',
88
-        'blb' => 'application/x-blorb',
89
-        'blorb' => 'application/x-blorb',
90
-        'bmi' => 'application/vnd.bmi',
91
-        'bmml' => 'application/vnd.balsamiq.bmml+xml',
92
-        'bmp' => 'image/bmp',
93
-        'book' => 'application/vnd.framemaker',
94
-        'box' => 'application/vnd.previewsystems.box',
95
-        'boz' => 'application/x-bzip2',
96
-        'bpk' => 'application/octet-stream',
97
-        'bpmn' => 'application/octet-stream',
98
-        'bsp' => 'model/vnd.valve.source.compiled-map',
99
-        'btf' => 'image/prs.btif',
100
-        'btif' => 'image/prs.btif',
101
-        'buffer' => 'application/octet-stream',
102
-        'bz' => 'application/x-bzip',
103
-        'bz2' => 'application/x-bzip2',
104
-        'c' => 'text/x-c',
105
-        'c4d' => 'application/vnd.clonk.c4group',
106
-        'c4f' => 'application/vnd.clonk.c4group',
107
-        'c4g' => 'application/vnd.clonk.c4group',
108
-        'c4p' => 'application/vnd.clonk.c4group',
109
-        'c4u' => 'application/vnd.clonk.c4group',
110
-        'c11amc' => 'application/vnd.cluetrust.cartomobile-config',
111
-        'c11amz' => 'application/vnd.cluetrust.cartomobile-config-pkg',
112
-        'cab' => 'application/vnd.ms-cab-compressed',
113
-        'caf' => 'audio/x-caf',
114
-        'cap' => 'application/vnd.tcpdump.pcap',
115
-        'car' => 'application/vnd.curl.car',
116
-        'cat' => 'application/vnd.ms-pki.seccat',
117
-        'cb7' => 'application/x-cbr',
118
-        'cba' => 'application/x-cbr',
119
-        'cbr' => 'application/x-cbr',
120
-        'cbt' => 'application/x-cbr',
121
-        'cbz' => 'application/x-cbr',
122
-        'cc' => 'text/x-c',
123
-        'cco' => 'application/x-cocoa',
124
-        'cct' => 'application/x-director',
125
-        'ccxml' => 'application/ccxml+xml',
126
-        'cdbcmsg' => 'application/vnd.contact.cmsg',
127
-        'cdf' => 'application/x-netcdf',
128
-        'cdfx' => 'application/cdfx+xml',
129
-        'cdkey' => 'application/vnd.mediastation.cdkey',
130
-        'cdmia' => 'application/cdmi-capability',
131
-        'cdmic' => 'application/cdmi-container',
132
-        'cdmid' => 'application/cdmi-domain',
133
-        'cdmio' => 'application/cdmi-object',
134
-        'cdmiq' => 'application/cdmi-queue',
135
-        'cdr' => 'application/cdr',
136
-        'cdx' => 'chemical/x-cdx',
137
-        'cdxml' => 'application/vnd.chemdraw+xml',
138
-        'cdy' => 'application/vnd.cinderella',
139
-        'cer' => 'application/pkix-cert',
140
-        'cfs' => 'application/x-cfs-compressed',
141
-        'cgm' => 'image/cgm',
142
-        'chat' => 'application/x-chat',
143
-        'chm' => 'application/vnd.ms-htmlhelp',
144
-        'chrt' => 'application/vnd.kde.kchart',
145
-        'cif' => 'chemical/x-cif',
146
-        'cii' => 'application/vnd.anser-web-certificate-issue-initiation',
147
-        'cil' => 'application/vnd.ms-artgalry',
148
-        'cjs' => 'application/node',
149
-        'cla' => 'application/vnd.claymore',
150
-        'class' => 'application/octet-stream',
151
-        'cld' => 'model/vnd.cld',
152
-        'clkk' => 'application/vnd.crick.clicker.keyboard',
153
-        'clkp' => 'application/vnd.crick.clicker.palette',
154
-        'clkt' => 'application/vnd.crick.clicker.template',
155
-        'clkw' => 'application/vnd.crick.clicker.wordbank',
156
-        'clkx' => 'application/vnd.crick.clicker',
157
-        'clp' => 'application/x-msclip',
158
-        'cmc' => 'application/vnd.cosmocaller',
159
-        'cmdf' => 'chemical/x-cmdf',
160
-        'cml' => 'chemical/x-cml',
161
-        'cmp' => 'application/vnd.yellowriver-custom-menu',
162
-        'cmx' => 'image/x-cmx',
163
-        'cod' => 'application/vnd.rim.cod',
164
-        'coffee' => 'text/coffeescript',
165
-        'com' => 'application/x-msdownload',
166
-        'conf' => 'text/plain',
167
-        'cpio' => 'application/x-cpio',
168
-        'cpl' => 'application/cpl+xml',
169
-        'cpp' => 'text/x-c',
170
-        'cpt' => 'application/mac-compactpro',
171
-        'crd' => 'application/x-mscardfile',
172
-        'crl' => 'application/pkix-crl',
173
-        'crt' => 'application/x-x509-ca-cert',
174
-        'crx' => 'application/x-chrome-extension',
175
-        'cryptonote' => 'application/vnd.rig.cryptonote',
176
-        'csh' => 'application/x-csh',
177
-        'csl' => 'application/vnd.citationstyles.style+xml',
178
-        'csml' => 'chemical/x-csml',
179
-        'csp' => 'application/vnd.commonspace',
180
-        'csr' => 'application/octet-stream',
181
-        'css' => 'text/css',
182
-        'cst' => 'application/x-director',
183
-        'csv' => 'text/csv',
184
-        'cu' => 'application/cu-seeme',
185
-        'curl' => 'text/vnd.curl',
186
-        'cwl' => 'application/cwl',
187
-        'cww' => 'application/prs.cww',
188
-        'cxt' => 'application/x-director',
189
-        'cxx' => 'text/x-c',
190
-        'dae' => 'model/vnd.collada+xml',
191
-        'daf' => 'application/vnd.mobius.daf',
192
-        'dart' => 'application/vnd.dart',
193
-        'dataless' => 'application/vnd.fdsn.seed',
194
-        'davmount' => 'application/davmount+xml',
195
-        'dbf' => 'application/vnd.dbf',
196
-        'dbk' => 'application/docbook+xml',
197
-        'dcr' => 'application/x-director',
198
-        'dcurl' => 'text/vnd.curl.dcurl',
199
-        'dd2' => 'application/vnd.oma.dd2+xml',
200
-        'ddd' => 'application/vnd.fujixerox.ddd',
201
-        'ddf' => 'application/vnd.syncml.dmddf+xml',
202
-        'dds' => 'image/vnd.ms-dds',
203
-        'deb' => 'application/x-debian-package',
204
-        'def' => 'text/plain',
205
-        'deploy' => 'application/octet-stream',
206
-        'der' => 'application/x-x509-ca-cert',
207
-        'dfac' => 'application/vnd.dreamfactory',
208
-        'dgc' => 'application/x-dgc-compressed',
209
-        'dib' => 'image/bmp',
210
-        'dic' => 'text/x-c',
211
-        'dir' => 'application/x-director',
212
-        'dis' => 'application/vnd.mobius.dis',
213
-        'disposition-notification' => 'message/disposition-notification',
214
-        'dist' => 'application/octet-stream',
215
-        'distz' => 'application/octet-stream',
216
-        'djv' => 'image/vnd.djvu',
217
-        'djvu' => 'image/vnd.djvu',
218
-        'dll' => 'application/octet-stream',
219
-        'dmg' => 'application/x-apple-diskimage',
220
-        'dmn' => 'application/octet-stream',
221
-        'dmp' => 'application/vnd.tcpdump.pcap',
222
-        'dms' => 'application/octet-stream',
223
-        'dna' => 'application/vnd.dna',
224
-        'doc' => 'application/msword',
225
-        'docm' => 'application/vnd.ms-word.template.macroEnabled.12',
226
-        'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
227
-        'dot' => 'application/msword',
228
-        'dotm' => 'application/vnd.ms-word.template.macroEnabled.12',
229
-        'dotx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template',
230
-        'dp' => 'application/vnd.osgi.dp',
231
-        'dpg' => 'application/vnd.dpgraph',
232
-        'dpx' => 'image/dpx',
233
-        'dra' => 'audio/vnd.dra',
234
-        'drle' => 'image/dicom-rle',
235
-        'dsc' => 'text/prs.lines.tag',
236
-        'dssc' => 'application/dssc+der',
237
-        'dtb' => 'application/x-dtbook+xml',
238
-        'dtd' => 'application/xml-dtd',
239
-        'dts' => 'audio/vnd.dts',
240
-        'dtshd' => 'audio/vnd.dts.hd',
241
-        'dump' => 'application/octet-stream',
242
-        'dvb' => 'video/vnd.dvb.file',
243
-        'dvi' => 'application/x-dvi',
244
-        'dwd' => 'application/atsc-dwd+xml',
245
-        'dwf' => 'model/vnd.dwf',
246
-        'dwg' => 'image/vnd.dwg',
247
-        'dxf' => 'image/vnd.dxf',
248
-        'dxp' => 'application/vnd.spotfire.dxp',
249
-        'dxr' => 'application/x-director',
250
-        'ear' => 'application/java-archive',
251
-        'ecelp4800' => 'audio/vnd.nuera.ecelp4800',
252
-        'ecelp7470' => 'audio/vnd.nuera.ecelp7470',
253
-        'ecelp9600' => 'audio/vnd.nuera.ecelp9600',
254
-        'ecma' => 'application/ecmascript',
255
-        'edm' => 'application/vnd.novadigm.edm',
256
-        'edx' => 'application/vnd.novadigm.edx',
257
-        'efif' => 'application/vnd.picsel',
258
-        'ei6' => 'application/vnd.pg.osasli',
259
-        'elc' => 'application/octet-stream',
260
-        'emf' => 'image/emf',
261
-        'eml' => 'message/rfc822',
262
-        'emma' => 'application/emma+xml',
263
-        'emotionml' => 'application/emotionml+xml',
264
-        'emz' => 'application/x-msmetafile',
265
-        'eol' => 'audio/vnd.digital-winds',
266
-        'eot' => 'application/vnd.ms-fontobject',
267
-        'eps' => 'application/postscript',
268
-        'epub' => 'application/epub+zip',
269
-        'es3' => 'application/vnd.eszigno3+xml',
270
-        'esa' => 'application/vnd.osgi.subsystem',
271
-        'esf' => 'application/vnd.epson.esf',
272
-        'et3' => 'application/vnd.eszigno3+xml',
273
-        'etx' => 'text/x-setext',
274
-        'eva' => 'application/x-eva',
275
-        'evy' => 'application/x-envoy',
276
-        'exe' => 'application/octet-stream',
277
-        'exi' => 'application/exi',
278
-        'exp' => 'application/express',
279
-        'exr' => 'image/aces',
280
-        'ext' => 'application/vnd.novadigm.ext',
281
-        'ez' => 'application/andrew-inset',
282
-        'ez2' => 'application/vnd.ezpix-album',
283
-        'ez3' => 'application/vnd.ezpix-package',
284
-        'f' => 'text/x-fortran',
285
-        'f4v' => 'video/mp4',
286
-        'f77' => 'text/x-fortran',
287
-        'f90' => 'text/x-fortran',
288
-        'fbs' => 'image/vnd.fastbidsheet',
289
-        'fcdt' => 'application/vnd.adobe.formscentral.fcdt',
290
-        'fcs' => 'application/vnd.isac.fcs',
291
-        'fdf' => 'application/vnd.fdf',
292
-        'fdt' => 'application/fdt+xml',
293
-        'fe_launch' => 'application/vnd.denovo.fcselayout-link',
294
-        'fg5' => 'application/vnd.fujitsu.oasysgp',
295
-        'fgd' => 'application/x-director',
296
-        'fh' => 'image/x-freehand',
297
-        'fh4' => 'image/x-freehand',
298
-        'fh5' => 'image/x-freehand',
299
-        'fh7' => 'image/x-freehand',
300
-        'fhc' => 'image/x-freehand',
301
-        'fig' => 'application/x-xfig',
302
-        'fits' => 'image/fits',
303
-        'flac' => 'audio/x-flac',
304
-        'fli' => 'video/x-fli',
305
-        'flo' => 'application/vnd.micrografx.flo',
306
-        'flv' => 'video/x-flv',
307
-        'flw' => 'application/vnd.kde.kivio',
308
-        'flx' => 'text/vnd.fmi.flexstor',
309
-        'fly' => 'text/vnd.fly',
310
-        'fm' => 'application/vnd.framemaker',
311
-        'fnc' => 'application/vnd.frogans.fnc',
312
-        'fo' => 'application/vnd.software602.filler.form+xml',
313
-        'for' => 'text/x-fortran',
314
-        'fpx' => 'image/vnd.fpx',
315
-        'frame' => 'application/vnd.framemaker',
316
-        'fsc' => 'application/vnd.fsc.weblaunch',
317
-        'fst' => 'image/vnd.fst',
318
-        'ftc' => 'application/vnd.fluxtime.clip',
319
-        'fti' => 'application/vnd.anser-web-funds-transfer-initiation',
320
-        'fvt' => 'video/vnd.fvt',
321
-        'fxp' => 'application/vnd.adobe.fxp',
322
-        'fxpl' => 'application/vnd.adobe.fxp',
323
-        'fzs' => 'application/vnd.fuzzysheet',
324
-        'g2w' => 'application/vnd.geoplan',
325
-        'g3' => 'image/g3fax',
326
-        'g3w' => 'application/vnd.geospace',
327
-        'gac' => 'application/vnd.groove-account',
328
-        'gam' => 'application/x-tads',
329
-        'gbr' => 'application/rpki-ghostbusters',
330
-        'gca' => 'application/x-gca-compressed',
331
-        'gdl' => 'model/vnd.gdl',
332
-        'gdoc' => 'application/vnd.google-apps.document',
333
-        'ged' => 'text/vnd.familysearch.gedcom',
334
-        'geo' => 'application/vnd.dynageo',
335
-        'geojson' => 'application/geo+json',
336
-        'gex' => 'application/vnd.geometry-explorer',
337
-        'ggb' => 'application/vnd.geogebra.file',
338
-        'ggt' => 'application/vnd.geogebra.tool',
339
-        'ghf' => 'application/vnd.groove-help',
340
-        'gif' => 'image/gif',
341
-        'gim' => 'application/vnd.groove-identity-message',
342
-        'glb' => 'model/gltf-binary',
343
-        'gltf' => 'model/gltf+json',
344
-        'gml' => 'application/gml+xml',
345
-        'gmx' => 'application/vnd.gmx',
346
-        'gnumeric' => 'application/x-gnumeric',
347
-        'gpg' => 'application/gpg-keys',
348
-        'gph' => 'application/vnd.flographit',
349
-        'gpx' => 'application/gpx+xml',
350
-        'gqf' => 'application/vnd.grafeq',
351
-        'gqs' => 'application/vnd.grafeq',
352
-        'gram' => 'application/srgs',
353
-        'gramps' => 'application/x-gramps-xml',
354
-        'gre' => 'application/vnd.geometry-explorer',
355
-        'grv' => 'application/vnd.groove-injector',
356
-        'grxml' => 'application/srgs+xml',
357
-        'gsf' => 'application/x-font-ghostscript',
358
-        'gsheet' => 'application/vnd.google-apps.spreadsheet',
359
-        'gslides' => 'application/vnd.google-apps.presentation',
360
-        'gtar' => 'application/x-gtar',
361
-        'gtm' => 'application/vnd.groove-tool-message',
362
-        'gtw' => 'model/vnd.gtw',
363
-        'gv' => 'text/vnd.graphviz',
364
-        'gxf' => 'application/gxf',
365
-        'gxt' => 'application/vnd.geonext',
366
-        'gz' => 'application/gzip',
367
-        'gzip' => 'application/gzip',
368
-        'h' => 'text/x-c',
369
-        'h261' => 'video/h261',
370
-        'h263' => 'video/h263',
371
-        'h264' => 'video/h264',
372
-        'hal' => 'application/vnd.hal+xml',
373
-        'hbci' => 'application/vnd.hbci',
374
-        'hbs' => 'text/x-handlebars-template',
375
-        'hdd' => 'application/x-virtualbox-hdd',
376
-        'hdf' => 'application/x-hdf',
377
-        'heic' => 'image/heic',
378
-        'heics' => 'image/heic-sequence',
379
-        'heif' => 'image/heif',
380
-        'heifs' => 'image/heif-sequence',
381
-        'hej2' => 'image/hej2k',
382
-        'held' => 'application/atsc-held+xml',
383
-        'hh' => 'text/x-c',
384
-        'hjson' => 'application/hjson',
385
-        'hlp' => 'application/winhlp',
386
-        'hpgl' => 'application/vnd.hp-hpgl',
387
-        'hpid' => 'application/vnd.hp-hpid',
388
-        'hps' => 'application/vnd.hp-hps',
389
-        'hqx' => 'application/mac-binhex40',
390
-        'hsj2' => 'image/hsj2',
391
-        'htc' => 'text/x-component',
392
-        'htke' => 'application/vnd.kenameaapp',
393
-        'htm' => 'text/html',
394
-        'html' => 'text/html',
395
-        'hvd' => 'application/vnd.yamaha.hv-dic',
396
-        'hvp' => 'application/vnd.yamaha.hv-voice',
397
-        'hvs' => 'application/vnd.yamaha.hv-script',
398
-        'i2g' => 'application/vnd.intergeo',
399
-        'icc' => 'application/vnd.iccprofile',
400
-        'ice' => 'x-conference/x-cooltalk',
401
-        'icm' => 'application/vnd.iccprofile',
402
-        'ico' => 'image/x-icon',
403
-        'ics' => 'text/calendar',
404
-        'ief' => 'image/ief',
405
-        'ifb' => 'text/calendar',
406
-        'ifm' => 'application/vnd.shana.informed.formdata',
407
-        'iges' => 'model/iges',
408
-        'igl' => 'application/vnd.igloader',
409
-        'igm' => 'application/vnd.insors.igm',
410
-        'igs' => 'model/iges',
411
-        'igx' => 'application/vnd.micrografx.igx',
412
-        'iif' => 'application/vnd.shana.informed.interchange',
413
-        'img' => 'application/octet-stream',
414
-        'imp' => 'application/vnd.accpac.simply.imp',
415
-        'ims' => 'application/vnd.ms-ims',
416
-        'in' => 'text/plain',
417
-        'ini' => 'text/plain',
418
-        'ink' => 'application/inkml+xml',
419
-        'inkml' => 'application/inkml+xml',
420
-        'install' => 'application/x-install-instructions',
421
-        'iota' => 'application/vnd.astraea-software.iota',
422
-        'ipfix' => 'application/ipfix',
423
-        'ipk' => 'application/vnd.shana.informed.package',
424
-        'irm' => 'application/vnd.ibm.rights-management',
425
-        'irp' => 'application/vnd.irepository.package+xml',
426
-        'iso' => 'application/x-iso9660-image',
427
-        'itp' => 'application/vnd.shana.informed.formtemplate',
428
-        'its' => 'application/its+xml',
429
-        'ivp' => 'application/vnd.immervision-ivp',
430
-        'ivu' => 'application/vnd.immervision-ivu',
431
-        'jad' => 'text/vnd.sun.j2me.app-descriptor',
432
-        'jade' => 'text/jade',
433
-        'jam' => 'application/vnd.jam',
434
-        'jar' => 'application/java-archive',
435
-        'jardiff' => 'application/x-java-archive-diff',
436
-        'java' => 'text/x-java-source',
437
-        'jhc' => 'image/jphc',
438
-        'jisp' => 'application/vnd.jisp',
439
-        'jls' => 'image/jls',
440
-        'jlt' => 'application/vnd.hp-jlyt',
441
-        'jng' => 'image/x-jng',
442
-        'jnlp' => 'application/x-java-jnlp-file',
443
-        'joda' => 'application/vnd.joost.joda-archive',
444
-        'jp2' => 'image/jp2',
445
-        'jpe' => 'image/jpeg',
446
-        'jpeg' => 'image/jpeg',
447
-        'jpf' => 'image/jpx',
448
-        'jpg' => 'image/jpeg',
449
-        'jpg2' => 'image/jp2',
450
-        'jpgm' => 'video/jpm',
451
-        'jpgv' => 'video/jpeg',
452
-        'jph' => 'image/jph',
453
-        'jpm' => 'video/jpm',
454
-        'jpx' => 'image/jpx',
455
-        'js' => 'application/javascript',
456
-        'json' => 'application/json',
457
-        'json5' => 'application/json5',
458
-        'jsonld' => 'application/ld+json',
459
-        'jsonml' => 'application/jsonml+json',
460
-        'jsx' => 'text/jsx',
461
-        'jt' => 'model/jt',
462
-        'jxr' => 'image/jxr',
463
-        'jxra' => 'image/jxra',
464
-        'jxrs' => 'image/jxrs',
465
-        'jxs' => 'image/jxs',
466
-        'jxsc' => 'image/jxsc',
467
-        'jxsi' => 'image/jxsi',
468
-        'jxss' => 'image/jxss',
469
-        'kar' => 'audio/midi',
470
-        'karbon' => 'application/vnd.kde.karbon',
471
-        'kdb' => 'application/octet-stream',
472
-        'kdbx' => 'application/x-keepass2',
473
-        'key' => 'application/x-iwork-keynote-sffkey',
474
-        'kfo' => 'application/vnd.kde.kformula',
475
-        'kia' => 'application/vnd.kidspiration',
476
-        'kml' => 'application/vnd.google-earth.kml+xml',
477
-        'kmz' => 'application/vnd.google-earth.kmz',
478
-        'kne' => 'application/vnd.kinar',
479
-        'knp' => 'application/vnd.kinar',
480
-        'kon' => 'application/vnd.kde.kontour',
481
-        'kpr' => 'application/vnd.kde.kpresenter',
482
-        'kpt' => 'application/vnd.kde.kpresenter',
483
-        'kpxx' => 'application/vnd.ds-keypoint',
484
-        'ksp' => 'application/vnd.kde.kspread',
485
-        'ktr' => 'application/vnd.kahootz',
486
-        'ktx' => 'image/ktx',
487
-        'ktx2' => 'image/ktx2',
488
-        'ktz' => 'application/vnd.kahootz',
489
-        'kwd' => 'application/vnd.kde.kword',
490
-        'kwt' => 'application/vnd.kde.kword',
491
-        'lasxml' => 'application/vnd.las.las+xml',
492
-        'latex' => 'application/x-latex',
493
-        'lbd' => 'application/vnd.llamagraphics.life-balance.desktop',
494
-        'lbe' => 'application/vnd.llamagraphics.life-balance.exchange+xml',
495
-        'les' => 'application/vnd.hhe.lesson-player',
496
-        'less' => 'text/less',
497
-        'lgr' => 'application/lgr+xml',
498
-        'lha' => 'application/octet-stream',
499
-        'link66' => 'application/vnd.route66.link66+xml',
500
-        'list' => 'text/plain',
501
-        'list3820' => 'application/vnd.ibm.modcap',
502
-        'listafp' => 'application/vnd.ibm.modcap',
503
-        'litcoffee' => 'text/coffeescript',
504
-        'lnk' => 'application/x-ms-shortcut',
505
-        'log' => 'text/plain',
506
-        'lostxml' => 'application/lost+xml',
507
-        'lrf' => 'application/octet-stream',
508
-        'lrm' => 'application/vnd.ms-lrm',
509
-        'ltf' => 'application/vnd.frogans.ltf',
510
-        'lua' => 'text/x-lua',
511
-        'luac' => 'application/x-lua-bytecode',
512
-        'lvp' => 'audio/vnd.lucent.voice',
513
-        'lwp' => 'application/vnd.lotus-wordpro',
514
-        'lzh' => 'application/octet-stream',
515
-        'm1v' => 'video/mpeg',
516
-        'm2a' => 'audio/mpeg',
517
-        'm2v' => 'video/mpeg',
518
-        'm3a' => 'audio/mpeg',
519
-        'm3u' => 'text/plain',
520
-        'm3u8' => 'application/vnd.apple.mpegurl',
521
-        'm4a' => 'audio/x-m4a',
522
-        'm4p' => 'application/mp4',
523
-        'm4s' => 'video/iso.segment',
524
-        'm4u' => 'application/vnd.mpegurl',
525
-        'm4v' => 'video/x-m4v',
526
-        'm13' => 'application/x-msmediaview',
527
-        'm14' => 'application/x-msmediaview',
528
-        'm21' => 'application/mp21',
529
-        'ma' => 'application/mathematica',
530
-        'mads' => 'application/mads+xml',
531
-        'maei' => 'application/mmt-aei+xml',
532
-        'mag' => 'application/vnd.ecowin.chart',
533
-        'maker' => 'application/vnd.framemaker',
534
-        'man' => 'text/troff',
535
-        'manifest' => 'text/cache-manifest',
536
-        'map' => 'application/json',
537
-        'mar' => 'application/octet-stream',
538
-        'markdown' => 'text/markdown',
539
-        'mathml' => 'application/mathml+xml',
540
-        'mb' => 'application/mathematica',
541
-        'mbk' => 'application/vnd.mobius.mbk',
542
-        'mbox' => 'application/mbox',
543
-        'mc1' => 'application/vnd.medcalcdata',
544
-        'mcd' => 'application/vnd.mcd',
545
-        'mcurl' => 'text/vnd.curl.mcurl',
546
-        'md' => 'text/markdown',
547
-        'mdb' => 'application/x-msaccess',
548
-        'mdi' => 'image/vnd.ms-modi',
549
-        'mdx' => 'text/mdx',
550
-        'me' => 'text/troff',
551
-        'mesh' => 'model/mesh',
552
-        'meta4' => 'application/metalink4+xml',
553
-        'metalink' => 'application/metalink+xml',
554
-        'mets' => 'application/mets+xml',
555
-        'mfm' => 'application/vnd.mfmp',
556
-        'mft' => 'application/rpki-manifest',
557
-        'mgp' => 'application/vnd.osgeo.mapguide.package',
558
-        'mgz' => 'application/vnd.proteus.magazine',
559
-        'mid' => 'audio/midi',
560
-        'midi' => 'audio/midi',
561
-        'mie' => 'application/x-mie',
562
-        'mif' => 'application/vnd.mif',
563
-        'mime' => 'message/rfc822',
564
-        'mj2' => 'video/mj2',
565
-        'mjp2' => 'video/mj2',
566
-        'mjs' => 'text/javascript',
567
-        'mk3d' => 'video/x-matroska',
568
-        'mka' => 'audio/x-matroska',
569
-        'mkd' => 'text/x-markdown',
570
-        'mks' => 'video/x-matroska',
571
-        'mkv' => 'video/x-matroska',
572
-        'mlp' => 'application/vnd.dolby.mlp',
573
-        'mmd' => 'application/vnd.chipnuts.karaoke-mmd',
574
-        'mmf' => 'application/vnd.smaf',
575
-        'mml' => 'text/mathml',
576
-        'mmr' => 'image/vnd.fujixerox.edmics-mmr',
577
-        'mng' => 'video/x-mng',
578
-        'mny' => 'application/x-msmoney',
579
-        'mobi' => 'application/x-mobipocket-ebook',
580
-        'mods' => 'application/mods+xml',
581
-        'mov' => 'video/quicktime',
582
-        'movie' => 'video/x-sgi-movie',
583
-        'mp2' => 'audio/mpeg',
584
-        'mp2a' => 'audio/mpeg',
585
-        'mp3' => 'audio/mpeg',
586
-        'mp4' => 'video/mp4',
587
-        'mp4a' => 'audio/mp4',
588
-        'mp4s' => 'application/mp4',
589
-        'mp4v' => 'video/mp4',
590
-        'mp21' => 'application/mp21',
591
-        'mpc' => 'application/vnd.mophun.certificate',
592
-        'mpd' => 'application/dash+xml',
593
-        'mpe' => 'video/mpeg',
594
-        'mpeg' => 'video/mpeg',
595
-        'mpf' => 'application/media-policy-dataset+xml',
596
-        'mpg' => 'video/mpeg',
597
-        'mpg4' => 'video/mp4',
598
-        'mpga' => 'audio/mpeg',
599
-        'mpkg' => 'application/vnd.apple.installer+xml',
600
-        'mpm' => 'application/vnd.blueice.multipass',
601
-        'mpn' => 'application/vnd.mophun.application',
602
-        'mpp' => 'application/vnd.ms-project',
603
-        'mpt' => 'application/vnd.ms-project',
604
-        'mpy' => 'application/vnd.ibm.minipay',
605
-        'mqy' => 'application/vnd.mobius.mqy',
606
-        'mrc' => 'application/marc',
607
-        'mrcx' => 'application/marcxml+xml',
608
-        'ms' => 'text/troff',
609
-        'mscml' => 'application/mediaservercontrol+xml',
610
-        'mseed' => 'application/vnd.fdsn.mseed',
611
-        'mseq' => 'application/vnd.mseq',
612
-        'msf' => 'application/vnd.epson.msf',
613
-        'msg' => 'application/vnd.ms-outlook',
614
-        'msh' => 'model/mesh',
615
-        'msi' => 'application/x-msdownload',
616
-        'msix' => 'application/msix',
617
-        'msixbundle' => 'application/msixbundle',
618
-        'msl' => 'application/vnd.mobius.msl',
619
-        'msm' => 'application/octet-stream',
620
-        'msp' => 'application/octet-stream',
621
-        'msty' => 'application/vnd.muvee.style',
622
-        'mtl' => 'model/mtl',
623
-        'mts' => 'model/vnd.mts',
624
-        'mus' => 'application/vnd.musician',
625
-        'musd' => 'application/mmt-usd+xml',
626
-        'musicxml' => 'application/vnd.recordare.musicxml+xml',
627
-        'mvb' => 'application/x-msmediaview',
628
-        'mvt' => 'application/vnd.mapbox-vector-tile',
629
-        'mwf' => 'application/vnd.mfer',
630
-        'mxf' => 'application/mxf',
631
-        'mxl' => 'application/vnd.recordare.musicxml',
632
-        'mxmf' => 'audio/mobile-xmf',
633
-        'mxml' => 'application/xv+xml',
634
-        'mxs' => 'application/vnd.triscape.mxs',
635
-        'mxu' => 'video/vnd.mpegurl',
636
-        'n-gage' => 'application/vnd.nokia.n-gage.symbian.install',
637
-        'n3' => 'text/n3',
638
-        'nb' => 'application/mathematica',
639
-        'nbp' => 'application/vnd.wolfram.player',
640
-        'nc' => 'application/x-netcdf',
641
-        'ncx' => 'application/x-dtbncx+xml',
642
-        'nfo' => 'text/x-nfo',
643
-        'ngdat' => 'application/vnd.nokia.n-gage.data',
644
-        'nitf' => 'application/vnd.nitf',
645
-        'nlu' => 'application/vnd.neurolanguage.nlu',
646
-        'nml' => 'application/vnd.enliven',
647
-        'nnd' => 'application/vnd.noblenet-directory',
648
-        'nns' => 'application/vnd.noblenet-sealer',
649
-        'nnw' => 'application/vnd.noblenet-web',
650
-        'npx' => 'image/vnd.net-fpx',
651
-        'nq' => 'application/n-quads',
652
-        'nsc' => 'application/x-conference',
653
-        'nsf' => 'application/vnd.lotus-notes',
654
-        'nt' => 'application/n-triples',
655
-        'ntf' => 'application/vnd.nitf',
656
-        'numbers' => 'application/x-iwork-numbers-sffnumbers',
657
-        'nzb' => 'application/x-nzb',
658
-        'oa2' => 'application/vnd.fujitsu.oasys2',
659
-        'oa3' => 'application/vnd.fujitsu.oasys3',
660
-        'oas' => 'application/vnd.fujitsu.oasys',
661
-        'obd' => 'application/x-msbinder',
662
-        'obgx' => 'application/vnd.openblox.game+xml',
663
-        'obj' => 'model/obj',
664
-        'oda' => 'application/oda',
665
-        'odb' => 'application/vnd.oasis.opendocument.database',
666
-        'odc' => 'application/vnd.oasis.opendocument.chart',
667
-        'odf' => 'application/vnd.oasis.opendocument.formula',
668
-        'odft' => 'application/vnd.oasis.opendocument.formula-template',
669
-        'odg' => 'application/vnd.oasis.opendocument.graphics',
670
-        'odi' => 'application/vnd.oasis.opendocument.image',
671
-        'odm' => 'application/vnd.oasis.opendocument.text-master',
672
-        'odp' => 'application/vnd.oasis.opendocument.presentation',
673
-        'ods' => 'application/vnd.oasis.opendocument.spreadsheet',
674
-        'odt' => 'application/vnd.oasis.opendocument.text',
675
-        'oga' => 'audio/ogg',
676
-        'ogex' => 'model/vnd.opengex',
677
-        'ogg' => 'audio/ogg',
678
-        'ogv' => 'video/ogg',
679
-        'ogx' => 'application/ogg',
680
-        'omdoc' => 'application/omdoc+xml',
681
-        'onepkg' => 'application/onenote',
682
-        'onetmp' => 'application/onenote',
683
-        'onetoc' => 'application/onenote',
684
-        'onetoc2' => 'application/onenote',
685
-        'opf' => 'application/oebps-package+xml',
686
-        'opml' => 'text/x-opml',
687
-        'oprc' => 'application/vnd.palm',
688
-        'opus' => 'audio/ogg',
689
-        'org' => 'text/x-org',
690
-        'osf' => 'application/vnd.yamaha.openscoreformat',
691
-        'osfpvg' => 'application/vnd.yamaha.openscoreformat.osfpvg+xml',
692
-        'osm' => 'application/vnd.openstreetmap.data+xml',
693
-        'otc' => 'application/vnd.oasis.opendocument.chart-template',
694
-        'otf' => 'font/otf',
695
-        'otg' => 'application/vnd.oasis.opendocument.graphics-template',
696
-        'oth' => 'application/vnd.oasis.opendocument.text-web',
697
-        'oti' => 'application/vnd.oasis.opendocument.image-template',
698
-        'otp' => 'application/vnd.oasis.opendocument.presentation-template',
699
-        'ots' => 'application/vnd.oasis.opendocument.spreadsheet-template',
700
-        'ott' => 'application/vnd.oasis.opendocument.text-template',
701
-        'ova' => 'application/x-virtualbox-ova',
702
-        'ovf' => 'application/x-virtualbox-ovf',
703
-        'owl' => 'application/rdf+xml',
704
-        'oxps' => 'application/oxps',
705
-        'oxt' => 'application/vnd.openofficeorg.extension',
706
-        'p' => 'text/x-pascal',
707
-        'p7a' => 'application/x-pkcs7-signature',
708
-        'p7b' => 'application/x-pkcs7-certificates',
709
-        'p7c' => 'application/pkcs7-mime',
710
-        'p7m' => 'application/pkcs7-mime',
711
-        'p7r' => 'application/x-pkcs7-certreqresp',
712
-        'p7s' => 'application/pkcs7-signature',
713
-        'p8' => 'application/pkcs8',
714
-        'p10' => 'application/x-pkcs10',
715
-        'p12' => 'application/x-pkcs12',
716
-        'pac' => 'application/x-ns-proxy-autoconfig',
717
-        'pages' => 'application/x-iwork-pages-sffpages',
718
-        'pas' => 'text/x-pascal',
719
-        'paw' => 'application/vnd.pawaafile',
720
-        'pbd' => 'application/vnd.powerbuilder6',
721
-        'pbm' => 'image/x-portable-bitmap',
722
-        'pcap' => 'application/vnd.tcpdump.pcap',
723
-        'pcf' => 'application/x-font-pcf',
724
-        'pcl' => 'application/vnd.hp-pcl',
725
-        'pclxl' => 'application/vnd.hp-pclxl',
726
-        'pct' => 'image/x-pict',
727
-        'pcurl' => 'application/vnd.curl.pcurl',
728
-        'pcx' => 'image/x-pcx',
729
-        'pdb' => 'application/x-pilot',
730
-        'pde' => 'text/x-processing',
731
-        'pdf' => 'application/pdf',
732
-        'pem' => 'application/x-x509-user-cert',
733
-        'pfa' => 'application/x-font-type1',
734
-        'pfb' => 'application/x-font-type1',
735
-        'pfm' => 'application/x-font-type1',
736
-        'pfr' => 'application/font-tdpfr',
737
-        'pfx' => 'application/x-pkcs12',
738
-        'pgm' => 'image/x-portable-graymap',
739
-        'pgn' => 'application/x-chess-pgn',
740
-        'pgp' => 'application/pgp',
741
-        'phar' => 'application/octet-stream',
742
-        'php' => 'application/x-httpd-php',
743
-        'php3' => 'application/x-httpd-php',
744
-        'php4' => 'application/x-httpd-php',
745
-        'phps' => 'application/x-httpd-php-source',
746
-        'phtml' => 'application/x-httpd-php',
747
-        'pic' => 'image/x-pict',
748
-        'pkg' => 'application/octet-stream',
749
-        'pki' => 'application/pkixcmp',
750
-        'pkipath' => 'application/pkix-pkipath',
751
-        'pkpass' => 'application/vnd.apple.pkpass',
752
-        'pl' => 'application/x-perl',
753
-        'plb' => 'application/vnd.3gpp.pic-bw-large',
754
-        'plc' => 'application/vnd.mobius.plc',
755
-        'plf' => 'application/vnd.pocketlearn',
756
-        'pls' => 'application/pls+xml',
757
-        'pm' => 'application/x-perl',
758
-        'pml' => 'application/vnd.ctc-posml',
759
-        'png' => 'image/png',
760
-        'pnm' => 'image/x-portable-anymap',
761
-        'portpkg' => 'application/vnd.macports.portpkg',
762
-        'pot' => 'application/vnd.ms-powerpoint',
763
-        'potm' => 'application/vnd.ms-powerpoint.presentation.macroEnabled.12',
764
-        'potx' => 'application/vnd.openxmlformats-officedocument.presentationml.template',
765
-        'ppa' => 'application/vnd.ms-powerpoint',
766
-        'ppam' => 'application/vnd.ms-powerpoint.addin.macroEnabled.12',
767
-        'ppd' => 'application/vnd.cups-ppd',
768
-        'ppm' => 'image/x-portable-pixmap',
769
-        'pps' => 'application/vnd.ms-powerpoint',
770
-        'ppsm' => 'application/vnd.ms-powerpoint.slideshow.macroEnabled.12',
771
-        'ppsx' => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow',
772
-        'ppt' => 'application/powerpoint',
773
-        'pptm' => 'application/vnd.ms-powerpoint.presentation.macroEnabled.12',
774
-        'pptx' => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
775
-        'pqa' => 'application/vnd.palm',
776
-        'prc' => 'model/prc',
777
-        'pre' => 'application/vnd.lotus-freelance',
778
-        'prf' => 'application/pics-rules',
779
-        'provx' => 'application/provenance+xml',
780
-        'ps' => 'application/postscript',
781
-        'psb' => 'application/vnd.3gpp.pic-bw-small',
782
-        'psd' => 'application/x-photoshop',
783
-        'psf' => 'application/x-font-linux-psf',
784
-        'pskcxml' => 'application/pskc+xml',
785
-        'pti' => 'image/prs.pti',
786
-        'ptid' => 'application/vnd.pvi.ptid1',
787
-        'pub' => 'application/x-mspublisher',
788
-        'pvb' => 'application/vnd.3gpp.pic-bw-var',
789
-        'pwn' => 'application/vnd.3m.post-it-notes',
790
-        'pya' => 'audio/vnd.ms-playready.media.pya',
791
-        'pyo' => 'model/vnd.pytha.pyox',
792
-        'pyox' => 'model/vnd.pytha.pyox',
793
-        'pyv' => 'video/vnd.ms-playready.media.pyv',
794
-        'qam' => 'application/vnd.epson.quickanime',
795
-        'qbo' => 'application/vnd.intu.qbo',
796
-        'qfx' => 'application/vnd.intu.qfx',
797
-        'qps' => 'application/vnd.publishare-delta-tree',
798
-        'qt' => 'video/quicktime',
799
-        'qwd' => 'application/vnd.quark.quarkxpress',
800
-        'qwt' => 'application/vnd.quark.quarkxpress',
801
-        'qxb' => 'application/vnd.quark.quarkxpress',
802
-        'qxd' => 'application/vnd.quark.quarkxpress',
803
-        'qxl' => 'application/vnd.quark.quarkxpress',
804
-        'qxt' => 'application/vnd.quark.quarkxpress',
805
-        'ra' => 'audio/x-realaudio',
806
-        'ram' => 'audio/x-pn-realaudio',
807
-        'raml' => 'application/raml+yaml',
808
-        'rapd' => 'application/route-apd+xml',
809
-        'rar' => 'application/x-rar',
810
-        'ras' => 'image/x-cmu-raster',
811
-        'rcprofile' => 'application/vnd.ipunplugged.rcprofile',
812
-        'rdf' => 'application/rdf+xml',
813
-        'rdz' => 'application/vnd.data-vision.rdz',
814
-        'relo' => 'application/p2p-overlay+xml',
815
-        'rep' => 'application/vnd.businessobjects',
816
-        'res' => 'application/x-dtbresource+xml',
817
-        'rgb' => 'image/x-rgb',
818
-        'rif' => 'application/reginfo+xml',
819
-        'rip' => 'audio/vnd.rip',
820
-        'ris' => 'application/x-research-info-systems',
821
-        'rl' => 'application/resource-lists+xml',
822
-        'rlc' => 'image/vnd.fujixerox.edmics-rlc',
823
-        'rld' => 'application/resource-lists-diff+xml',
824
-        'rm' => 'audio/x-pn-realaudio',
825
-        'rmi' => 'audio/midi',
826
-        'rmp' => 'audio/x-pn-realaudio-plugin',
827
-        'rms' => 'application/vnd.jcp.javame.midlet-rms',
828
-        'rmvb' => 'application/vnd.rn-realmedia-vbr',
829
-        'rnc' => 'application/relax-ng-compact-syntax',
830
-        'rng' => 'application/xml',
831
-        'roa' => 'application/rpki-roa',
832
-        'roff' => 'text/troff',
833
-        'rp9' => 'application/vnd.cloanto.rp9',
834
-        'rpm' => 'audio/x-pn-realaudio-plugin',
835
-        'rpss' => 'application/vnd.nokia.radio-presets',
836
-        'rpst' => 'application/vnd.nokia.radio-preset',
837
-        'rq' => 'application/sparql-query',
838
-        'rs' => 'application/rls-services+xml',
839
-        'rsa' => 'application/x-pkcs7',
840
-        'rsat' => 'application/atsc-rsat+xml',
841
-        'rsd' => 'application/rsd+xml',
842
-        'rsheet' => 'application/urc-ressheet+xml',
843
-        'rss' => 'application/rss+xml',
844
-        'rtf' => 'text/rtf',
845
-        'rtx' => 'text/richtext',
846
-        'run' => 'application/x-makeself',
847
-        'rusd' => 'application/route-usd+xml',
848
-        'rv' => 'video/vnd.rn-realvideo',
849
-        's' => 'text/x-asm',
850
-        's3m' => 'audio/s3m',
851
-        'saf' => 'application/vnd.yamaha.smaf-audio',
852
-        'sass' => 'text/x-sass',
853
-        'sbml' => 'application/sbml+xml',
854
-        'sc' => 'application/vnd.ibm.secure-container',
855
-        'scd' => 'application/x-msschedule',
856
-        'scm' => 'application/vnd.lotus-screencam',
857
-        'scq' => 'application/scvp-cv-request',
858
-        'scs' => 'application/scvp-cv-response',
859
-        'scss' => 'text/x-scss',
860
-        'scurl' => 'text/vnd.curl.scurl',
861
-        'sda' => 'application/vnd.stardivision.draw',
862
-        'sdc' => 'application/vnd.stardivision.calc',
863
-        'sdd' => 'application/vnd.stardivision.impress',
864
-        'sdkd' => 'application/vnd.solent.sdkm+xml',
865
-        'sdkm' => 'application/vnd.solent.sdkm+xml',
866
-        'sdp' => 'application/sdp',
867
-        'sdw' => 'application/vnd.stardivision.writer',
868
-        'sea' => 'application/octet-stream',
869
-        'see' => 'application/vnd.seemail',
870
-        'seed' => 'application/vnd.fdsn.seed',
871
-        'sema' => 'application/vnd.sema',
872
-        'semd' => 'application/vnd.semd',
873
-        'semf' => 'application/vnd.semf',
874
-        'senmlx' => 'application/senml+xml',
875
-        'sensmlx' => 'application/sensml+xml',
876
-        'ser' => 'application/java-serialized-object',
877
-        'setpay' => 'application/set-payment-initiation',
878
-        'setreg' => 'application/set-registration-initiation',
879
-        'sfd-hdstx' => 'application/vnd.hydrostatix.sof-data',
880
-        'sfs' => 'application/vnd.spotfire.sfs',
881
-        'sfv' => 'text/x-sfv',
882
-        'sgi' => 'image/sgi',
883
-        'sgl' => 'application/vnd.stardivision.writer-global',
884
-        'sgm' => 'text/sgml',
885
-        'sgml' => 'text/sgml',
886
-        'sh' => 'application/x-sh',
887
-        'shar' => 'application/x-shar',
888
-        'shex' => 'text/shex',
889
-        'shf' => 'application/shf+xml',
890
-        'shtml' => 'text/html',
891
-        'sid' => 'image/x-mrsid-image',
892
-        'sieve' => 'application/sieve',
893
-        'sig' => 'application/pgp-signature',
894
-        'sil' => 'audio/silk',
895
-        'silo' => 'model/mesh',
896
-        'sis' => 'application/vnd.symbian.install',
897
-        'sisx' => 'application/vnd.symbian.install',
898
-        'sit' => 'application/x-stuffit',
899
-        'sitx' => 'application/x-stuffitx',
900
-        'siv' => 'application/sieve',
901
-        'skd' => 'application/vnd.koan',
902
-        'skm' => 'application/vnd.koan',
903
-        'skp' => 'application/vnd.koan',
904
-        'skt' => 'application/vnd.koan',
905
-        'sldm' => 'application/vnd.ms-powerpoint.slide.macroenabled.12',
906
-        'sldx' => 'application/vnd.openxmlformats-officedocument.presentationml.slide',
907
-        'slim' => 'text/slim',
908
-        'slm' => 'text/slim',
909
-        'sls' => 'application/route-s-tsid+xml',
910
-        'slt' => 'application/vnd.epson.salt',
911
-        'sm' => 'application/vnd.stepmania.stepchart',
912
-        'smf' => 'application/vnd.stardivision.math',
913
-        'smi' => 'application/smil',
914
-        'smil' => 'application/smil',
915
-        'smv' => 'video/x-smv',
916
-        'smzip' => 'application/vnd.stepmania.package',
917
-        'snd' => 'audio/basic',
918
-        'snf' => 'application/x-font-snf',
919
-        'so' => 'application/octet-stream',
920
-        'spc' => 'application/x-pkcs7-certificates',
921
-        'spdx' => 'text/spdx',
922
-        'spf' => 'application/vnd.yamaha.smaf-phrase',
923
-        'spl' => 'application/x-futuresplash',
924
-        'spot' => 'text/vnd.in3d.spot',
925
-        'spp' => 'application/scvp-vp-response',
926
-        'spq' => 'application/scvp-vp-request',
927
-        'spx' => 'audio/ogg',
928
-        'sql' => 'application/x-sql',
929
-        'src' => 'application/x-wais-source',
930
-        'srt' => 'application/x-subrip',
931
-        'sru' => 'application/sru+xml',
932
-        'srx' => 'application/sparql-results+xml',
933
-        'ssdl' => 'application/ssdl+xml',
934
-        'sse' => 'application/vnd.kodak-descriptor',
935
-        'ssf' => 'application/vnd.epson.ssf',
936
-        'ssml' => 'application/ssml+xml',
937
-        'sst' => 'application/octet-stream',
938
-        'st' => 'application/vnd.sailingtracker.track',
939
-        'stc' => 'application/vnd.sun.xml.calc.template',
940
-        'std' => 'application/vnd.sun.xml.draw.template',
941
-        'step' => 'application/STEP',
942
-        'stf' => 'application/vnd.wt.stf',
943
-        'sti' => 'application/vnd.sun.xml.impress.template',
944
-        'stk' => 'application/hyperstudio',
945
-        'stl' => 'model/stl',
946
-        'stp' => 'application/STEP',
947
-        'stpx' => 'model/step+xml',
948
-        'stpxz' => 'model/step-xml+zip',
949
-        'stpz' => 'model/step+zip',
950
-        'str' => 'application/vnd.pg.format',
951
-        'stw' => 'application/vnd.sun.xml.writer.template',
952
-        'styl' => 'text/stylus',
953
-        'stylus' => 'text/stylus',
954
-        'sub' => 'text/vnd.dvb.subtitle',
955
-        'sus' => 'application/vnd.sus-calendar',
956
-        'susp' => 'application/vnd.sus-calendar',
957
-        'sv4cpio' => 'application/x-sv4cpio',
958
-        'sv4crc' => 'application/x-sv4crc',
959
-        'svc' => 'application/vnd.dvb.service',
960
-        'svd' => 'application/vnd.svd',
961
-        'svg' => 'image/svg+xml',
962
-        'svgz' => 'image/svg+xml',
963
-        'swa' => 'application/x-director',
964
-        'swf' => 'application/x-shockwave-flash',
965
-        'swi' => 'application/vnd.aristanetworks.swi',
966
-        'swidtag' => 'application/swid+xml',
967
-        'sxc' => 'application/vnd.sun.xml.calc',
968
-        'sxd' => 'application/vnd.sun.xml.draw',
969
-        'sxg' => 'application/vnd.sun.xml.writer.global',
970
-        'sxi' => 'application/vnd.sun.xml.impress',
971
-        'sxm' => 'application/vnd.sun.xml.math',
972
-        'sxw' => 'application/vnd.sun.xml.writer',
973
-        't' => 'text/troff',
974
-        't3' => 'application/x-t3vm-image',
975
-        't38' => 'image/t38',
976
-        'taglet' => 'application/vnd.mynfc',
977
-        'tao' => 'application/vnd.tao.intent-module-archive',
978
-        'tap' => 'image/vnd.tencent.tap',
979
-        'tar' => 'application/x-tar',
980
-        'tcap' => 'application/vnd.3gpp2.tcap',
981
-        'tcl' => 'application/x-tcl',
982
-        'td' => 'application/urc-targetdesc+xml',
983
-        'teacher' => 'application/vnd.smart.teacher',
984
-        'tei' => 'application/tei+xml',
985
-        'teicorpus' => 'application/tei+xml',
986
-        'tex' => 'application/x-tex',
987
-        'texi' => 'application/x-texinfo',
988
-        'texinfo' => 'application/x-texinfo',
989
-        'text' => 'text/plain',
990
-        'tfi' => 'application/thraud+xml',
991
-        'tfm' => 'application/x-tex-tfm',
992
-        'tfx' => 'image/tiff-fx',
993
-        'tga' => 'image/x-tga',
994
-        'tgz' => 'application/x-tar',
995
-        'thmx' => 'application/vnd.ms-officetheme',
996
-        'tif' => 'image/tiff',
997
-        'tiff' => 'image/tiff',
998
-        'tk' => 'application/x-tcl',
999
-        'tmo' => 'application/vnd.tmobile-livetv',
1000
-        'toml' => 'application/toml',
1001
-        'torrent' => 'application/x-bittorrent',
1002
-        'tpl' => 'application/vnd.groove-tool-template',
1003
-        'tpt' => 'application/vnd.trid.tpt',
1004
-        'tr' => 'text/troff',
1005
-        'tra' => 'application/vnd.trueapp',
1006
-        'trig' => 'application/trig',
1007
-        'trm' => 'application/x-msterminal',
1008
-        'ts' => 'video/mp2t',
1009
-        'tsd' => 'application/timestamped-data',
1010
-        'tsv' => 'text/tab-separated-values',
1011
-        'ttc' => 'font/collection',
1012
-        'ttf' => 'font/ttf',
1013
-        'ttl' => 'text/turtle',
1014
-        'ttml' => 'application/ttml+xml',
1015
-        'twd' => 'application/vnd.simtech-mindmapper',
1016
-        'twds' => 'application/vnd.simtech-mindmapper',
1017
-        'txd' => 'application/vnd.genomatix.tuxedo',
1018
-        'txf' => 'application/vnd.mobius.txf',
1019
-        'txt' => 'text/plain',
1020
-        'u3d' => 'model/u3d',
1021
-        'u8dsn' => 'message/global-delivery-status',
1022
-        'u8hdr' => 'message/global-headers',
1023
-        'u8mdn' => 'message/global-disposition-notification',
1024
-        'u8msg' => 'message/global',
1025
-        'u32' => 'application/x-authorware-bin',
1026
-        'ubj' => 'application/ubjson',
1027
-        'udeb' => 'application/x-debian-package',
1028
-        'ufd' => 'application/vnd.ufdl',
1029
-        'ufdl' => 'application/vnd.ufdl',
1030
-        'ulx' => 'application/x-glulx',
1031
-        'umj' => 'application/vnd.umajin',
1032
-        'unityweb' => 'application/vnd.unity',
1033
-        'uo' => 'application/vnd.uoml+xml',
1034
-        'uoml' => 'application/vnd.uoml+xml',
1035
-        'uri' => 'text/uri-list',
1036
-        'uris' => 'text/uri-list',
1037
-        'urls' => 'text/uri-list',
1038
-        'usda' => 'model/vnd.usda',
1039
-        'usdz' => 'model/vnd.usdz+zip',
1040
-        'ustar' => 'application/x-ustar',
1041
-        'utz' => 'application/vnd.uiq.theme',
1042
-        'uu' => 'text/x-uuencode',
1043
-        'uva' => 'audio/vnd.dece.audio',
1044
-        'uvd' => 'application/vnd.dece.data',
1045
-        'uvf' => 'application/vnd.dece.data',
1046
-        'uvg' => 'image/vnd.dece.graphic',
1047
-        'uvh' => 'video/vnd.dece.hd',
1048
-        'uvi' => 'image/vnd.dece.graphic',
1049
-        'uvm' => 'video/vnd.dece.mobile',
1050
-        'uvp' => 'video/vnd.dece.pd',
1051
-        'uvs' => 'video/vnd.dece.sd',
1052
-        'uvt' => 'application/vnd.dece.ttml+xml',
1053
-        'uvu' => 'video/vnd.uvvu.mp4',
1054
-        'uvv' => 'video/vnd.dece.video',
1055
-        'uvva' => 'audio/vnd.dece.audio',
1056
-        'uvvd' => 'application/vnd.dece.data',
1057
-        'uvvf' => 'application/vnd.dece.data',
1058
-        'uvvg' => 'image/vnd.dece.graphic',
1059
-        'uvvh' => 'video/vnd.dece.hd',
1060
-        'uvvi' => 'image/vnd.dece.graphic',
1061
-        'uvvm' => 'video/vnd.dece.mobile',
1062
-        'uvvp' => 'video/vnd.dece.pd',
1063
-        'uvvs' => 'video/vnd.dece.sd',
1064
-        'uvvt' => 'application/vnd.dece.ttml+xml',
1065
-        'uvvu' => 'video/vnd.uvvu.mp4',
1066
-        'uvvv' => 'video/vnd.dece.video',
1067
-        'uvvx' => 'application/vnd.dece.unspecified',
1068
-        'uvvz' => 'application/vnd.dece.zip',
1069
-        'uvx' => 'application/vnd.dece.unspecified',
1070
-        'uvz' => 'application/vnd.dece.zip',
1071
-        'vbox' => 'application/x-virtualbox-vbox',
1072
-        'vbox-extpack' => 'application/x-virtualbox-vbox-extpack',
1073
-        'vcard' => 'text/vcard',
1074
-        'vcd' => 'application/x-cdlink',
1075
-        'vcf' => 'text/x-vcard',
1076
-        'vcg' => 'application/vnd.groove-vcard',
1077
-        'vcs' => 'text/x-vcalendar',
1078
-        'vcx' => 'application/vnd.vcx',
1079
-        'vdi' => 'application/x-virtualbox-vdi',
1080
-        'vds' => 'model/vnd.sap.vds',
1081
-        'vhd' => 'application/x-virtualbox-vhd',
1082
-        'vis' => 'application/vnd.visionary',
1083
-        'viv' => 'video/vnd.vivo',
1084
-        'vlc' => 'application/videolan',
1085
-        'vmdk' => 'application/x-virtualbox-vmdk',
1086
-        'vob' => 'video/x-ms-vob',
1087
-        'vor' => 'application/vnd.stardivision.writer',
1088
-        'vox' => 'application/x-authorware-bin',
1089
-        'vrml' => 'model/vrml',
1090
-        'vsd' => 'application/vnd.visio',
1091
-        'vsf' => 'application/vnd.vsf',
1092
-        'vss' => 'application/vnd.visio',
1093
-        'vst' => 'application/vnd.visio',
1094
-        'vsw' => 'application/vnd.visio',
1095
-        'vtf' => 'image/vnd.valve.source.texture',
1096
-        'vtt' => 'text/vtt',
1097
-        'vtu' => 'model/vnd.vtu',
1098
-        'vxml' => 'application/voicexml+xml',
1099
-        'w3d' => 'application/x-director',
1100
-        'wad' => 'application/x-doom',
1101
-        'wadl' => 'application/vnd.sun.wadl+xml',
1102
-        'war' => 'application/java-archive',
1103
-        'wasm' => 'application/wasm',
1104
-        'wav' => 'audio/x-wav',
1105
-        'wax' => 'audio/x-ms-wax',
1106
-        'wbmp' => 'image/vnd.wap.wbmp',
1107
-        'wbs' => 'application/vnd.criticaltools.wbs+xml',
1108
-        'wbxml' => 'application/wbxml',
1109
-        'wcm' => 'application/vnd.ms-works',
1110
-        'wdb' => 'application/vnd.ms-works',
1111
-        'wdp' => 'image/vnd.ms-photo',
1112
-        'weba' => 'audio/webm',
1113
-        'webapp' => 'application/x-web-app-manifest+json',
1114
-        'webm' => 'video/webm',
1115
-        'webmanifest' => 'application/manifest+json',
1116
-        'webp' => 'image/webp',
1117
-        'wg' => 'application/vnd.pmi.widget',
1118
-        'wgsl' => 'text/wgsl',
1119
-        'wgt' => 'application/widget',
1120
-        'wif' => 'application/watcherinfo+xml',
1121
-        'wks' => 'application/vnd.ms-works',
1122
-        'wm' => 'video/x-ms-wm',
1123
-        'wma' => 'audio/x-ms-wma',
1124
-        'wmd' => 'application/x-ms-wmd',
1125
-        'wmf' => 'image/wmf',
1126
-        'wml' => 'text/vnd.wap.wml',
1127
-        'wmlc' => 'application/wmlc',
1128
-        'wmls' => 'text/vnd.wap.wmlscript',
1129
-        'wmlsc' => 'application/vnd.wap.wmlscriptc',
1130
-        'wmv' => 'video/x-ms-wmv',
1131
-        'wmx' => 'video/x-ms-wmx',
1132
-        'wmz' => 'application/x-msmetafile',
1133
-        'woff' => 'font/woff',
1134
-        'woff2' => 'font/woff2',
1135
-        'word' => 'application/msword',
1136
-        'wpd' => 'application/vnd.wordperfect',
1137
-        'wpl' => 'application/vnd.ms-wpl',
1138
-        'wps' => 'application/vnd.ms-works',
1139
-        'wqd' => 'application/vnd.wqd',
1140
-        'wri' => 'application/x-mswrite',
1141
-        'wrl' => 'model/vrml',
1142
-        'wsc' => 'message/vnd.wfa.wsc',
1143
-        'wsdl' => 'application/wsdl+xml',
1144
-        'wspolicy' => 'application/wspolicy+xml',
1145
-        'wtb' => 'application/vnd.webturbo',
1146
-        'wvx' => 'video/x-ms-wvx',
1147
-        'x3d' => 'model/x3d+xml',
1148
-        'x3db' => 'model/x3d+fastinfoset',
1149
-        'x3dbz' => 'model/x3d+binary',
1150
-        'x3dv' => 'model/x3d-vrml',
1151
-        'x3dvz' => 'model/x3d+vrml',
1152
-        'x3dz' => 'model/x3d+xml',
1153
-        'x32' => 'application/x-authorware-bin',
1154
-        'x_b' => 'model/vnd.parasolid.transmit.binary',
1155
-        'x_t' => 'model/vnd.parasolid.transmit.text',
1156
-        'xaml' => 'application/xaml+xml',
1157
-        'xap' => 'application/x-silverlight-app',
1158
-        'xar' => 'application/vnd.xara',
1159
-        'xav' => 'application/xcap-att+xml',
1160
-        'xbap' => 'application/x-ms-xbap',
1161
-        'xbd' => 'application/vnd.fujixerox.docuworks.binder',
1162
-        'xbm' => 'image/x-xbitmap',
1163
-        'xca' => 'application/xcap-caps+xml',
1164
-        'xcs' => 'application/calendar+xml',
1165
-        'xdf' => 'application/xcap-diff+xml',
1166
-        'xdm' => 'application/vnd.syncml.dm+xml',
1167
-        'xdp' => 'application/vnd.adobe.xdp+xml',
1168
-        'xdssc' => 'application/dssc+xml',
1169
-        'xdw' => 'application/vnd.fujixerox.docuworks',
1170
-        'xel' => 'application/xcap-el+xml',
1171
-        'xenc' => 'application/xenc+xml',
1172
-        'xer' => 'application/patch-ops-error+xml',
1173
-        'xfdf' => 'application/xfdf',
1174
-        'xfdl' => 'application/vnd.xfdl',
1175
-        'xht' => 'application/xhtml+xml',
1176
-        'xhtm' => 'application/vnd.pwg-xhtml-print+xml',
1177
-        'xhtml' => 'application/xhtml+xml',
1178
-        'xhvml' => 'application/xv+xml',
1179
-        'xif' => 'image/vnd.xiff',
1180
-        'xl' => 'application/excel',
1181
-        'xla' => 'application/vnd.ms-excel',
1182
-        'xlam' => 'application/vnd.ms-excel.addin.macroEnabled.12',
1183
-        'xlc' => 'application/vnd.ms-excel',
1184
-        'xlf' => 'application/xliff+xml',
1185
-        'xlm' => 'application/vnd.ms-excel',
1186
-        'xls' => 'application/vnd.ms-excel',
1187
-        'xlsb' => 'application/vnd.ms-excel.sheet.binary.macroEnabled.12',
1188
-        'xlsm' => 'application/vnd.ms-excel.sheet.macroEnabled.12',
1189
-        'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
1190
-        'xlt' => 'application/vnd.ms-excel',
1191
-        'xltm' => 'application/vnd.ms-excel.template.macroEnabled.12',
1192
-        'xltx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template',
1193
-        'xlw' => 'application/vnd.ms-excel',
1194
-        'xm' => 'audio/xm',
1195
-        'xml' => 'application/xml',
1196
-        'xns' => 'application/xcap-ns+xml',
1197
-        'xo' => 'application/vnd.olpc-sugar',
1198
-        'xop' => 'application/xop+xml',
1199
-        'xpi' => 'application/x-xpinstall',
1200
-        'xpl' => 'application/xproc+xml',
1201
-        'xpm' => 'image/x-xpixmap',
1202
-        'xpr' => 'application/vnd.is-xpr',
1203
-        'xps' => 'application/vnd.ms-xpsdocument',
1204
-        'xpw' => 'application/vnd.intercon.formnet',
1205
-        'xpx' => 'application/vnd.intercon.formnet',
1206
-        'xsd' => 'application/xml',
1207
-        'xsf' => 'application/prs.xsf+xml',
1208
-        'xsl' => 'application/xml',
1209
-        'xslt' => 'application/xslt+xml',
1210
-        'xsm' => 'application/vnd.syncml+xml',
1211
-        'xspf' => 'application/xspf+xml',
1212
-        'xul' => 'application/vnd.mozilla.xul+xml',
1213
-        'xvm' => 'application/xv+xml',
1214
-        'xvml' => 'application/xv+xml',
1215
-        'xwd' => 'image/x-xwindowdump',
1216
-        'xyz' => 'chemical/x-xyz',
1217
-        'xz' => 'application/x-xz',
1218
-        'yaml' => 'text/yaml',
1219
-        'yang' => 'application/yang',
1220
-        'yin' => 'application/yin+xml',
1221
-        'yml' => 'text/yaml',
1222
-        'ymp' => 'text/x-suse-ymp',
1223
-        'z' => 'application/x-compress',
1224
-        'z1' => 'application/x-zmachine',
1225
-        'z2' => 'application/x-zmachine',
1226
-        'z3' => 'application/x-zmachine',
1227
-        'z4' => 'application/x-zmachine',
1228
-        'z5' => 'application/x-zmachine',
1229
-        'z6' => 'application/x-zmachine',
1230
-        'z7' => 'application/x-zmachine',
1231
-        'z8' => 'application/x-zmachine',
1232
-        'zaz' => 'application/vnd.zzazz.deck+xml',
1233
-        'zip' => 'application/zip',
1234
-        'zir' => 'application/vnd.zul',
1235
-        'zirz' => 'application/vnd.zul',
1236
-        'zmm' => 'application/vnd.handheld-entertainment+xml',
1237
-        'zsh' => 'text/x-scriptzsh',
1238
-    ];
9
+	private const MIME_TYPES = [
10
+		'1km' => 'application/vnd.1000minds.decision-model+xml',
11
+		'3dml' => 'text/vnd.in3d.3dml',
12
+		'3ds' => 'image/x-3ds',
13
+		'3g2' => 'video/3gpp2',
14
+		'3gp' => 'video/3gp',
15
+		'3gpp' => 'video/3gpp',
16
+		'3mf' => 'model/3mf',
17
+		'7z' => 'application/x-7z-compressed',
18
+		'7zip' => 'application/x-7z-compressed',
19
+		'123' => 'application/vnd.lotus-1-2-3',
20
+		'aab' => 'application/x-authorware-bin',
21
+		'aac' => 'audio/aac',
22
+		'aam' => 'application/x-authorware-map',
23
+		'aas' => 'application/x-authorware-seg',
24
+		'abw' => 'application/x-abiword',
25
+		'ac' => 'application/vnd.nokia.n-gage.ac+xml',
26
+		'ac3' => 'audio/ac3',
27
+		'acc' => 'application/vnd.americandynamics.acc',
28
+		'ace' => 'application/x-ace-compressed',
29
+		'acu' => 'application/vnd.acucobol',
30
+		'acutc' => 'application/vnd.acucorp',
31
+		'adp' => 'audio/adpcm',
32
+		'adts' => 'audio/aac',
33
+		'aep' => 'application/vnd.audiograph',
34
+		'afm' => 'application/x-font-type1',
35
+		'afp' => 'application/vnd.ibm.modcap',
36
+		'age' => 'application/vnd.age',
37
+		'ahead' => 'application/vnd.ahead.space',
38
+		'ai' => 'application/pdf',
39
+		'aif' => 'audio/x-aiff',
40
+		'aifc' => 'audio/x-aiff',
41
+		'aiff' => 'audio/x-aiff',
42
+		'air' => 'application/vnd.adobe.air-application-installer-package+zip',
43
+		'ait' => 'application/vnd.dvb.ait',
44
+		'ami' => 'application/vnd.amiga.ami',
45
+		'aml' => 'application/automationml-aml+xml',
46
+		'amlx' => 'application/automationml-amlx+zip',
47
+		'amr' => 'audio/amr',
48
+		'apk' => 'application/vnd.android.package-archive',
49
+		'apng' => 'image/apng',
50
+		'appcache' => 'text/cache-manifest',
51
+		'appinstaller' => 'application/appinstaller',
52
+		'application' => 'application/x-ms-application',
53
+		'appx' => 'application/appx',
54
+		'appxbundle' => 'application/appxbundle',
55
+		'apr' => 'application/vnd.lotus-approach',
56
+		'arc' => 'application/x-freearc',
57
+		'arj' => 'application/x-arj',
58
+		'asc' => 'application/pgp-signature',
59
+		'asf' => 'video/x-ms-asf',
60
+		'asm' => 'text/x-asm',
61
+		'aso' => 'application/vnd.accpac.simply.aso',
62
+		'asx' => 'video/x-ms-asf',
63
+		'atc' => 'application/vnd.acucorp',
64
+		'atom' => 'application/atom+xml',
65
+		'atomcat' => 'application/atomcat+xml',
66
+		'atomdeleted' => 'application/atomdeleted+xml',
67
+		'atomsvc' => 'application/atomsvc+xml',
68
+		'atx' => 'application/vnd.antix.game-component',
69
+		'au' => 'audio/x-au',
70
+		'avci' => 'image/avci',
71
+		'avcs' => 'image/avcs',
72
+		'avi' => 'video/x-msvideo',
73
+		'avif' => 'image/avif',
74
+		'aw' => 'application/applixware',
75
+		'azf' => 'application/vnd.airzip.filesecure.azf',
76
+		'azs' => 'application/vnd.airzip.filesecure.azs',
77
+		'azv' => 'image/vnd.airzip.accelerator.azv',
78
+		'azw' => 'application/vnd.amazon.ebook',
79
+		'b16' => 'image/vnd.pco.b16',
80
+		'bat' => 'application/x-msdownload',
81
+		'bcpio' => 'application/x-bcpio',
82
+		'bdf' => 'application/x-font-bdf',
83
+		'bdm' => 'application/vnd.syncml.dm+wbxml',
84
+		'bdoc' => 'application/x-bdoc',
85
+		'bed' => 'application/vnd.realvnc.bed',
86
+		'bh2' => 'application/vnd.fujitsu.oasysprs',
87
+		'bin' => 'application/octet-stream',
88
+		'blb' => 'application/x-blorb',
89
+		'blorb' => 'application/x-blorb',
90
+		'bmi' => 'application/vnd.bmi',
91
+		'bmml' => 'application/vnd.balsamiq.bmml+xml',
92
+		'bmp' => 'image/bmp',
93
+		'book' => 'application/vnd.framemaker',
94
+		'box' => 'application/vnd.previewsystems.box',
95
+		'boz' => 'application/x-bzip2',
96
+		'bpk' => 'application/octet-stream',
97
+		'bpmn' => 'application/octet-stream',
98
+		'bsp' => 'model/vnd.valve.source.compiled-map',
99
+		'btf' => 'image/prs.btif',
100
+		'btif' => 'image/prs.btif',
101
+		'buffer' => 'application/octet-stream',
102
+		'bz' => 'application/x-bzip',
103
+		'bz2' => 'application/x-bzip2',
104
+		'c' => 'text/x-c',
105
+		'c4d' => 'application/vnd.clonk.c4group',
106
+		'c4f' => 'application/vnd.clonk.c4group',
107
+		'c4g' => 'application/vnd.clonk.c4group',
108
+		'c4p' => 'application/vnd.clonk.c4group',
109
+		'c4u' => 'application/vnd.clonk.c4group',
110
+		'c11amc' => 'application/vnd.cluetrust.cartomobile-config',
111
+		'c11amz' => 'application/vnd.cluetrust.cartomobile-config-pkg',
112
+		'cab' => 'application/vnd.ms-cab-compressed',
113
+		'caf' => 'audio/x-caf',
114
+		'cap' => 'application/vnd.tcpdump.pcap',
115
+		'car' => 'application/vnd.curl.car',
116
+		'cat' => 'application/vnd.ms-pki.seccat',
117
+		'cb7' => 'application/x-cbr',
118
+		'cba' => 'application/x-cbr',
119
+		'cbr' => 'application/x-cbr',
120
+		'cbt' => 'application/x-cbr',
121
+		'cbz' => 'application/x-cbr',
122
+		'cc' => 'text/x-c',
123
+		'cco' => 'application/x-cocoa',
124
+		'cct' => 'application/x-director',
125
+		'ccxml' => 'application/ccxml+xml',
126
+		'cdbcmsg' => 'application/vnd.contact.cmsg',
127
+		'cdf' => 'application/x-netcdf',
128
+		'cdfx' => 'application/cdfx+xml',
129
+		'cdkey' => 'application/vnd.mediastation.cdkey',
130
+		'cdmia' => 'application/cdmi-capability',
131
+		'cdmic' => 'application/cdmi-container',
132
+		'cdmid' => 'application/cdmi-domain',
133
+		'cdmio' => 'application/cdmi-object',
134
+		'cdmiq' => 'application/cdmi-queue',
135
+		'cdr' => 'application/cdr',
136
+		'cdx' => 'chemical/x-cdx',
137
+		'cdxml' => 'application/vnd.chemdraw+xml',
138
+		'cdy' => 'application/vnd.cinderella',
139
+		'cer' => 'application/pkix-cert',
140
+		'cfs' => 'application/x-cfs-compressed',
141
+		'cgm' => 'image/cgm',
142
+		'chat' => 'application/x-chat',
143
+		'chm' => 'application/vnd.ms-htmlhelp',
144
+		'chrt' => 'application/vnd.kde.kchart',
145
+		'cif' => 'chemical/x-cif',
146
+		'cii' => 'application/vnd.anser-web-certificate-issue-initiation',
147
+		'cil' => 'application/vnd.ms-artgalry',
148
+		'cjs' => 'application/node',
149
+		'cla' => 'application/vnd.claymore',
150
+		'class' => 'application/octet-stream',
151
+		'cld' => 'model/vnd.cld',
152
+		'clkk' => 'application/vnd.crick.clicker.keyboard',
153
+		'clkp' => 'application/vnd.crick.clicker.palette',
154
+		'clkt' => 'application/vnd.crick.clicker.template',
155
+		'clkw' => 'application/vnd.crick.clicker.wordbank',
156
+		'clkx' => 'application/vnd.crick.clicker',
157
+		'clp' => 'application/x-msclip',
158
+		'cmc' => 'application/vnd.cosmocaller',
159
+		'cmdf' => 'chemical/x-cmdf',
160
+		'cml' => 'chemical/x-cml',
161
+		'cmp' => 'application/vnd.yellowriver-custom-menu',
162
+		'cmx' => 'image/x-cmx',
163
+		'cod' => 'application/vnd.rim.cod',
164
+		'coffee' => 'text/coffeescript',
165
+		'com' => 'application/x-msdownload',
166
+		'conf' => 'text/plain',
167
+		'cpio' => 'application/x-cpio',
168
+		'cpl' => 'application/cpl+xml',
169
+		'cpp' => 'text/x-c',
170
+		'cpt' => 'application/mac-compactpro',
171
+		'crd' => 'application/x-mscardfile',
172
+		'crl' => 'application/pkix-crl',
173
+		'crt' => 'application/x-x509-ca-cert',
174
+		'crx' => 'application/x-chrome-extension',
175
+		'cryptonote' => 'application/vnd.rig.cryptonote',
176
+		'csh' => 'application/x-csh',
177
+		'csl' => 'application/vnd.citationstyles.style+xml',
178
+		'csml' => 'chemical/x-csml',
179
+		'csp' => 'application/vnd.commonspace',
180
+		'csr' => 'application/octet-stream',
181
+		'css' => 'text/css',
182
+		'cst' => 'application/x-director',
183
+		'csv' => 'text/csv',
184
+		'cu' => 'application/cu-seeme',
185
+		'curl' => 'text/vnd.curl',
186
+		'cwl' => 'application/cwl',
187
+		'cww' => 'application/prs.cww',
188
+		'cxt' => 'application/x-director',
189
+		'cxx' => 'text/x-c',
190
+		'dae' => 'model/vnd.collada+xml',
191
+		'daf' => 'application/vnd.mobius.daf',
192
+		'dart' => 'application/vnd.dart',
193
+		'dataless' => 'application/vnd.fdsn.seed',
194
+		'davmount' => 'application/davmount+xml',
195
+		'dbf' => 'application/vnd.dbf',
196
+		'dbk' => 'application/docbook+xml',
197
+		'dcr' => 'application/x-director',
198
+		'dcurl' => 'text/vnd.curl.dcurl',
199
+		'dd2' => 'application/vnd.oma.dd2+xml',
200
+		'ddd' => 'application/vnd.fujixerox.ddd',
201
+		'ddf' => 'application/vnd.syncml.dmddf+xml',
202
+		'dds' => 'image/vnd.ms-dds',
203
+		'deb' => 'application/x-debian-package',
204
+		'def' => 'text/plain',
205
+		'deploy' => 'application/octet-stream',
206
+		'der' => 'application/x-x509-ca-cert',
207
+		'dfac' => 'application/vnd.dreamfactory',
208
+		'dgc' => 'application/x-dgc-compressed',
209
+		'dib' => 'image/bmp',
210
+		'dic' => 'text/x-c',
211
+		'dir' => 'application/x-director',
212
+		'dis' => 'application/vnd.mobius.dis',
213
+		'disposition-notification' => 'message/disposition-notification',
214
+		'dist' => 'application/octet-stream',
215
+		'distz' => 'application/octet-stream',
216
+		'djv' => 'image/vnd.djvu',
217
+		'djvu' => 'image/vnd.djvu',
218
+		'dll' => 'application/octet-stream',
219
+		'dmg' => 'application/x-apple-diskimage',
220
+		'dmn' => 'application/octet-stream',
221
+		'dmp' => 'application/vnd.tcpdump.pcap',
222
+		'dms' => 'application/octet-stream',
223
+		'dna' => 'application/vnd.dna',
224
+		'doc' => 'application/msword',
225
+		'docm' => 'application/vnd.ms-word.template.macroEnabled.12',
226
+		'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
227
+		'dot' => 'application/msword',
228
+		'dotm' => 'application/vnd.ms-word.template.macroEnabled.12',
229
+		'dotx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template',
230
+		'dp' => 'application/vnd.osgi.dp',
231
+		'dpg' => 'application/vnd.dpgraph',
232
+		'dpx' => 'image/dpx',
233
+		'dra' => 'audio/vnd.dra',
234
+		'drle' => 'image/dicom-rle',
235
+		'dsc' => 'text/prs.lines.tag',
236
+		'dssc' => 'application/dssc+der',
237
+		'dtb' => 'application/x-dtbook+xml',
238
+		'dtd' => 'application/xml-dtd',
239
+		'dts' => 'audio/vnd.dts',
240
+		'dtshd' => 'audio/vnd.dts.hd',
241
+		'dump' => 'application/octet-stream',
242
+		'dvb' => 'video/vnd.dvb.file',
243
+		'dvi' => 'application/x-dvi',
244
+		'dwd' => 'application/atsc-dwd+xml',
245
+		'dwf' => 'model/vnd.dwf',
246
+		'dwg' => 'image/vnd.dwg',
247
+		'dxf' => 'image/vnd.dxf',
248
+		'dxp' => 'application/vnd.spotfire.dxp',
249
+		'dxr' => 'application/x-director',
250
+		'ear' => 'application/java-archive',
251
+		'ecelp4800' => 'audio/vnd.nuera.ecelp4800',
252
+		'ecelp7470' => 'audio/vnd.nuera.ecelp7470',
253
+		'ecelp9600' => 'audio/vnd.nuera.ecelp9600',
254
+		'ecma' => 'application/ecmascript',
255
+		'edm' => 'application/vnd.novadigm.edm',
256
+		'edx' => 'application/vnd.novadigm.edx',
257
+		'efif' => 'application/vnd.picsel',
258
+		'ei6' => 'application/vnd.pg.osasli',
259
+		'elc' => 'application/octet-stream',
260
+		'emf' => 'image/emf',
261
+		'eml' => 'message/rfc822',
262
+		'emma' => 'application/emma+xml',
263
+		'emotionml' => 'application/emotionml+xml',
264
+		'emz' => 'application/x-msmetafile',
265
+		'eol' => 'audio/vnd.digital-winds',
266
+		'eot' => 'application/vnd.ms-fontobject',
267
+		'eps' => 'application/postscript',
268
+		'epub' => 'application/epub+zip',
269
+		'es3' => 'application/vnd.eszigno3+xml',
270
+		'esa' => 'application/vnd.osgi.subsystem',
271
+		'esf' => 'application/vnd.epson.esf',
272
+		'et3' => 'application/vnd.eszigno3+xml',
273
+		'etx' => 'text/x-setext',
274
+		'eva' => 'application/x-eva',
275
+		'evy' => 'application/x-envoy',
276
+		'exe' => 'application/octet-stream',
277
+		'exi' => 'application/exi',
278
+		'exp' => 'application/express',
279
+		'exr' => 'image/aces',
280
+		'ext' => 'application/vnd.novadigm.ext',
281
+		'ez' => 'application/andrew-inset',
282
+		'ez2' => 'application/vnd.ezpix-album',
283
+		'ez3' => 'application/vnd.ezpix-package',
284
+		'f' => 'text/x-fortran',
285
+		'f4v' => 'video/mp4',
286
+		'f77' => 'text/x-fortran',
287
+		'f90' => 'text/x-fortran',
288
+		'fbs' => 'image/vnd.fastbidsheet',
289
+		'fcdt' => 'application/vnd.adobe.formscentral.fcdt',
290
+		'fcs' => 'application/vnd.isac.fcs',
291
+		'fdf' => 'application/vnd.fdf',
292
+		'fdt' => 'application/fdt+xml',
293
+		'fe_launch' => 'application/vnd.denovo.fcselayout-link',
294
+		'fg5' => 'application/vnd.fujitsu.oasysgp',
295
+		'fgd' => 'application/x-director',
296
+		'fh' => 'image/x-freehand',
297
+		'fh4' => 'image/x-freehand',
298
+		'fh5' => 'image/x-freehand',
299
+		'fh7' => 'image/x-freehand',
300
+		'fhc' => 'image/x-freehand',
301
+		'fig' => 'application/x-xfig',
302
+		'fits' => 'image/fits',
303
+		'flac' => 'audio/x-flac',
304
+		'fli' => 'video/x-fli',
305
+		'flo' => 'application/vnd.micrografx.flo',
306
+		'flv' => 'video/x-flv',
307
+		'flw' => 'application/vnd.kde.kivio',
308
+		'flx' => 'text/vnd.fmi.flexstor',
309
+		'fly' => 'text/vnd.fly',
310
+		'fm' => 'application/vnd.framemaker',
311
+		'fnc' => 'application/vnd.frogans.fnc',
312
+		'fo' => 'application/vnd.software602.filler.form+xml',
313
+		'for' => 'text/x-fortran',
314
+		'fpx' => 'image/vnd.fpx',
315
+		'frame' => 'application/vnd.framemaker',
316
+		'fsc' => 'application/vnd.fsc.weblaunch',
317
+		'fst' => 'image/vnd.fst',
318
+		'ftc' => 'application/vnd.fluxtime.clip',
319
+		'fti' => 'application/vnd.anser-web-funds-transfer-initiation',
320
+		'fvt' => 'video/vnd.fvt',
321
+		'fxp' => 'application/vnd.adobe.fxp',
322
+		'fxpl' => 'application/vnd.adobe.fxp',
323
+		'fzs' => 'application/vnd.fuzzysheet',
324
+		'g2w' => 'application/vnd.geoplan',
325
+		'g3' => 'image/g3fax',
326
+		'g3w' => 'application/vnd.geospace',
327
+		'gac' => 'application/vnd.groove-account',
328
+		'gam' => 'application/x-tads',
329
+		'gbr' => 'application/rpki-ghostbusters',
330
+		'gca' => 'application/x-gca-compressed',
331
+		'gdl' => 'model/vnd.gdl',
332
+		'gdoc' => 'application/vnd.google-apps.document',
333
+		'ged' => 'text/vnd.familysearch.gedcom',
334
+		'geo' => 'application/vnd.dynageo',
335
+		'geojson' => 'application/geo+json',
336
+		'gex' => 'application/vnd.geometry-explorer',
337
+		'ggb' => 'application/vnd.geogebra.file',
338
+		'ggt' => 'application/vnd.geogebra.tool',
339
+		'ghf' => 'application/vnd.groove-help',
340
+		'gif' => 'image/gif',
341
+		'gim' => 'application/vnd.groove-identity-message',
342
+		'glb' => 'model/gltf-binary',
343
+		'gltf' => 'model/gltf+json',
344
+		'gml' => 'application/gml+xml',
345
+		'gmx' => 'application/vnd.gmx',
346
+		'gnumeric' => 'application/x-gnumeric',
347
+		'gpg' => 'application/gpg-keys',
348
+		'gph' => 'application/vnd.flographit',
349
+		'gpx' => 'application/gpx+xml',
350
+		'gqf' => 'application/vnd.grafeq',
351
+		'gqs' => 'application/vnd.grafeq',
352
+		'gram' => 'application/srgs',
353
+		'gramps' => 'application/x-gramps-xml',
354
+		'gre' => 'application/vnd.geometry-explorer',
355
+		'grv' => 'application/vnd.groove-injector',
356
+		'grxml' => 'application/srgs+xml',
357
+		'gsf' => 'application/x-font-ghostscript',
358
+		'gsheet' => 'application/vnd.google-apps.spreadsheet',
359
+		'gslides' => 'application/vnd.google-apps.presentation',
360
+		'gtar' => 'application/x-gtar',
361
+		'gtm' => 'application/vnd.groove-tool-message',
362
+		'gtw' => 'model/vnd.gtw',
363
+		'gv' => 'text/vnd.graphviz',
364
+		'gxf' => 'application/gxf',
365
+		'gxt' => 'application/vnd.geonext',
366
+		'gz' => 'application/gzip',
367
+		'gzip' => 'application/gzip',
368
+		'h' => 'text/x-c',
369
+		'h261' => 'video/h261',
370
+		'h263' => 'video/h263',
371
+		'h264' => 'video/h264',
372
+		'hal' => 'application/vnd.hal+xml',
373
+		'hbci' => 'application/vnd.hbci',
374
+		'hbs' => 'text/x-handlebars-template',
375
+		'hdd' => 'application/x-virtualbox-hdd',
376
+		'hdf' => 'application/x-hdf',
377
+		'heic' => 'image/heic',
378
+		'heics' => 'image/heic-sequence',
379
+		'heif' => 'image/heif',
380
+		'heifs' => 'image/heif-sequence',
381
+		'hej2' => 'image/hej2k',
382
+		'held' => 'application/atsc-held+xml',
383
+		'hh' => 'text/x-c',
384
+		'hjson' => 'application/hjson',
385
+		'hlp' => 'application/winhlp',
386
+		'hpgl' => 'application/vnd.hp-hpgl',
387
+		'hpid' => 'application/vnd.hp-hpid',
388
+		'hps' => 'application/vnd.hp-hps',
389
+		'hqx' => 'application/mac-binhex40',
390
+		'hsj2' => 'image/hsj2',
391
+		'htc' => 'text/x-component',
392
+		'htke' => 'application/vnd.kenameaapp',
393
+		'htm' => 'text/html',
394
+		'html' => 'text/html',
395
+		'hvd' => 'application/vnd.yamaha.hv-dic',
396
+		'hvp' => 'application/vnd.yamaha.hv-voice',
397
+		'hvs' => 'application/vnd.yamaha.hv-script',
398
+		'i2g' => 'application/vnd.intergeo',
399
+		'icc' => 'application/vnd.iccprofile',
400
+		'ice' => 'x-conference/x-cooltalk',
401
+		'icm' => 'application/vnd.iccprofile',
402
+		'ico' => 'image/x-icon',
403
+		'ics' => 'text/calendar',
404
+		'ief' => 'image/ief',
405
+		'ifb' => 'text/calendar',
406
+		'ifm' => 'application/vnd.shana.informed.formdata',
407
+		'iges' => 'model/iges',
408
+		'igl' => 'application/vnd.igloader',
409
+		'igm' => 'application/vnd.insors.igm',
410
+		'igs' => 'model/iges',
411
+		'igx' => 'application/vnd.micrografx.igx',
412
+		'iif' => 'application/vnd.shana.informed.interchange',
413
+		'img' => 'application/octet-stream',
414
+		'imp' => 'application/vnd.accpac.simply.imp',
415
+		'ims' => 'application/vnd.ms-ims',
416
+		'in' => 'text/plain',
417
+		'ini' => 'text/plain',
418
+		'ink' => 'application/inkml+xml',
419
+		'inkml' => 'application/inkml+xml',
420
+		'install' => 'application/x-install-instructions',
421
+		'iota' => 'application/vnd.astraea-software.iota',
422
+		'ipfix' => 'application/ipfix',
423
+		'ipk' => 'application/vnd.shana.informed.package',
424
+		'irm' => 'application/vnd.ibm.rights-management',
425
+		'irp' => 'application/vnd.irepository.package+xml',
426
+		'iso' => 'application/x-iso9660-image',
427
+		'itp' => 'application/vnd.shana.informed.formtemplate',
428
+		'its' => 'application/its+xml',
429
+		'ivp' => 'application/vnd.immervision-ivp',
430
+		'ivu' => 'application/vnd.immervision-ivu',
431
+		'jad' => 'text/vnd.sun.j2me.app-descriptor',
432
+		'jade' => 'text/jade',
433
+		'jam' => 'application/vnd.jam',
434
+		'jar' => 'application/java-archive',
435
+		'jardiff' => 'application/x-java-archive-diff',
436
+		'java' => 'text/x-java-source',
437
+		'jhc' => 'image/jphc',
438
+		'jisp' => 'application/vnd.jisp',
439
+		'jls' => 'image/jls',
440
+		'jlt' => 'application/vnd.hp-jlyt',
441
+		'jng' => 'image/x-jng',
442
+		'jnlp' => 'application/x-java-jnlp-file',
443
+		'joda' => 'application/vnd.joost.joda-archive',
444
+		'jp2' => 'image/jp2',
445
+		'jpe' => 'image/jpeg',
446
+		'jpeg' => 'image/jpeg',
447
+		'jpf' => 'image/jpx',
448
+		'jpg' => 'image/jpeg',
449
+		'jpg2' => 'image/jp2',
450
+		'jpgm' => 'video/jpm',
451
+		'jpgv' => 'video/jpeg',
452
+		'jph' => 'image/jph',
453
+		'jpm' => 'video/jpm',
454
+		'jpx' => 'image/jpx',
455
+		'js' => 'application/javascript',
456
+		'json' => 'application/json',
457
+		'json5' => 'application/json5',
458
+		'jsonld' => 'application/ld+json',
459
+		'jsonml' => 'application/jsonml+json',
460
+		'jsx' => 'text/jsx',
461
+		'jt' => 'model/jt',
462
+		'jxr' => 'image/jxr',
463
+		'jxra' => 'image/jxra',
464
+		'jxrs' => 'image/jxrs',
465
+		'jxs' => 'image/jxs',
466
+		'jxsc' => 'image/jxsc',
467
+		'jxsi' => 'image/jxsi',
468
+		'jxss' => 'image/jxss',
469
+		'kar' => 'audio/midi',
470
+		'karbon' => 'application/vnd.kde.karbon',
471
+		'kdb' => 'application/octet-stream',
472
+		'kdbx' => 'application/x-keepass2',
473
+		'key' => 'application/x-iwork-keynote-sffkey',
474
+		'kfo' => 'application/vnd.kde.kformula',
475
+		'kia' => 'application/vnd.kidspiration',
476
+		'kml' => 'application/vnd.google-earth.kml+xml',
477
+		'kmz' => 'application/vnd.google-earth.kmz',
478
+		'kne' => 'application/vnd.kinar',
479
+		'knp' => 'application/vnd.kinar',
480
+		'kon' => 'application/vnd.kde.kontour',
481
+		'kpr' => 'application/vnd.kde.kpresenter',
482
+		'kpt' => 'application/vnd.kde.kpresenter',
483
+		'kpxx' => 'application/vnd.ds-keypoint',
484
+		'ksp' => 'application/vnd.kde.kspread',
485
+		'ktr' => 'application/vnd.kahootz',
486
+		'ktx' => 'image/ktx',
487
+		'ktx2' => 'image/ktx2',
488
+		'ktz' => 'application/vnd.kahootz',
489
+		'kwd' => 'application/vnd.kde.kword',
490
+		'kwt' => 'application/vnd.kde.kword',
491
+		'lasxml' => 'application/vnd.las.las+xml',
492
+		'latex' => 'application/x-latex',
493
+		'lbd' => 'application/vnd.llamagraphics.life-balance.desktop',
494
+		'lbe' => 'application/vnd.llamagraphics.life-balance.exchange+xml',
495
+		'les' => 'application/vnd.hhe.lesson-player',
496
+		'less' => 'text/less',
497
+		'lgr' => 'application/lgr+xml',
498
+		'lha' => 'application/octet-stream',
499
+		'link66' => 'application/vnd.route66.link66+xml',
500
+		'list' => 'text/plain',
501
+		'list3820' => 'application/vnd.ibm.modcap',
502
+		'listafp' => 'application/vnd.ibm.modcap',
503
+		'litcoffee' => 'text/coffeescript',
504
+		'lnk' => 'application/x-ms-shortcut',
505
+		'log' => 'text/plain',
506
+		'lostxml' => 'application/lost+xml',
507
+		'lrf' => 'application/octet-stream',
508
+		'lrm' => 'application/vnd.ms-lrm',
509
+		'ltf' => 'application/vnd.frogans.ltf',
510
+		'lua' => 'text/x-lua',
511
+		'luac' => 'application/x-lua-bytecode',
512
+		'lvp' => 'audio/vnd.lucent.voice',
513
+		'lwp' => 'application/vnd.lotus-wordpro',
514
+		'lzh' => 'application/octet-stream',
515
+		'm1v' => 'video/mpeg',
516
+		'm2a' => 'audio/mpeg',
517
+		'm2v' => 'video/mpeg',
518
+		'm3a' => 'audio/mpeg',
519
+		'm3u' => 'text/plain',
520
+		'm3u8' => 'application/vnd.apple.mpegurl',
521
+		'm4a' => 'audio/x-m4a',
522
+		'm4p' => 'application/mp4',
523
+		'm4s' => 'video/iso.segment',
524
+		'm4u' => 'application/vnd.mpegurl',
525
+		'm4v' => 'video/x-m4v',
526
+		'm13' => 'application/x-msmediaview',
527
+		'm14' => 'application/x-msmediaview',
528
+		'm21' => 'application/mp21',
529
+		'ma' => 'application/mathematica',
530
+		'mads' => 'application/mads+xml',
531
+		'maei' => 'application/mmt-aei+xml',
532
+		'mag' => 'application/vnd.ecowin.chart',
533
+		'maker' => 'application/vnd.framemaker',
534
+		'man' => 'text/troff',
535
+		'manifest' => 'text/cache-manifest',
536
+		'map' => 'application/json',
537
+		'mar' => 'application/octet-stream',
538
+		'markdown' => 'text/markdown',
539
+		'mathml' => 'application/mathml+xml',
540
+		'mb' => 'application/mathematica',
541
+		'mbk' => 'application/vnd.mobius.mbk',
542
+		'mbox' => 'application/mbox',
543
+		'mc1' => 'application/vnd.medcalcdata',
544
+		'mcd' => 'application/vnd.mcd',
545
+		'mcurl' => 'text/vnd.curl.mcurl',
546
+		'md' => 'text/markdown',
547
+		'mdb' => 'application/x-msaccess',
548
+		'mdi' => 'image/vnd.ms-modi',
549
+		'mdx' => 'text/mdx',
550
+		'me' => 'text/troff',
551
+		'mesh' => 'model/mesh',
552
+		'meta4' => 'application/metalink4+xml',
553
+		'metalink' => 'application/metalink+xml',
554
+		'mets' => 'application/mets+xml',
555
+		'mfm' => 'application/vnd.mfmp',
556
+		'mft' => 'application/rpki-manifest',
557
+		'mgp' => 'application/vnd.osgeo.mapguide.package',
558
+		'mgz' => 'application/vnd.proteus.magazine',
559
+		'mid' => 'audio/midi',
560
+		'midi' => 'audio/midi',
561
+		'mie' => 'application/x-mie',
562
+		'mif' => 'application/vnd.mif',
563
+		'mime' => 'message/rfc822',
564
+		'mj2' => 'video/mj2',
565
+		'mjp2' => 'video/mj2',
566
+		'mjs' => 'text/javascript',
567
+		'mk3d' => 'video/x-matroska',
568
+		'mka' => 'audio/x-matroska',
569
+		'mkd' => 'text/x-markdown',
570
+		'mks' => 'video/x-matroska',
571
+		'mkv' => 'video/x-matroska',
572
+		'mlp' => 'application/vnd.dolby.mlp',
573
+		'mmd' => 'application/vnd.chipnuts.karaoke-mmd',
574
+		'mmf' => 'application/vnd.smaf',
575
+		'mml' => 'text/mathml',
576
+		'mmr' => 'image/vnd.fujixerox.edmics-mmr',
577
+		'mng' => 'video/x-mng',
578
+		'mny' => 'application/x-msmoney',
579
+		'mobi' => 'application/x-mobipocket-ebook',
580
+		'mods' => 'application/mods+xml',
581
+		'mov' => 'video/quicktime',
582
+		'movie' => 'video/x-sgi-movie',
583
+		'mp2' => 'audio/mpeg',
584
+		'mp2a' => 'audio/mpeg',
585
+		'mp3' => 'audio/mpeg',
586
+		'mp4' => 'video/mp4',
587
+		'mp4a' => 'audio/mp4',
588
+		'mp4s' => 'application/mp4',
589
+		'mp4v' => 'video/mp4',
590
+		'mp21' => 'application/mp21',
591
+		'mpc' => 'application/vnd.mophun.certificate',
592
+		'mpd' => 'application/dash+xml',
593
+		'mpe' => 'video/mpeg',
594
+		'mpeg' => 'video/mpeg',
595
+		'mpf' => 'application/media-policy-dataset+xml',
596
+		'mpg' => 'video/mpeg',
597
+		'mpg4' => 'video/mp4',
598
+		'mpga' => 'audio/mpeg',
599
+		'mpkg' => 'application/vnd.apple.installer+xml',
600
+		'mpm' => 'application/vnd.blueice.multipass',
601
+		'mpn' => 'application/vnd.mophun.application',
602
+		'mpp' => 'application/vnd.ms-project',
603
+		'mpt' => 'application/vnd.ms-project',
604
+		'mpy' => 'application/vnd.ibm.minipay',
605
+		'mqy' => 'application/vnd.mobius.mqy',
606
+		'mrc' => 'application/marc',
607
+		'mrcx' => 'application/marcxml+xml',
608
+		'ms' => 'text/troff',
609
+		'mscml' => 'application/mediaservercontrol+xml',
610
+		'mseed' => 'application/vnd.fdsn.mseed',
611
+		'mseq' => 'application/vnd.mseq',
612
+		'msf' => 'application/vnd.epson.msf',
613
+		'msg' => 'application/vnd.ms-outlook',
614
+		'msh' => 'model/mesh',
615
+		'msi' => 'application/x-msdownload',
616
+		'msix' => 'application/msix',
617
+		'msixbundle' => 'application/msixbundle',
618
+		'msl' => 'application/vnd.mobius.msl',
619
+		'msm' => 'application/octet-stream',
620
+		'msp' => 'application/octet-stream',
621
+		'msty' => 'application/vnd.muvee.style',
622
+		'mtl' => 'model/mtl',
623
+		'mts' => 'model/vnd.mts',
624
+		'mus' => 'application/vnd.musician',
625
+		'musd' => 'application/mmt-usd+xml',
626
+		'musicxml' => 'application/vnd.recordare.musicxml+xml',
627
+		'mvb' => 'application/x-msmediaview',
628
+		'mvt' => 'application/vnd.mapbox-vector-tile',
629
+		'mwf' => 'application/vnd.mfer',
630
+		'mxf' => 'application/mxf',
631
+		'mxl' => 'application/vnd.recordare.musicxml',
632
+		'mxmf' => 'audio/mobile-xmf',
633
+		'mxml' => 'application/xv+xml',
634
+		'mxs' => 'application/vnd.triscape.mxs',
635
+		'mxu' => 'video/vnd.mpegurl',
636
+		'n-gage' => 'application/vnd.nokia.n-gage.symbian.install',
637
+		'n3' => 'text/n3',
638
+		'nb' => 'application/mathematica',
639
+		'nbp' => 'application/vnd.wolfram.player',
640
+		'nc' => 'application/x-netcdf',
641
+		'ncx' => 'application/x-dtbncx+xml',
642
+		'nfo' => 'text/x-nfo',
643
+		'ngdat' => 'application/vnd.nokia.n-gage.data',
644
+		'nitf' => 'application/vnd.nitf',
645
+		'nlu' => 'application/vnd.neurolanguage.nlu',
646
+		'nml' => 'application/vnd.enliven',
647
+		'nnd' => 'application/vnd.noblenet-directory',
648
+		'nns' => 'application/vnd.noblenet-sealer',
649
+		'nnw' => 'application/vnd.noblenet-web',
650
+		'npx' => 'image/vnd.net-fpx',
651
+		'nq' => 'application/n-quads',
652
+		'nsc' => 'application/x-conference',
653
+		'nsf' => 'application/vnd.lotus-notes',
654
+		'nt' => 'application/n-triples',
655
+		'ntf' => 'application/vnd.nitf',
656
+		'numbers' => 'application/x-iwork-numbers-sffnumbers',
657
+		'nzb' => 'application/x-nzb',
658
+		'oa2' => 'application/vnd.fujitsu.oasys2',
659
+		'oa3' => 'application/vnd.fujitsu.oasys3',
660
+		'oas' => 'application/vnd.fujitsu.oasys',
661
+		'obd' => 'application/x-msbinder',
662
+		'obgx' => 'application/vnd.openblox.game+xml',
663
+		'obj' => 'model/obj',
664
+		'oda' => 'application/oda',
665
+		'odb' => 'application/vnd.oasis.opendocument.database',
666
+		'odc' => 'application/vnd.oasis.opendocument.chart',
667
+		'odf' => 'application/vnd.oasis.opendocument.formula',
668
+		'odft' => 'application/vnd.oasis.opendocument.formula-template',
669
+		'odg' => 'application/vnd.oasis.opendocument.graphics',
670
+		'odi' => 'application/vnd.oasis.opendocument.image',
671
+		'odm' => 'application/vnd.oasis.opendocument.text-master',
672
+		'odp' => 'application/vnd.oasis.opendocument.presentation',
673
+		'ods' => 'application/vnd.oasis.opendocument.spreadsheet',
674
+		'odt' => 'application/vnd.oasis.opendocument.text',
675
+		'oga' => 'audio/ogg',
676
+		'ogex' => 'model/vnd.opengex',
677
+		'ogg' => 'audio/ogg',
678
+		'ogv' => 'video/ogg',
679
+		'ogx' => 'application/ogg',
680
+		'omdoc' => 'application/omdoc+xml',
681
+		'onepkg' => 'application/onenote',
682
+		'onetmp' => 'application/onenote',
683
+		'onetoc' => 'application/onenote',
684
+		'onetoc2' => 'application/onenote',
685
+		'opf' => 'application/oebps-package+xml',
686
+		'opml' => 'text/x-opml',
687
+		'oprc' => 'application/vnd.palm',
688
+		'opus' => 'audio/ogg',
689
+		'org' => 'text/x-org',
690
+		'osf' => 'application/vnd.yamaha.openscoreformat',
691
+		'osfpvg' => 'application/vnd.yamaha.openscoreformat.osfpvg+xml',
692
+		'osm' => 'application/vnd.openstreetmap.data+xml',
693
+		'otc' => 'application/vnd.oasis.opendocument.chart-template',
694
+		'otf' => 'font/otf',
695
+		'otg' => 'application/vnd.oasis.opendocument.graphics-template',
696
+		'oth' => 'application/vnd.oasis.opendocument.text-web',
697
+		'oti' => 'application/vnd.oasis.opendocument.image-template',
698
+		'otp' => 'application/vnd.oasis.opendocument.presentation-template',
699
+		'ots' => 'application/vnd.oasis.opendocument.spreadsheet-template',
700
+		'ott' => 'application/vnd.oasis.opendocument.text-template',
701
+		'ova' => 'application/x-virtualbox-ova',
702
+		'ovf' => 'application/x-virtualbox-ovf',
703
+		'owl' => 'application/rdf+xml',
704
+		'oxps' => 'application/oxps',
705
+		'oxt' => 'application/vnd.openofficeorg.extension',
706
+		'p' => 'text/x-pascal',
707
+		'p7a' => 'application/x-pkcs7-signature',
708
+		'p7b' => 'application/x-pkcs7-certificates',
709
+		'p7c' => 'application/pkcs7-mime',
710
+		'p7m' => 'application/pkcs7-mime',
711
+		'p7r' => 'application/x-pkcs7-certreqresp',
712
+		'p7s' => 'application/pkcs7-signature',
713
+		'p8' => 'application/pkcs8',
714
+		'p10' => 'application/x-pkcs10',
715
+		'p12' => 'application/x-pkcs12',
716
+		'pac' => 'application/x-ns-proxy-autoconfig',
717
+		'pages' => 'application/x-iwork-pages-sffpages',
718
+		'pas' => 'text/x-pascal',
719
+		'paw' => 'application/vnd.pawaafile',
720
+		'pbd' => 'application/vnd.powerbuilder6',
721
+		'pbm' => 'image/x-portable-bitmap',
722
+		'pcap' => 'application/vnd.tcpdump.pcap',
723
+		'pcf' => 'application/x-font-pcf',
724
+		'pcl' => 'application/vnd.hp-pcl',
725
+		'pclxl' => 'application/vnd.hp-pclxl',
726
+		'pct' => 'image/x-pict',
727
+		'pcurl' => 'application/vnd.curl.pcurl',
728
+		'pcx' => 'image/x-pcx',
729
+		'pdb' => 'application/x-pilot',
730
+		'pde' => 'text/x-processing',
731
+		'pdf' => 'application/pdf',
732
+		'pem' => 'application/x-x509-user-cert',
733
+		'pfa' => 'application/x-font-type1',
734
+		'pfb' => 'application/x-font-type1',
735
+		'pfm' => 'application/x-font-type1',
736
+		'pfr' => 'application/font-tdpfr',
737
+		'pfx' => 'application/x-pkcs12',
738
+		'pgm' => 'image/x-portable-graymap',
739
+		'pgn' => 'application/x-chess-pgn',
740
+		'pgp' => 'application/pgp',
741
+		'phar' => 'application/octet-stream',
742
+		'php' => 'application/x-httpd-php',
743
+		'php3' => 'application/x-httpd-php',
744
+		'php4' => 'application/x-httpd-php',
745
+		'phps' => 'application/x-httpd-php-source',
746
+		'phtml' => 'application/x-httpd-php',
747
+		'pic' => 'image/x-pict',
748
+		'pkg' => 'application/octet-stream',
749
+		'pki' => 'application/pkixcmp',
750
+		'pkipath' => 'application/pkix-pkipath',
751
+		'pkpass' => 'application/vnd.apple.pkpass',
752
+		'pl' => 'application/x-perl',
753
+		'plb' => 'application/vnd.3gpp.pic-bw-large',
754
+		'plc' => 'application/vnd.mobius.plc',
755
+		'plf' => 'application/vnd.pocketlearn',
756
+		'pls' => 'application/pls+xml',
757
+		'pm' => 'application/x-perl',
758
+		'pml' => 'application/vnd.ctc-posml',
759
+		'png' => 'image/png',
760
+		'pnm' => 'image/x-portable-anymap',
761
+		'portpkg' => 'application/vnd.macports.portpkg',
762
+		'pot' => 'application/vnd.ms-powerpoint',
763
+		'potm' => 'application/vnd.ms-powerpoint.presentation.macroEnabled.12',
764
+		'potx' => 'application/vnd.openxmlformats-officedocument.presentationml.template',
765
+		'ppa' => 'application/vnd.ms-powerpoint',
766
+		'ppam' => 'application/vnd.ms-powerpoint.addin.macroEnabled.12',
767
+		'ppd' => 'application/vnd.cups-ppd',
768
+		'ppm' => 'image/x-portable-pixmap',
769
+		'pps' => 'application/vnd.ms-powerpoint',
770
+		'ppsm' => 'application/vnd.ms-powerpoint.slideshow.macroEnabled.12',
771
+		'ppsx' => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow',
772
+		'ppt' => 'application/powerpoint',
773
+		'pptm' => 'application/vnd.ms-powerpoint.presentation.macroEnabled.12',
774
+		'pptx' => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
775
+		'pqa' => 'application/vnd.palm',
776
+		'prc' => 'model/prc',
777
+		'pre' => 'application/vnd.lotus-freelance',
778
+		'prf' => 'application/pics-rules',
779
+		'provx' => 'application/provenance+xml',
780
+		'ps' => 'application/postscript',
781
+		'psb' => 'application/vnd.3gpp.pic-bw-small',
782
+		'psd' => 'application/x-photoshop',
783
+		'psf' => 'application/x-font-linux-psf',
784
+		'pskcxml' => 'application/pskc+xml',
785
+		'pti' => 'image/prs.pti',
786
+		'ptid' => 'application/vnd.pvi.ptid1',
787
+		'pub' => 'application/x-mspublisher',
788
+		'pvb' => 'application/vnd.3gpp.pic-bw-var',
789
+		'pwn' => 'application/vnd.3m.post-it-notes',
790
+		'pya' => 'audio/vnd.ms-playready.media.pya',
791
+		'pyo' => 'model/vnd.pytha.pyox',
792
+		'pyox' => 'model/vnd.pytha.pyox',
793
+		'pyv' => 'video/vnd.ms-playready.media.pyv',
794
+		'qam' => 'application/vnd.epson.quickanime',
795
+		'qbo' => 'application/vnd.intu.qbo',
796
+		'qfx' => 'application/vnd.intu.qfx',
797
+		'qps' => 'application/vnd.publishare-delta-tree',
798
+		'qt' => 'video/quicktime',
799
+		'qwd' => 'application/vnd.quark.quarkxpress',
800
+		'qwt' => 'application/vnd.quark.quarkxpress',
801
+		'qxb' => 'application/vnd.quark.quarkxpress',
802
+		'qxd' => 'application/vnd.quark.quarkxpress',
803
+		'qxl' => 'application/vnd.quark.quarkxpress',
804
+		'qxt' => 'application/vnd.quark.quarkxpress',
805
+		'ra' => 'audio/x-realaudio',
806
+		'ram' => 'audio/x-pn-realaudio',
807
+		'raml' => 'application/raml+yaml',
808
+		'rapd' => 'application/route-apd+xml',
809
+		'rar' => 'application/x-rar',
810
+		'ras' => 'image/x-cmu-raster',
811
+		'rcprofile' => 'application/vnd.ipunplugged.rcprofile',
812
+		'rdf' => 'application/rdf+xml',
813
+		'rdz' => 'application/vnd.data-vision.rdz',
814
+		'relo' => 'application/p2p-overlay+xml',
815
+		'rep' => 'application/vnd.businessobjects',
816
+		'res' => 'application/x-dtbresource+xml',
817
+		'rgb' => 'image/x-rgb',
818
+		'rif' => 'application/reginfo+xml',
819
+		'rip' => 'audio/vnd.rip',
820
+		'ris' => 'application/x-research-info-systems',
821
+		'rl' => 'application/resource-lists+xml',
822
+		'rlc' => 'image/vnd.fujixerox.edmics-rlc',
823
+		'rld' => 'application/resource-lists-diff+xml',
824
+		'rm' => 'audio/x-pn-realaudio',
825
+		'rmi' => 'audio/midi',
826
+		'rmp' => 'audio/x-pn-realaudio-plugin',
827
+		'rms' => 'application/vnd.jcp.javame.midlet-rms',
828
+		'rmvb' => 'application/vnd.rn-realmedia-vbr',
829
+		'rnc' => 'application/relax-ng-compact-syntax',
830
+		'rng' => 'application/xml',
831
+		'roa' => 'application/rpki-roa',
832
+		'roff' => 'text/troff',
833
+		'rp9' => 'application/vnd.cloanto.rp9',
834
+		'rpm' => 'audio/x-pn-realaudio-plugin',
835
+		'rpss' => 'application/vnd.nokia.radio-presets',
836
+		'rpst' => 'application/vnd.nokia.radio-preset',
837
+		'rq' => 'application/sparql-query',
838
+		'rs' => 'application/rls-services+xml',
839
+		'rsa' => 'application/x-pkcs7',
840
+		'rsat' => 'application/atsc-rsat+xml',
841
+		'rsd' => 'application/rsd+xml',
842
+		'rsheet' => 'application/urc-ressheet+xml',
843
+		'rss' => 'application/rss+xml',
844
+		'rtf' => 'text/rtf',
845
+		'rtx' => 'text/richtext',
846
+		'run' => 'application/x-makeself',
847
+		'rusd' => 'application/route-usd+xml',
848
+		'rv' => 'video/vnd.rn-realvideo',
849
+		's' => 'text/x-asm',
850
+		's3m' => 'audio/s3m',
851
+		'saf' => 'application/vnd.yamaha.smaf-audio',
852
+		'sass' => 'text/x-sass',
853
+		'sbml' => 'application/sbml+xml',
854
+		'sc' => 'application/vnd.ibm.secure-container',
855
+		'scd' => 'application/x-msschedule',
856
+		'scm' => 'application/vnd.lotus-screencam',
857
+		'scq' => 'application/scvp-cv-request',
858
+		'scs' => 'application/scvp-cv-response',
859
+		'scss' => 'text/x-scss',
860
+		'scurl' => 'text/vnd.curl.scurl',
861
+		'sda' => 'application/vnd.stardivision.draw',
862
+		'sdc' => 'application/vnd.stardivision.calc',
863
+		'sdd' => 'application/vnd.stardivision.impress',
864
+		'sdkd' => 'application/vnd.solent.sdkm+xml',
865
+		'sdkm' => 'application/vnd.solent.sdkm+xml',
866
+		'sdp' => 'application/sdp',
867
+		'sdw' => 'application/vnd.stardivision.writer',
868
+		'sea' => 'application/octet-stream',
869
+		'see' => 'application/vnd.seemail',
870
+		'seed' => 'application/vnd.fdsn.seed',
871
+		'sema' => 'application/vnd.sema',
872
+		'semd' => 'application/vnd.semd',
873
+		'semf' => 'application/vnd.semf',
874
+		'senmlx' => 'application/senml+xml',
875
+		'sensmlx' => 'application/sensml+xml',
876
+		'ser' => 'application/java-serialized-object',
877
+		'setpay' => 'application/set-payment-initiation',
878
+		'setreg' => 'application/set-registration-initiation',
879
+		'sfd-hdstx' => 'application/vnd.hydrostatix.sof-data',
880
+		'sfs' => 'application/vnd.spotfire.sfs',
881
+		'sfv' => 'text/x-sfv',
882
+		'sgi' => 'image/sgi',
883
+		'sgl' => 'application/vnd.stardivision.writer-global',
884
+		'sgm' => 'text/sgml',
885
+		'sgml' => 'text/sgml',
886
+		'sh' => 'application/x-sh',
887
+		'shar' => 'application/x-shar',
888
+		'shex' => 'text/shex',
889
+		'shf' => 'application/shf+xml',
890
+		'shtml' => 'text/html',
891
+		'sid' => 'image/x-mrsid-image',
892
+		'sieve' => 'application/sieve',
893
+		'sig' => 'application/pgp-signature',
894
+		'sil' => 'audio/silk',
895
+		'silo' => 'model/mesh',
896
+		'sis' => 'application/vnd.symbian.install',
897
+		'sisx' => 'application/vnd.symbian.install',
898
+		'sit' => 'application/x-stuffit',
899
+		'sitx' => 'application/x-stuffitx',
900
+		'siv' => 'application/sieve',
901
+		'skd' => 'application/vnd.koan',
902
+		'skm' => 'application/vnd.koan',
903
+		'skp' => 'application/vnd.koan',
904
+		'skt' => 'application/vnd.koan',
905
+		'sldm' => 'application/vnd.ms-powerpoint.slide.macroenabled.12',
906
+		'sldx' => 'application/vnd.openxmlformats-officedocument.presentationml.slide',
907
+		'slim' => 'text/slim',
908
+		'slm' => 'text/slim',
909
+		'sls' => 'application/route-s-tsid+xml',
910
+		'slt' => 'application/vnd.epson.salt',
911
+		'sm' => 'application/vnd.stepmania.stepchart',
912
+		'smf' => 'application/vnd.stardivision.math',
913
+		'smi' => 'application/smil',
914
+		'smil' => 'application/smil',
915
+		'smv' => 'video/x-smv',
916
+		'smzip' => 'application/vnd.stepmania.package',
917
+		'snd' => 'audio/basic',
918
+		'snf' => 'application/x-font-snf',
919
+		'so' => 'application/octet-stream',
920
+		'spc' => 'application/x-pkcs7-certificates',
921
+		'spdx' => 'text/spdx',
922
+		'spf' => 'application/vnd.yamaha.smaf-phrase',
923
+		'spl' => 'application/x-futuresplash',
924
+		'spot' => 'text/vnd.in3d.spot',
925
+		'spp' => 'application/scvp-vp-response',
926
+		'spq' => 'application/scvp-vp-request',
927
+		'spx' => 'audio/ogg',
928
+		'sql' => 'application/x-sql',
929
+		'src' => 'application/x-wais-source',
930
+		'srt' => 'application/x-subrip',
931
+		'sru' => 'application/sru+xml',
932
+		'srx' => 'application/sparql-results+xml',
933
+		'ssdl' => 'application/ssdl+xml',
934
+		'sse' => 'application/vnd.kodak-descriptor',
935
+		'ssf' => 'application/vnd.epson.ssf',
936
+		'ssml' => 'application/ssml+xml',
937
+		'sst' => 'application/octet-stream',
938
+		'st' => 'application/vnd.sailingtracker.track',
939
+		'stc' => 'application/vnd.sun.xml.calc.template',
940
+		'std' => 'application/vnd.sun.xml.draw.template',
941
+		'step' => 'application/STEP',
942
+		'stf' => 'application/vnd.wt.stf',
943
+		'sti' => 'application/vnd.sun.xml.impress.template',
944
+		'stk' => 'application/hyperstudio',
945
+		'stl' => 'model/stl',
946
+		'stp' => 'application/STEP',
947
+		'stpx' => 'model/step+xml',
948
+		'stpxz' => 'model/step-xml+zip',
949
+		'stpz' => 'model/step+zip',
950
+		'str' => 'application/vnd.pg.format',
951
+		'stw' => 'application/vnd.sun.xml.writer.template',
952
+		'styl' => 'text/stylus',
953
+		'stylus' => 'text/stylus',
954
+		'sub' => 'text/vnd.dvb.subtitle',
955
+		'sus' => 'application/vnd.sus-calendar',
956
+		'susp' => 'application/vnd.sus-calendar',
957
+		'sv4cpio' => 'application/x-sv4cpio',
958
+		'sv4crc' => 'application/x-sv4crc',
959
+		'svc' => 'application/vnd.dvb.service',
960
+		'svd' => 'application/vnd.svd',
961
+		'svg' => 'image/svg+xml',
962
+		'svgz' => 'image/svg+xml',
963
+		'swa' => 'application/x-director',
964
+		'swf' => 'application/x-shockwave-flash',
965
+		'swi' => 'application/vnd.aristanetworks.swi',
966
+		'swidtag' => 'application/swid+xml',
967
+		'sxc' => 'application/vnd.sun.xml.calc',
968
+		'sxd' => 'application/vnd.sun.xml.draw',
969
+		'sxg' => 'application/vnd.sun.xml.writer.global',
970
+		'sxi' => 'application/vnd.sun.xml.impress',
971
+		'sxm' => 'application/vnd.sun.xml.math',
972
+		'sxw' => 'application/vnd.sun.xml.writer',
973
+		't' => 'text/troff',
974
+		't3' => 'application/x-t3vm-image',
975
+		't38' => 'image/t38',
976
+		'taglet' => 'application/vnd.mynfc',
977
+		'tao' => 'application/vnd.tao.intent-module-archive',
978
+		'tap' => 'image/vnd.tencent.tap',
979
+		'tar' => 'application/x-tar',
980
+		'tcap' => 'application/vnd.3gpp2.tcap',
981
+		'tcl' => 'application/x-tcl',
982
+		'td' => 'application/urc-targetdesc+xml',
983
+		'teacher' => 'application/vnd.smart.teacher',
984
+		'tei' => 'application/tei+xml',
985
+		'teicorpus' => 'application/tei+xml',
986
+		'tex' => 'application/x-tex',
987
+		'texi' => 'application/x-texinfo',
988
+		'texinfo' => 'application/x-texinfo',
989
+		'text' => 'text/plain',
990
+		'tfi' => 'application/thraud+xml',
991
+		'tfm' => 'application/x-tex-tfm',
992
+		'tfx' => 'image/tiff-fx',
993
+		'tga' => 'image/x-tga',
994
+		'tgz' => 'application/x-tar',
995
+		'thmx' => 'application/vnd.ms-officetheme',
996
+		'tif' => 'image/tiff',
997
+		'tiff' => 'image/tiff',
998
+		'tk' => 'application/x-tcl',
999
+		'tmo' => 'application/vnd.tmobile-livetv',
1000
+		'toml' => 'application/toml',
1001
+		'torrent' => 'application/x-bittorrent',
1002
+		'tpl' => 'application/vnd.groove-tool-template',
1003
+		'tpt' => 'application/vnd.trid.tpt',
1004
+		'tr' => 'text/troff',
1005
+		'tra' => 'application/vnd.trueapp',
1006
+		'trig' => 'application/trig',
1007
+		'trm' => 'application/x-msterminal',
1008
+		'ts' => 'video/mp2t',
1009
+		'tsd' => 'application/timestamped-data',
1010
+		'tsv' => 'text/tab-separated-values',
1011
+		'ttc' => 'font/collection',
1012
+		'ttf' => 'font/ttf',
1013
+		'ttl' => 'text/turtle',
1014
+		'ttml' => 'application/ttml+xml',
1015
+		'twd' => 'application/vnd.simtech-mindmapper',
1016
+		'twds' => 'application/vnd.simtech-mindmapper',
1017
+		'txd' => 'application/vnd.genomatix.tuxedo',
1018
+		'txf' => 'application/vnd.mobius.txf',
1019
+		'txt' => 'text/plain',
1020
+		'u3d' => 'model/u3d',
1021
+		'u8dsn' => 'message/global-delivery-status',
1022
+		'u8hdr' => 'message/global-headers',
1023
+		'u8mdn' => 'message/global-disposition-notification',
1024
+		'u8msg' => 'message/global',
1025
+		'u32' => 'application/x-authorware-bin',
1026
+		'ubj' => 'application/ubjson',
1027
+		'udeb' => 'application/x-debian-package',
1028
+		'ufd' => 'application/vnd.ufdl',
1029
+		'ufdl' => 'application/vnd.ufdl',
1030
+		'ulx' => 'application/x-glulx',
1031
+		'umj' => 'application/vnd.umajin',
1032
+		'unityweb' => 'application/vnd.unity',
1033
+		'uo' => 'application/vnd.uoml+xml',
1034
+		'uoml' => 'application/vnd.uoml+xml',
1035
+		'uri' => 'text/uri-list',
1036
+		'uris' => 'text/uri-list',
1037
+		'urls' => 'text/uri-list',
1038
+		'usda' => 'model/vnd.usda',
1039
+		'usdz' => 'model/vnd.usdz+zip',
1040
+		'ustar' => 'application/x-ustar',
1041
+		'utz' => 'application/vnd.uiq.theme',
1042
+		'uu' => 'text/x-uuencode',
1043
+		'uva' => 'audio/vnd.dece.audio',
1044
+		'uvd' => 'application/vnd.dece.data',
1045
+		'uvf' => 'application/vnd.dece.data',
1046
+		'uvg' => 'image/vnd.dece.graphic',
1047
+		'uvh' => 'video/vnd.dece.hd',
1048
+		'uvi' => 'image/vnd.dece.graphic',
1049
+		'uvm' => 'video/vnd.dece.mobile',
1050
+		'uvp' => 'video/vnd.dece.pd',
1051
+		'uvs' => 'video/vnd.dece.sd',
1052
+		'uvt' => 'application/vnd.dece.ttml+xml',
1053
+		'uvu' => 'video/vnd.uvvu.mp4',
1054
+		'uvv' => 'video/vnd.dece.video',
1055
+		'uvva' => 'audio/vnd.dece.audio',
1056
+		'uvvd' => 'application/vnd.dece.data',
1057
+		'uvvf' => 'application/vnd.dece.data',
1058
+		'uvvg' => 'image/vnd.dece.graphic',
1059
+		'uvvh' => 'video/vnd.dece.hd',
1060
+		'uvvi' => 'image/vnd.dece.graphic',
1061
+		'uvvm' => 'video/vnd.dece.mobile',
1062
+		'uvvp' => 'video/vnd.dece.pd',
1063
+		'uvvs' => 'video/vnd.dece.sd',
1064
+		'uvvt' => 'application/vnd.dece.ttml+xml',
1065
+		'uvvu' => 'video/vnd.uvvu.mp4',
1066
+		'uvvv' => 'video/vnd.dece.video',
1067
+		'uvvx' => 'application/vnd.dece.unspecified',
1068
+		'uvvz' => 'application/vnd.dece.zip',
1069
+		'uvx' => 'application/vnd.dece.unspecified',
1070
+		'uvz' => 'application/vnd.dece.zip',
1071
+		'vbox' => 'application/x-virtualbox-vbox',
1072
+		'vbox-extpack' => 'application/x-virtualbox-vbox-extpack',
1073
+		'vcard' => 'text/vcard',
1074
+		'vcd' => 'application/x-cdlink',
1075
+		'vcf' => 'text/x-vcard',
1076
+		'vcg' => 'application/vnd.groove-vcard',
1077
+		'vcs' => 'text/x-vcalendar',
1078
+		'vcx' => 'application/vnd.vcx',
1079
+		'vdi' => 'application/x-virtualbox-vdi',
1080
+		'vds' => 'model/vnd.sap.vds',
1081
+		'vhd' => 'application/x-virtualbox-vhd',
1082
+		'vis' => 'application/vnd.visionary',
1083
+		'viv' => 'video/vnd.vivo',
1084
+		'vlc' => 'application/videolan',
1085
+		'vmdk' => 'application/x-virtualbox-vmdk',
1086
+		'vob' => 'video/x-ms-vob',
1087
+		'vor' => 'application/vnd.stardivision.writer',
1088
+		'vox' => 'application/x-authorware-bin',
1089
+		'vrml' => 'model/vrml',
1090
+		'vsd' => 'application/vnd.visio',
1091
+		'vsf' => 'application/vnd.vsf',
1092
+		'vss' => 'application/vnd.visio',
1093
+		'vst' => 'application/vnd.visio',
1094
+		'vsw' => 'application/vnd.visio',
1095
+		'vtf' => 'image/vnd.valve.source.texture',
1096
+		'vtt' => 'text/vtt',
1097
+		'vtu' => 'model/vnd.vtu',
1098
+		'vxml' => 'application/voicexml+xml',
1099
+		'w3d' => 'application/x-director',
1100
+		'wad' => 'application/x-doom',
1101
+		'wadl' => 'application/vnd.sun.wadl+xml',
1102
+		'war' => 'application/java-archive',
1103
+		'wasm' => 'application/wasm',
1104
+		'wav' => 'audio/x-wav',
1105
+		'wax' => 'audio/x-ms-wax',
1106
+		'wbmp' => 'image/vnd.wap.wbmp',
1107
+		'wbs' => 'application/vnd.criticaltools.wbs+xml',
1108
+		'wbxml' => 'application/wbxml',
1109
+		'wcm' => 'application/vnd.ms-works',
1110
+		'wdb' => 'application/vnd.ms-works',
1111
+		'wdp' => 'image/vnd.ms-photo',
1112
+		'weba' => 'audio/webm',
1113
+		'webapp' => 'application/x-web-app-manifest+json',
1114
+		'webm' => 'video/webm',
1115
+		'webmanifest' => 'application/manifest+json',
1116
+		'webp' => 'image/webp',
1117
+		'wg' => 'application/vnd.pmi.widget',
1118
+		'wgsl' => 'text/wgsl',
1119
+		'wgt' => 'application/widget',
1120
+		'wif' => 'application/watcherinfo+xml',
1121
+		'wks' => 'application/vnd.ms-works',
1122
+		'wm' => 'video/x-ms-wm',
1123
+		'wma' => 'audio/x-ms-wma',
1124
+		'wmd' => 'application/x-ms-wmd',
1125
+		'wmf' => 'image/wmf',
1126
+		'wml' => 'text/vnd.wap.wml',
1127
+		'wmlc' => 'application/wmlc',
1128
+		'wmls' => 'text/vnd.wap.wmlscript',
1129
+		'wmlsc' => 'application/vnd.wap.wmlscriptc',
1130
+		'wmv' => 'video/x-ms-wmv',
1131
+		'wmx' => 'video/x-ms-wmx',
1132
+		'wmz' => 'application/x-msmetafile',
1133
+		'woff' => 'font/woff',
1134
+		'woff2' => 'font/woff2',
1135
+		'word' => 'application/msword',
1136
+		'wpd' => 'application/vnd.wordperfect',
1137
+		'wpl' => 'application/vnd.ms-wpl',
1138
+		'wps' => 'application/vnd.ms-works',
1139
+		'wqd' => 'application/vnd.wqd',
1140
+		'wri' => 'application/x-mswrite',
1141
+		'wrl' => 'model/vrml',
1142
+		'wsc' => 'message/vnd.wfa.wsc',
1143
+		'wsdl' => 'application/wsdl+xml',
1144
+		'wspolicy' => 'application/wspolicy+xml',
1145
+		'wtb' => 'application/vnd.webturbo',
1146
+		'wvx' => 'video/x-ms-wvx',
1147
+		'x3d' => 'model/x3d+xml',
1148
+		'x3db' => 'model/x3d+fastinfoset',
1149
+		'x3dbz' => 'model/x3d+binary',
1150
+		'x3dv' => 'model/x3d-vrml',
1151
+		'x3dvz' => 'model/x3d+vrml',
1152
+		'x3dz' => 'model/x3d+xml',
1153
+		'x32' => 'application/x-authorware-bin',
1154
+		'x_b' => 'model/vnd.parasolid.transmit.binary',
1155
+		'x_t' => 'model/vnd.parasolid.transmit.text',
1156
+		'xaml' => 'application/xaml+xml',
1157
+		'xap' => 'application/x-silverlight-app',
1158
+		'xar' => 'application/vnd.xara',
1159
+		'xav' => 'application/xcap-att+xml',
1160
+		'xbap' => 'application/x-ms-xbap',
1161
+		'xbd' => 'application/vnd.fujixerox.docuworks.binder',
1162
+		'xbm' => 'image/x-xbitmap',
1163
+		'xca' => 'application/xcap-caps+xml',
1164
+		'xcs' => 'application/calendar+xml',
1165
+		'xdf' => 'application/xcap-diff+xml',
1166
+		'xdm' => 'application/vnd.syncml.dm+xml',
1167
+		'xdp' => 'application/vnd.adobe.xdp+xml',
1168
+		'xdssc' => 'application/dssc+xml',
1169
+		'xdw' => 'application/vnd.fujixerox.docuworks',
1170
+		'xel' => 'application/xcap-el+xml',
1171
+		'xenc' => 'application/xenc+xml',
1172
+		'xer' => 'application/patch-ops-error+xml',
1173
+		'xfdf' => 'application/xfdf',
1174
+		'xfdl' => 'application/vnd.xfdl',
1175
+		'xht' => 'application/xhtml+xml',
1176
+		'xhtm' => 'application/vnd.pwg-xhtml-print+xml',
1177
+		'xhtml' => 'application/xhtml+xml',
1178
+		'xhvml' => 'application/xv+xml',
1179
+		'xif' => 'image/vnd.xiff',
1180
+		'xl' => 'application/excel',
1181
+		'xla' => 'application/vnd.ms-excel',
1182
+		'xlam' => 'application/vnd.ms-excel.addin.macroEnabled.12',
1183
+		'xlc' => 'application/vnd.ms-excel',
1184
+		'xlf' => 'application/xliff+xml',
1185
+		'xlm' => 'application/vnd.ms-excel',
1186
+		'xls' => 'application/vnd.ms-excel',
1187
+		'xlsb' => 'application/vnd.ms-excel.sheet.binary.macroEnabled.12',
1188
+		'xlsm' => 'application/vnd.ms-excel.sheet.macroEnabled.12',
1189
+		'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
1190
+		'xlt' => 'application/vnd.ms-excel',
1191
+		'xltm' => 'application/vnd.ms-excel.template.macroEnabled.12',
1192
+		'xltx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template',
1193
+		'xlw' => 'application/vnd.ms-excel',
1194
+		'xm' => 'audio/xm',
1195
+		'xml' => 'application/xml',
1196
+		'xns' => 'application/xcap-ns+xml',
1197
+		'xo' => 'application/vnd.olpc-sugar',
1198
+		'xop' => 'application/xop+xml',
1199
+		'xpi' => 'application/x-xpinstall',
1200
+		'xpl' => 'application/xproc+xml',
1201
+		'xpm' => 'image/x-xpixmap',
1202
+		'xpr' => 'application/vnd.is-xpr',
1203
+		'xps' => 'application/vnd.ms-xpsdocument',
1204
+		'xpw' => 'application/vnd.intercon.formnet',
1205
+		'xpx' => 'application/vnd.intercon.formnet',
1206
+		'xsd' => 'application/xml',
1207
+		'xsf' => 'application/prs.xsf+xml',
1208
+		'xsl' => 'application/xml',
1209
+		'xslt' => 'application/xslt+xml',
1210
+		'xsm' => 'application/vnd.syncml+xml',
1211
+		'xspf' => 'application/xspf+xml',
1212
+		'xul' => 'application/vnd.mozilla.xul+xml',
1213
+		'xvm' => 'application/xv+xml',
1214
+		'xvml' => 'application/xv+xml',
1215
+		'xwd' => 'image/x-xwindowdump',
1216
+		'xyz' => 'chemical/x-xyz',
1217
+		'xz' => 'application/x-xz',
1218
+		'yaml' => 'text/yaml',
1219
+		'yang' => 'application/yang',
1220
+		'yin' => 'application/yin+xml',
1221
+		'yml' => 'text/yaml',
1222
+		'ymp' => 'text/x-suse-ymp',
1223
+		'z' => 'application/x-compress',
1224
+		'z1' => 'application/x-zmachine',
1225
+		'z2' => 'application/x-zmachine',
1226
+		'z3' => 'application/x-zmachine',
1227
+		'z4' => 'application/x-zmachine',
1228
+		'z5' => 'application/x-zmachine',
1229
+		'z6' => 'application/x-zmachine',
1230
+		'z7' => 'application/x-zmachine',
1231
+		'z8' => 'application/x-zmachine',
1232
+		'zaz' => 'application/vnd.zzazz.deck+xml',
1233
+		'zip' => 'application/zip',
1234
+		'zir' => 'application/vnd.zul',
1235
+		'zirz' => 'application/vnd.zul',
1236
+		'zmm' => 'application/vnd.handheld-entertainment+xml',
1237
+		'zsh' => 'text/x-scriptzsh',
1238
+	];
1239 1239
 
1240
-    /**
1241
-     * Determines the mimetype of a file by looking at its extension.
1242
-     *
1243
-     * @see https://raw.githubusercontent.com/jshttp/mime-db/master/db.json
1244
-     */
1245
-    public static function fromFilename(string $filename): ?string
1246
-    {
1247
-        return self::fromExtension(pathinfo($filename, PATHINFO_EXTENSION));
1248
-    }
1240
+	/**
1241
+	 * Determines the mimetype of a file by looking at its extension.
1242
+	 *
1243
+	 * @see https://raw.githubusercontent.com/jshttp/mime-db/master/db.json
1244
+	 */
1245
+	public static function fromFilename(string $filename): ?string
1246
+	{
1247
+		return self::fromExtension(pathinfo($filename, PATHINFO_EXTENSION));
1248
+	}
1249 1249
 
1250
-    /**
1251
-     * Maps a file extensions to a mimetype.
1252
-     *
1253
-     * @see https://raw.githubusercontent.com/jshttp/mime-db/master/db.json
1254
-     */
1255
-    public static function fromExtension(string $extension): ?string
1256
-    {
1257
-        return self::MIME_TYPES[strtolower($extension)] ?? null;
1258
-    }
1250
+	/**
1251
+	 * Maps a file extensions to a mimetype.
1252
+	 *
1253
+	 * @see https://raw.githubusercontent.com/jshttp/mime-db/master/db.json
1254
+	 */
1255
+	public static function fromExtension(string $extension): ?string
1256
+	{
1257
+		return self::MIME_TYPES[strtolower($extension)] ?? null;
1258
+	}
1259 1259
 }
Please login to merge, or discard this patch.
Braces   +1 added lines, -2 removed lines patch added patch discarded remove patch
@@ -4,8 +4,7 @@
 block discarded – undo
4 4
 
5 5
 namespace OCA\FullTextSearch_Elasticsearch\Vendor\GuzzleHttp\Psr7;
6 6
 
7
-final class MimeType
8
-{
7
+final class MimeType {
9 8
     private const MIME_TYPES = [
10 9
         '1km' => 'application/vnd.1000minds.decision-model+xml',
11 10
         '3dml' => 'text/vnd.in3d.3dml',
Please login to merge, or discard this patch.
lib/Vendor/GuzzleHttp/Psr7/PumpStream.php 3 patches
Indentation   +158 added lines, -158 removed lines patch added patch discarded remove patch
@@ -18,162 +18,162 @@
 block discarded – undo
18 18
  */
19 19
 final class PumpStream implements StreamInterface
20 20
 {
21
-    /** @var callable(int): (string|false|null)|null */
22
-    private $source;
23
-
24
-    /** @var int|null */
25
-    private $size;
26
-
27
-    /** @var int */
28
-    private $tellPos = 0;
29
-
30
-    /** @var array */
31
-    private $metadata;
32
-
33
-    /** @var BufferStream */
34
-    private $buffer;
35
-
36
-    /**
37
-     * @param callable(int): (string|false|null)  $source  Source of the stream data. The callable MAY
38
-     *                                                     accept an integer argument used to control the
39
-     *                                                     amount of data to return. The callable MUST
40
-     *                                                     return a string when called, or false|null on error
41
-     *                                                     or EOF.
42
-     * @param array{size?: int, metadata?: array} $options Stream options:
43
-     *                                                     - metadata: Hash of metadata to use with stream.
44
-     *                                                     - size: Size of the stream, if known.
45
-     */
46
-    public function __construct(callable $source, array $options = [])
47
-    {
48
-        $this->source = $source;
49
-        $this->size = $options['size'] ?? null;
50
-        $this->metadata = $options['metadata'] ?? [];
51
-        $this->buffer = new BufferStream();
52
-    }
53
-
54
-    public function __toString(): string
55
-    {
56
-        try {
57
-            return Utils::copyToString($this);
58
-        } catch (\Throwable $e) {
59
-            if (\PHP_VERSION_ID >= 70400) {
60
-                throw $e;
61
-            }
62
-            trigger_error(sprintf('%s::__toString exception: %s', self::class, (string) $e), E_USER_ERROR);
63
-
64
-            return '';
65
-        }
66
-    }
67
-
68
-    public function close(): void
69
-    {
70
-        $this->detach();
71
-    }
72
-
73
-    public function detach()
74
-    {
75
-        $this->tellPos = 0;
76
-        $this->source = null;
77
-
78
-        return null;
79
-    }
80
-
81
-    public function getSize(): ?int
82
-    {
83
-        return $this->size;
84
-    }
85
-
86
-    public function tell(): int
87
-    {
88
-        return $this->tellPos;
89
-    }
90
-
91
-    public function eof(): bool
92
-    {
93
-        return $this->source === null;
94
-    }
95
-
96
-    public function isSeekable(): bool
97
-    {
98
-        return false;
99
-    }
100
-
101
-    public function rewind(): void
102
-    {
103
-        $this->seek(0);
104
-    }
105
-
106
-    public function seek($offset, $whence = SEEK_SET): void
107
-    {
108
-        throw new \RuntimeException('Cannot seek a PumpStream');
109
-    }
110
-
111
-    public function isWritable(): bool
112
-    {
113
-        return false;
114
-    }
115
-
116
-    public function write($string): int
117
-    {
118
-        throw new \RuntimeException('Cannot write to a PumpStream');
119
-    }
120
-
121
-    public function isReadable(): bool
122
-    {
123
-        return true;
124
-    }
125
-
126
-    public function read($length): string
127
-    {
128
-        $data = $this->buffer->read($length);
129
-        $readLen = strlen($data);
130
-        $this->tellPos += $readLen;
131
-        $remaining = $length - $readLen;
132
-
133
-        if ($remaining) {
134
-            $this->pump($remaining);
135
-            $data .= $this->buffer->read($remaining);
136
-            $this->tellPos += strlen($data) - $readLen;
137
-        }
138
-
139
-        return $data;
140
-    }
141
-
142
-    public function getContents(): string
143
-    {
144
-        $result = '';
145
-        while (!$this->eof()) {
146
-            $result .= $this->read(1000000);
147
-        }
148
-
149
-        return $result;
150
-    }
151
-
152
-    /**
153
-     * @return mixed
154
-     */
155
-    public function getMetadata($key = null)
156
-    {
157
-        if (!$key) {
158
-            return $this->metadata;
159
-        }
160
-
161
-        return $this->metadata[$key] ?? null;
162
-    }
163
-
164
-    private function pump(int $length): void
165
-    {
166
-        if ($this->source !== null) {
167
-            do {
168
-                $data = ($this->source)($length);
169
-                if ($data === false || $data === null) {
170
-                    $this->source = null;
171
-
172
-                    return;
173
-                }
174
-                $this->buffer->write($data);
175
-                $length -= strlen($data);
176
-            } while ($length > 0);
177
-        }
178
-    }
21
+	/** @var callable(int): (string|false|null)|null */
22
+	private $source;
23
+
24
+	/** @var int|null */
25
+	private $size;
26
+
27
+	/** @var int */
28
+	private $tellPos = 0;
29
+
30
+	/** @var array */
31
+	private $metadata;
32
+
33
+	/** @var BufferStream */
34
+	private $buffer;
35
+
36
+	/**
37
+	 * @param callable(int): (string|false|null)  $source  Source of the stream data. The callable MAY
38
+	 *                                                     accept an integer argument used to control the
39
+	 *                                                     amount of data to return. The callable MUST
40
+	 *                                                     return a string when called, or false|null on error
41
+	 *                                                     or EOF.
42
+	 * @param array{size?: int, metadata?: array} $options Stream options:
43
+	 *                                                     - metadata: Hash of metadata to use with stream.
44
+	 *                                                     - size: Size of the stream, if known.
45
+	 */
46
+	public function __construct(callable $source, array $options = [])
47
+	{
48
+		$this->source = $source;
49
+		$this->size = $options['size'] ?? null;
50
+		$this->metadata = $options['metadata'] ?? [];
51
+		$this->buffer = new BufferStream();
52
+	}
53
+
54
+	public function __toString(): string
55
+	{
56
+		try {
57
+			return Utils::copyToString($this);
58
+		} catch (\Throwable $e) {
59
+			if (\PHP_VERSION_ID >= 70400) {
60
+				throw $e;
61
+			}
62
+			trigger_error(sprintf('%s::__toString exception: %s', self::class, (string) $e), E_USER_ERROR);
63
+
64
+			return '';
65
+		}
66
+	}
67
+
68
+	public function close(): void
69
+	{
70
+		$this->detach();
71
+	}
72
+
73
+	public function detach()
74
+	{
75
+		$this->tellPos = 0;
76
+		$this->source = null;
77
+
78
+		return null;
79
+	}
80
+
81
+	public function getSize(): ?int
82
+	{
83
+		return $this->size;
84
+	}
85
+
86
+	public function tell(): int
87
+	{
88
+		return $this->tellPos;
89
+	}
90
+
91
+	public function eof(): bool
92
+	{
93
+		return $this->source === null;
94
+	}
95
+
96
+	public function isSeekable(): bool
97
+	{
98
+		return false;
99
+	}
100
+
101
+	public function rewind(): void
102
+	{
103
+		$this->seek(0);
104
+	}
105
+
106
+	public function seek($offset, $whence = SEEK_SET): void
107
+	{
108
+		throw new \RuntimeException('Cannot seek a PumpStream');
109
+	}
110
+
111
+	public function isWritable(): bool
112
+	{
113
+		return false;
114
+	}
115
+
116
+	public function write($string): int
117
+	{
118
+		throw new \RuntimeException('Cannot write to a PumpStream');
119
+	}
120
+
121
+	public function isReadable(): bool
122
+	{
123
+		return true;
124
+	}
125
+
126
+	public function read($length): string
127
+	{
128
+		$data = $this->buffer->read($length);
129
+		$readLen = strlen($data);
130
+		$this->tellPos += $readLen;
131
+		$remaining = $length - $readLen;
132
+
133
+		if ($remaining) {
134
+			$this->pump($remaining);
135
+			$data .= $this->buffer->read($remaining);
136
+			$this->tellPos += strlen($data) - $readLen;
137
+		}
138
+
139
+		return $data;
140
+	}
141
+
142
+	public function getContents(): string
143
+	{
144
+		$result = '';
145
+		while (!$this->eof()) {
146
+			$result .= $this->read(1000000);
147
+		}
148
+
149
+		return $result;
150
+	}
151
+
152
+	/**
153
+	 * @return mixed
154
+	 */
155
+	public function getMetadata($key = null)
156
+	{
157
+		if (!$key) {
158
+			return $this->metadata;
159
+		}
160
+
161
+		return $this->metadata[$key] ?? null;
162
+	}
163
+
164
+	private function pump(int $length): void
165
+	{
166
+		if ($this->source !== null) {
167
+			do {
168
+				$data = ($this->source)($length);
169
+				if ($data === false || $data === null) {
170
+					$this->source = null;
171
+
172
+					return;
173
+				}
174
+				$this->buffer->write($data);
175
+				$length -= strlen($data);
176
+			} while ($length > 0);
177
+		}
178
+	}
179 179
 }
Please login to merge, or discard this patch.
Spacing   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -59,7 +59,7 @@
 block discarded – undo
59 59
             if (\PHP_VERSION_ID >= 70400) {
60 60
                 throw $e;
61 61
             }
62
-            trigger_error(sprintf('%s::__toString exception: %s', self::class, (string) $e), E_USER_ERROR);
62
+            trigger_error(sprintf('%s::__toString exception: %s', self::class, (string)$e), E_USER_ERROR);
63 63
 
64 64
             return '';
65 65
         }
Please login to merge, or discard this patch.
Braces   +1 added lines, -2 removed lines patch added patch discarded remove patch
@@ -16,8 +16,7 @@
 block discarded – undo
16 16
  * the read() function of the PumpStream. The provided callable MUST return
17 17
  * false when there is no more data to read.
18 18
  */
19
-final class PumpStream implements StreamInterface
20
-{
19
+final class PumpStream implements StreamInterface {
21 20
     /** @var callable(int): (string|false|null)|null */
22 21
     private $source;
23 22
 
Please login to merge, or discard this patch.