@@ -7,8 +7,7 @@ |
||
| 7 | 7 | /** |
| 8 | 8 | * @internal |
| 9 | 9 | */ |
| 10 | -final class Rfc7230 |
|
| 11 | -{ |
|
| 10 | +final class Rfc7230 { |
|
| 12 | 11 | /** |
| 13 | 12 | * Header related regular expressions (based on amphp/http package) |
| 14 | 13 | * |
@@ -8,15 +8,15 @@ |
||
| 8 | 8 | */ |
| 9 | 9 | final class Rfc7230 |
| 10 | 10 | { |
| 11 | - /** |
|
| 12 | - * Header related regular expressions (based on amphp/http package) |
|
| 13 | - * |
|
| 14 | - * Note: header delimiter (\r\n) is modified to \r?\n to accept line feed only delimiters for BC reasons. |
|
| 15 | - * |
|
| 16 | - * @see https://github.com/amphp/http/blob/v1.0.1/src/Rfc7230.php#L12-L15 |
|
| 17 | - * |
|
| 18 | - * @license https://github.com/amphp/http/blob/v1.0.1/LICENSE |
|
| 19 | - */ |
|
| 20 | - public const HEADER_REGEX = "(^([^()<>@,;:\\\"/[\\]?={}\x01- ]++):[ \t]*+((?:[ \t]*+[!-~\x80-\xff]++)*+)[ \t]*+\r?\n)m"; |
|
| 21 | - public const HEADER_FOLD_REGEX = "(\r?\n[ \t]++)"; |
|
| 11 | + /** |
|
| 12 | + * Header related regular expressions (based on amphp/http package) |
|
| 13 | + * |
|
| 14 | + * Note: header delimiter (\r\n) is modified to \r?\n to accept line feed only delimiters for BC reasons. |
|
| 15 | + * |
|
| 16 | + * @see https://github.com/amphp/http/blob/v1.0.1/src/Rfc7230.php#L12-L15 |
|
| 17 | + * |
|
| 18 | + * @license https://github.com/amphp/http/blob/v1.0.1/LICENSE |
|
| 19 | + */ |
|
| 20 | + public const HEADER_REGEX = "(^([^()<>@,;:\\\"/[\\]?={}\x01- ]++):[ \t]*+((?:[ \t]*+[!-~\x80-\xff]++)*+)[ \t]*+\r?\n)m"; |
|
| 21 | + public const HEADER_FOLD_REGEX = "(\r?\n[ \t]++)"; |
|
| 22 | 22 | } |
@@ -1,6 +1,6 @@ |
||
| 1 | 1 | <?php |
| 2 | 2 | |
| 3 | -declare (strict_types=1); |
|
| 3 | +declare(strict_types=1); |
|
| 4 | 4 | namespace OCA\FullTextSearch_Elasticsearch\Vendor\GuzzleHttp\Psr7; |
| 5 | 5 | |
| 6 | 6 | /** |
@@ -9,6 +9,5 @@ |
||
| 9 | 9 | /** |
| 10 | 10 | * Exception thrown if a URI cannot be parsed because it's malformed. |
| 11 | 11 | */ |
| 12 | -class MalformedUriException extends InvalidArgumentException |
|
| 13 | -{ |
|
| 12 | +class MalformedUriException extends InvalidArgumentException { |
|
| 14 | 13 | } |
@@ -1,6 +1,6 @@ |
||
| 1 | 1 | <?php |
| 2 | 2 | |
| 3 | -declare (strict_types=1); |
|
| 3 | +declare(strict_types=1); |
|
| 4 | 4 | namespace OCA\FullTextSearch_Elasticsearch\Vendor\GuzzleHttp\Psr7\Exception; |
| 5 | 5 | |
| 6 | 6 | use InvalidArgumentException; |
@@ -13,8 +13,7 @@ |
||
| 13 | 13 | * |
| 14 | 14 | * @see https://datatracker.ietf.org/doc/html/rfc3986#section-5 |
| 15 | 15 | */ |
| 16 | -final class UriResolver |
|
| 17 | -{ |
|
| 16 | +final class UriResolver { |
|
| 18 | 17 | /** |
| 19 | 18 | * Removes dot segments from a path and returns the new path. |
| 20 | 19 | * |
@@ -13,168 +13,168 @@ |
||
| 13 | 13 | */ |
| 14 | 14 | final class UriResolver |
| 15 | 15 | { |
| 16 | - /** |
|
| 17 | - * Removes dot segments from a path and returns the new path. |
|
| 18 | - * |
|
| 19 | - * @see https://datatracker.ietf.org/doc/html/rfc3986#section-5.2.4 |
|
| 20 | - */ |
|
| 21 | - public static function removeDotSegments(string $path) : string |
|
| 22 | - { |
|
| 23 | - if ($path === '' || $path === '/') { |
|
| 24 | - return $path; |
|
| 25 | - } |
|
| 26 | - $results = []; |
|
| 27 | - $segments = \explode('/', $path); |
|
| 28 | - foreach ($segments as $segment) { |
|
| 29 | - if ($segment === '..') { |
|
| 30 | - \array_pop($results); |
|
| 31 | - } elseif ($segment !== '.') { |
|
| 32 | - $results[] = $segment; |
|
| 33 | - } |
|
| 34 | - } |
|
| 35 | - $newPath = \implode('/', $results); |
|
| 36 | - if ($path[0] === '/' && (!isset($newPath[0]) || $newPath[0] !== '/')) { |
|
| 37 | - // Re-add the leading slash if necessary for cases like "/.." |
|
| 38 | - $newPath = '/' . $newPath; |
|
| 39 | - } elseif ($newPath !== '' && ($segment === '.' || $segment === '..')) { |
|
| 40 | - // Add the trailing slash if necessary |
|
| 41 | - // If newPath is not empty, then $segment must be set and is the last segment from the foreach |
|
| 42 | - $newPath .= '/'; |
|
| 43 | - } |
|
| 44 | - return $newPath; |
|
| 45 | - } |
|
| 46 | - /** |
|
| 47 | - * Converts the relative URI into a new URI that is resolved against the base URI. |
|
| 48 | - * |
|
| 49 | - * @see https://datatracker.ietf.org/doc/html/rfc3986#section-5.2 |
|
| 50 | - */ |
|
| 51 | - public static function resolve(UriInterface $base, UriInterface $rel) : UriInterface |
|
| 52 | - { |
|
| 53 | - if ((string) $rel === '') { |
|
| 54 | - // we can simply return the same base URI instance for this same-document reference |
|
| 55 | - return $base; |
|
| 56 | - } |
|
| 57 | - if ($rel->getScheme() != '') { |
|
| 58 | - return $rel->withPath(self::removeDotSegments($rel->getPath())); |
|
| 59 | - } |
|
| 60 | - if ($rel->getAuthority() != '') { |
|
| 61 | - $targetAuthority = $rel->getAuthority(); |
|
| 62 | - $targetPath = self::removeDotSegments($rel->getPath()); |
|
| 63 | - $targetQuery = $rel->getQuery(); |
|
| 64 | - } else { |
|
| 65 | - $targetAuthority = $base->getAuthority(); |
|
| 66 | - if ($rel->getPath() === '') { |
|
| 67 | - $targetPath = $base->getPath(); |
|
| 68 | - $targetQuery = $rel->getQuery() != '' ? $rel->getQuery() : $base->getQuery(); |
|
| 69 | - } else { |
|
| 70 | - if ($rel->getPath()[0] === '/') { |
|
| 71 | - $targetPath = $rel->getPath(); |
|
| 72 | - } else { |
|
| 73 | - if ($targetAuthority != '' && $base->getPath() === '') { |
|
| 74 | - $targetPath = '/' . $rel->getPath(); |
|
| 75 | - } else { |
|
| 76 | - $lastSlashPos = \strrpos($base->getPath(), '/'); |
|
| 77 | - if ($lastSlashPos === \false) { |
|
| 78 | - $targetPath = $rel->getPath(); |
|
| 79 | - } else { |
|
| 80 | - $targetPath = \substr($base->getPath(), 0, $lastSlashPos + 1) . $rel->getPath(); |
|
| 81 | - } |
|
| 82 | - } |
|
| 83 | - } |
|
| 84 | - $targetPath = self::removeDotSegments($targetPath); |
|
| 85 | - $targetQuery = $rel->getQuery(); |
|
| 86 | - } |
|
| 87 | - } |
|
| 88 | - return new Uri(Uri::composeComponents($base->getScheme(), $targetAuthority, $targetPath, $targetQuery, $rel->getFragment())); |
|
| 89 | - } |
|
| 90 | - /** |
|
| 91 | - * Returns the target URI as a relative reference from the base URI. |
|
| 92 | - * |
|
| 93 | - * This method is the counterpart to resolve(): |
|
| 94 | - * |
|
| 95 | - * (string) $target === (string) UriResolver::resolve($base, UriResolver::relativize($base, $target)) |
|
| 96 | - * |
|
| 97 | - * One use-case is to use the current request URI as base URI and then generate relative links in your documents |
|
| 98 | - * to reduce the document size or offer self-contained downloadable document archives. |
|
| 99 | - * |
|
| 100 | - * $base = new Uri('http://example.com/a/b/'); |
|
| 101 | - * echo UriResolver::relativize($base, new Uri('http://example.com/a/b/c')); // prints 'c'. |
|
| 102 | - * echo UriResolver::relativize($base, new Uri('http://example.com/a/x/y')); // prints '../x/y'. |
|
| 103 | - * echo UriResolver::relativize($base, new Uri('http://example.com/a/b/?q')); // prints '?q'. |
|
| 104 | - * echo UriResolver::relativize($base, new Uri('http://example.org/a/b/')); // prints '//example.org/a/b/'. |
|
| 105 | - * |
|
| 106 | - * This method also accepts a target that is already relative and will try to relativize it further. Only a |
|
| 107 | - * relative-path reference will be returned as-is. |
|
| 108 | - * |
|
| 109 | - * echo UriResolver::relativize($base, new Uri('/a/b/c')); // prints 'c' as well |
|
| 110 | - */ |
|
| 111 | - public static function relativize(UriInterface $base, UriInterface $target) : UriInterface |
|
| 112 | - { |
|
| 113 | - if ($target->getScheme() !== '' && ($base->getScheme() !== $target->getScheme() || $target->getAuthority() === '' && $base->getAuthority() !== '')) { |
|
| 114 | - return $target; |
|
| 115 | - } |
|
| 116 | - if (Uri::isRelativePathReference($target)) { |
|
| 117 | - // As the target is already highly relative we return it as-is. It would be possible to resolve |
|
| 118 | - // the target with `$target = self::resolve($base, $target);` and then try make it more relative |
|
| 119 | - // by removing a duplicate query. But let's not do that automatically. |
|
| 120 | - return $target; |
|
| 121 | - } |
|
| 122 | - if ($target->getAuthority() !== '' && $base->getAuthority() !== $target->getAuthority()) { |
|
| 123 | - return $target->withScheme(''); |
|
| 124 | - } |
|
| 125 | - // We must remove the path before removing the authority because if the path starts with two slashes, the URI |
|
| 126 | - // would turn invalid. And we also cannot set a relative path before removing the authority, as that is also |
|
| 127 | - // invalid. |
|
| 128 | - $emptyPathUri = $target->withScheme('')->withPath('')->withUserInfo('')->withPort(null)->withHost(''); |
|
| 129 | - if ($base->getPath() !== $target->getPath()) { |
|
| 130 | - return $emptyPathUri->withPath(self::getRelativePath($base, $target)); |
|
| 131 | - } |
|
| 132 | - if ($base->getQuery() === $target->getQuery()) { |
|
| 133 | - // Only the target fragment is left. And it must be returned even if base and target fragment are the same. |
|
| 134 | - return $emptyPathUri->withQuery(''); |
|
| 135 | - } |
|
| 136 | - // If the base URI has a query but the target has none, we cannot return an empty path reference as it would |
|
| 137 | - // inherit the base query component when resolving. |
|
| 138 | - if ($target->getQuery() === '') { |
|
| 139 | - $segments = \explode('/', $target->getPath()); |
|
| 140 | - /** @var string $lastSegment */ |
|
| 141 | - $lastSegment = \end($segments); |
|
| 142 | - return $emptyPathUri->withPath($lastSegment === '' ? './' : $lastSegment); |
|
| 143 | - } |
|
| 144 | - return $emptyPathUri; |
|
| 145 | - } |
|
| 146 | - private static function getRelativePath(UriInterface $base, UriInterface $target) : string |
|
| 147 | - { |
|
| 148 | - $sourceSegments = \explode('/', $base->getPath()); |
|
| 149 | - $targetSegments = \explode('/', $target->getPath()); |
|
| 150 | - \array_pop($sourceSegments); |
|
| 151 | - $targetLastSegment = \array_pop($targetSegments); |
|
| 152 | - foreach ($sourceSegments as $i => $segment) { |
|
| 153 | - if (isset($targetSegments[$i]) && $segment === $targetSegments[$i]) { |
|
| 154 | - unset($sourceSegments[$i], $targetSegments[$i]); |
|
| 155 | - } else { |
|
| 156 | - break; |
|
| 157 | - } |
|
| 158 | - } |
|
| 159 | - $targetSegments[] = $targetLastSegment; |
|
| 160 | - $relativePath = \str_repeat('../', \count($sourceSegments)) . \implode('/', $targetSegments); |
|
| 161 | - // A reference to am empty last segment or an empty first sub-segment must be prefixed with "./". |
|
| 162 | - // This also applies to a segment with a colon character (e.g., "file:colon") that cannot be used |
|
| 163 | - // as the first segment of a relative-path reference, as it would be mistaken for a scheme name. |
|
| 164 | - if ('' === $relativePath || \false !== \strpos(\explode('/', $relativePath, 2)[0], ':')) { |
|
| 165 | - $relativePath = "./{$relativePath}"; |
|
| 166 | - } elseif ('/' === $relativePath[0]) { |
|
| 167 | - if ($base->getAuthority() != '' && $base->getPath() === '') { |
|
| 168 | - // In this case an extra slash is added by resolve() automatically. So we must not add one here. |
|
| 169 | - $relativePath = ".{$relativePath}"; |
|
| 170 | - } else { |
|
| 171 | - $relativePath = "./{$relativePath}"; |
|
| 172 | - } |
|
| 173 | - } |
|
| 174 | - return $relativePath; |
|
| 175 | - } |
|
| 176 | - private function __construct() |
|
| 177 | - { |
|
| 178 | - // cannot be instantiated |
|
| 179 | - } |
|
| 16 | + /** |
|
| 17 | + * Removes dot segments from a path and returns the new path. |
|
| 18 | + * |
|
| 19 | + * @see https://datatracker.ietf.org/doc/html/rfc3986#section-5.2.4 |
|
| 20 | + */ |
|
| 21 | + public static function removeDotSegments(string $path) : string |
|
| 22 | + { |
|
| 23 | + if ($path === '' || $path === '/') { |
|
| 24 | + return $path; |
|
| 25 | + } |
|
| 26 | + $results = []; |
|
| 27 | + $segments = \explode('/', $path); |
|
| 28 | + foreach ($segments as $segment) { |
|
| 29 | + if ($segment === '..') { |
|
| 30 | + \array_pop($results); |
|
| 31 | + } elseif ($segment !== '.') { |
|
| 32 | + $results[] = $segment; |
|
| 33 | + } |
|
| 34 | + } |
|
| 35 | + $newPath = \implode('/', $results); |
|
| 36 | + if ($path[0] === '/' && (!isset($newPath[0]) || $newPath[0] !== '/')) { |
|
| 37 | + // Re-add the leading slash if necessary for cases like "/.." |
|
| 38 | + $newPath = '/' . $newPath; |
|
| 39 | + } elseif ($newPath !== '' && ($segment === '.' || $segment === '..')) { |
|
| 40 | + // Add the trailing slash if necessary |
|
| 41 | + // If newPath is not empty, then $segment must be set and is the last segment from the foreach |
|
| 42 | + $newPath .= '/'; |
|
| 43 | + } |
|
| 44 | + return $newPath; |
|
| 45 | + } |
|
| 46 | + /** |
|
| 47 | + * Converts the relative URI into a new URI that is resolved against the base URI. |
|
| 48 | + * |
|
| 49 | + * @see https://datatracker.ietf.org/doc/html/rfc3986#section-5.2 |
|
| 50 | + */ |
|
| 51 | + public static function resolve(UriInterface $base, UriInterface $rel) : UriInterface |
|
| 52 | + { |
|
| 53 | + if ((string) $rel === '') { |
|
| 54 | + // we can simply return the same base URI instance for this same-document reference |
|
| 55 | + return $base; |
|
| 56 | + } |
|
| 57 | + if ($rel->getScheme() != '') { |
|
| 58 | + return $rel->withPath(self::removeDotSegments($rel->getPath())); |
|
| 59 | + } |
|
| 60 | + if ($rel->getAuthority() != '') { |
|
| 61 | + $targetAuthority = $rel->getAuthority(); |
|
| 62 | + $targetPath = self::removeDotSegments($rel->getPath()); |
|
| 63 | + $targetQuery = $rel->getQuery(); |
|
| 64 | + } else { |
|
| 65 | + $targetAuthority = $base->getAuthority(); |
|
| 66 | + if ($rel->getPath() === '') { |
|
| 67 | + $targetPath = $base->getPath(); |
|
| 68 | + $targetQuery = $rel->getQuery() != '' ? $rel->getQuery() : $base->getQuery(); |
|
| 69 | + } else { |
|
| 70 | + if ($rel->getPath()[0] === '/') { |
|
| 71 | + $targetPath = $rel->getPath(); |
|
| 72 | + } else { |
|
| 73 | + if ($targetAuthority != '' && $base->getPath() === '') { |
|
| 74 | + $targetPath = '/' . $rel->getPath(); |
|
| 75 | + } else { |
|
| 76 | + $lastSlashPos = \strrpos($base->getPath(), '/'); |
|
| 77 | + if ($lastSlashPos === \false) { |
|
| 78 | + $targetPath = $rel->getPath(); |
|
| 79 | + } else { |
|
| 80 | + $targetPath = \substr($base->getPath(), 0, $lastSlashPos + 1) . $rel->getPath(); |
|
| 81 | + } |
|
| 82 | + } |
|
| 83 | + } |
|
| 84 | + $targetPath = self::removeDotSegments($targetPath); |
|
| 85 | + $targetQuery = $rel->getQuery(); |
|
| 86 | + } |
|
| 87 | + } |
|
| 88 | + return new Uri(Uri::composeComponents($base->getScheme(), $targetAuthority, $targetPath, $targetQuery, $rel->getFragment())); |
|
| 89 | + } |
|
| 90 | + /** |
|
| 91 | + * Returns the target URI as a relative reference from the base URI. |
|
| 92 | + * |
|
| 93 | + * This method is the counterpart to resolve(): |
|
| 94 | + * |
|
| 95 | + * (string) $target === (string) UriResolver::resolve($base, UriResolver::relativize($base, $target)) |
|
| 96 | + * |
|
| 97 | + * One use-case is to use the current request URI as base URI and then generate relative links in your documents |
|
| 98 | + * to reduce the document size or offer self-contained downloadable document archives. |
|
| 99 | + * |
|
| 100 | + * $base = new Uri('http://example.com/a/b/'); |
|
| 101 | + * echo UriResolver::relativize($base, new Uri('http://example.com/a/b/c')); // prints 'c'. |
|
| 102 | + * echo UriResolver::relativize($base, new Uri('http://example.com/a/x/y')); // prints '../x/y'. |
|
| 103 | + * echo UriResolver::relativize($base, new Uri('http://example.com/a/b/?q')); // prints '?q'. |
|
| 104 | + * echo UriResolver::relativize($base, new Uri('http://example.org/a/b/')); // prints '//example.org/a/b/'. |
|
| 105 | + * |
|
| 106 | + * This method also accepts a target that is already relative and will try to relativize it further. Only a |
|
| 107 | + * relative-path reference will be returned as-is. |
|
| 108 | + * |
|
| 109 | + * echo UriResolver::relativize($base, new Uri('/a/b/c')); // prints 'c' as well |
|
| 110 | + */ |
|
| 111 | + public static function relativize(UriInterface $base, UriInterface $target) : UriInterface |
|
| 112 | + { |
|
| 113 | + if ($target->getScheme() !== '' && ($base->getScheme() !== $target->getScheme() || $target->getAuthority() === '' && $base->getAuthority() !== '')) { |
|
| 114 | + return $target; |
|
| 115 | + } |
|
| 116 | + if (Uri::isRelativePathReference($target)) { |
|
| 117 | + // As the target is already highly relative we return it as-is. It would be possible to resolve |
|
| 118 | + // the target with `$target = self::resolve($base, $target);` and then try make it more relative |
|
| 119 | + // by removing a duplicate query. But let's not do that automatically. |
|
| 120 | + return $target; |
|
| 121 | + } |
|
| 122 | + if ($target->getAuthority() !== '' && $base->getAuthority() !== $target->getAuthority()) { |
|
| 123 | + return $target->withScheme(''); |
|
| 124 | + } |
|
| 125 | + // We must remove the path before removing the authority because if the path starts with two slashes, the URI |
|
| 126 | + // would turn invalid. And we also cannot set a relative path before removing the authority, as that is also |
|
| 127 | + // invalid. |
|
| 128 | + $emptyPathUri = $target->withScheme('')->withPath('')->withUserInfo('')->withPort(null)->withHost(''); |
|
| 129 | + if ($base->getPath() !== $target->getPath()) { |
|
| 130 | + return $emptyPathUri->withPath(self::getRelativePath($base, $target)); |
|
| 131 | + } |
|
| 132 | + if ($base->getQuery() === $target->getQuery()) { |
|
| 133 | + // Only the target fragment is left. And it must be returned even if base and target fragment are the same. |
|
| 134 | + return $emptyPathUri->withQuery(''); |
|
| 135 | + } |
|
| 136 | + // If the base URI has a query but the target has none, we cannot return an empty path reference as it would |
|
| 137 | + // inherit the base query component when resolving. |
|
| 138 | + if ($target->getQuery() === '') { |
|
| 139 | + $segments = \explode('/', $target->getPath()); |
|
| 140 | + /** @var string $lastSegment */ |
|
| 141 | + $lastSegment = \end($segments); |
|
| 142 | + return $emptyPathUri->withPath($lastSegment === '' ? './' : $lastSegment); |
|
| 143 | + } |
|
| 144 | + return $emptyPathUri; |
|
| 145 | + } |
|
| 146 | + private static function getRelativePath(UriInterface $base, UriInterface $target) : string |
|
| 147 | + { |
|
| 148 | + $sourceSegments = \explode('/', $base->getPath()); |
|
| 149 | + $targetSegments = \explode('/', $target->getPath()); |
|
| 150 | + \array_pop($sourceSegments); |
|
| 151 | + $targetLastSegment = \array_pop($targetSegments); |
|
| 152 | + foreach ($sourceSegments as $i => $segment) { |
|
| 153 | + if (isset($targetSegments[$i]) && $segment === $targetSegments[$i]) { |
|
| 154 | + unset($sourceSegments[$i], $targetSegments[$i]); |
|
| 155 | + } else { |
|
| 156 | + break; |
|
| 157 | + } |
|
| 158 | + } |
|
| 159 | + $targetSegments[] = $targetLastSegment; |
|
| 160 | + $relativePath = \str_repeat('../', \count($sourceSegments)) . \implode('/', $targetSegments); |
|
| 161 | + // A reference to am empty last segment or an empty first sub-segment must be prefixed with "./". |
|
| 162 | + // This also applies to a segment with a colon character (e.g., "file:colon") that cannot be used |
|
| 163 | + // as the first segment of a relative-path reference, as it would be mistaken for a scheme name. |
|
| 164 | + if ('' === $relativePath || \false !== \strpos(\explode('/', $relativePath, 2)[0], ':')) { |
|
| 165 | + $relativePath = "./{$relativePath}"; |
|
| 166 | + } elseif ('/' === $relativePath[0]) { |
|
| 167 | + if ($base->getAuthority() != '' && $base->getPath() === '') { |
|
| 168 | + // In this case an extra slash is added by resolve() automatically. So we must not add one here. |
|
| 169 | + $relativePath = ".{$relativePath}"; |
|
| 170 | + } else { |
|
| 171 | + $relativePath = "./{$relativePath}"; |
|
| 172 | + } |
|
| 173 | + } |
|
| 174 | + return $relativePath; |
|
| 175 | + } |
|
| 176 | + private function __construct() |
|
| 177 | + { |
|
| 178 | + // cannot be instantiated |
|
| 179 | + } |
|
| 180 | 180 | } |
@@ -1,6 +1,6 @@ discard block |
||
| 1 | 1 | <?php |
| 2 | 2 | |
| 3 | -declare (strict_types=1); |
|
| 3 | +declare(strict_types=1); |
|
| 4 | 4 | namespace OCA\FullTextSearch_Elasticsearch\Vendor\GuzzleHttp\Psr7; |
| 5 | 5 | |
| 6 | 6 | use OCA\FullTextSearch_Elasticsearch\Vendor\Psr\Http\Message\UriInterface; |
@@ -35,7 +35,7 @@ discard block |
||
| 35 | 35 | $newPath = \implode('/', $results); |
| 36 | 36 | if ($path[0] === '/' && (!isset($newPath[0]) || $newPath[0] !== '/')) { |
| 37 | 37 | // Re-add the leading slash if necessary for cases like "/.." |
| 38 | - $newPath = '/' . $newPath; |
|
| 38 | + $newPath = '/'.$newPath; |
|
| 39 | 39 | } elseif ($newPath !== '' && ($segment === '.' || $segment === '..')) { |
| 40 | 40 | // Add the trailing slash if necessary |
| 41 | 41 | // If newPath is not empty, then $segment must be set and is the last segment from the foreach |
@@ -50,7 +50,7 @@ discard block |
||
| 50 | 50 | */ |
| 51 | 51 | public static function resolve(UriInterface $base, UriInterface $rel) : UriInterface |
| 52 | 52 | { |
| 53 | - if ((string) $rel === '') { |
|
| 53 | + if ((string)$rel === '') { |
|
| 54 | 54 | // we can simply return the same base URI instance for this same-document reference |
| 55 | 55 | return $base; |
| 56 | 56 | } |
@@ -71,13 +71,13 @@ discard block |
||
| 71 | 71 | $targetPath = $rel->getPath(); |
| 72 | 72 | } else { |
| 73 | 73 | if ($targetAuthority != '' && $base->getPath() === '') { |
| 74 | - $targetPath = '/' . $rel->getPath(); |
|
| 74 | + $targetPath = '/'.$rel->getPath(); |
|
| 75 | 75 | } else { |
| 76 | 76 | $lastSlashPos = \strrpos($base->getPath(), '/'); |
| 77 | 77 | if ($lastSlashPos === \false) { |
| 78 | 78 | $targetPath = $rel->getPath(); |
| 79 | 79 | } else { |
| 80 | - $targetPath = \substr($base->getPath(), 0, $lastSlashPos + 1) . $rel->getPath(); |
|
| 80 | + $targetPath = \substr($base->getPath(), 0, $lastSlashPos + 1).$rel->getPath(); |
|
| 81 | 81 | } |
| 82 | 82 | } |
| 83 | 83 | } |
@@ -157,7 +157,7 @@ discard block |
||
| 157 | 157 | } |
| 158 | 158 | } |
| 159 | 159 | $targetSegments[] = $targetLastSegment; |
| 160 | - $relativePath = \str_repeat('../', \count($sourceSegments)) . \implode('/', $targetSegments); |
|
| 160 | + $relativePath = \str_repeat('../', \count($sourceSegments)).\implode('/', $targetSegments); |
|
| 161 | 161 | // A reference to am empty last segment or an empty first sub-segment must be prefixed with "./". |
| 162 | 162 | // This also applies to a segment with a colon character (e.g., "file:colon") that cannot be used |
| 163 | 163 | // as the first segment of a relative-path reference, as it would be mistaken for a scheme name. |
@@ -24,8 +24,7 @@ |
||
| 24 | 24 | * implemented such that they retain the internal state of the current |
| 25 | 25 | * message and return a new instance that contains the changed state. |
| 26 | 26 | */ |
| 27 | -class ServerRequest extends Request implements ServerRequestInterface |
|
| 28 | -{ |
|
| 27 | +class ServerRequest extends Request implements ServerRequestInterface { |
|
| 29 | 28 | /** |
| 30 | 29 | * @var array |
| 31 | 30 | */ |
@@ -24,243 +24,243 @@ |
||
| 24 | 24 | */ |
| 25 | 25 | class ServerRequest extends Request implements ServerRequestInterface |
| 26 | 26 | { |
| 27 | - /** |
|
| 28 | - * @var array |
|
| 29 | - */ |
|
| 30 | - private $attributes = []; |
|
| 31 | - /** |
|
| 32 | - * @var array |
|
| 33 | - */ |
|
| 34 | - private $cookieParams = []; |
|
| 35 | - /** |
|
| 36 | - * @var array|object|null |
|
| 37 | - */ |
|
| 38 | - private $parsedBody; |
|
| 39 | - /** |
|
| 40 | - * @var array |
|
| 41 | - */ |
|
| 42 | - private $queryParams = []; |
|
| 43 | - /** |
|
| 44 | - * @var array |
|
| 45 | - */ |
|
| 46 | - private $serverParams; |
|
| 47 | - /** |
|
| 48 | - * @var array |
|
| 49 | - */ |
|
| 50 | - private $uploadedFiles = []; |
|
| 51 | - /** |
|
| 52 | - * @param string $method HTTP method |
|
| 53 | - * @param string|UriInterface $uri URI |
|
| 54 | - * @param (string|string[])[] $headers Request headers |
|
| 55 | - * @param string|resource|StreamInterface|null $body Request body |
|
| 56 | - * @param string $version Protocol version |
|
| 57 | - * @param array $serverParams Typically the $_SERVER superglobal |
|
| 58 | - */ |
|
| 59 | - public function __construct(string $method, $uri, array $headers = [], $body = null, string $version = '1.1', array $serverParams = []) |
|
| 60 | - { |
|
| 61 | - $this->serverParams = $serverParams; |
|
| 62 | - parent::__construct($method, $uri, $headers, $body, $version); |
|
| 63 | - } |
|
| 64 | - /** |
|
| 65 | - * Return an UploadedFile instance array. |
|
| 66 | - * |
|
| 67 | - * @param array $files An array which respect $_FILES structure |
|
| 68 | - * |
|
| 69 | - * @throws InvalidArgumentException for unrecognized values |
|
| 70 | - */ |
|
| 71 | - public static function normalizeFiles(array $files) : array |
|
| 72 | - { |
|
| 73 | - $normalized = []; |
|
| 74 | - foreach ($files as $key => $value) { |
|
| 75 | - if ($value instanceof UploadedFileInterface) { |
|
| 76 | - $normalized[$key] = $value; |
|
| 77 | - } elseif (\is_array($value) && isset($value['tmp_name'])) { |
|
| 78 | - $normalized[$key] = self::createUploadedFileFromSpec($value); |
|
| 79 | - } elseif (\is_array($value)) { |
|
| 80 | - $normalized[$key] = self::normalizeFiles($value); |
|
| 81 | - continue; |
|
| 82 | - } else { |
|
| 83 | - throw new InvalidArgumentException('Invalid value in files specification'); |
|
| 84 | - } |
|
| 85 | - } |
|
| 86 | - return $normalized; |
|
| 87 | - } |
|
| 88 | - /** |
|
| 89 | - * Create and return an UploadedFile instance from a $_FILES specification. |
|
| 90 | - * |
|
| 91 | - * If the specification represents an array of values, this method will |
|
| 92 | - * delegate to normalizeNestedFileSpec() and return that return value. |
|
| 93 | - * |
|
| 94 | - * @param array $value $_FILES struct |
|
| 95 | - * |
|
| 96 | - * @return UploadedFileInterface|UploadedFileInterface[] |
|
| 97 | - */ |
|
| 98 | - private static function createUploadedFileFromSpec(array $value) |
|
| 99 | - { |
|
| 100 | - if (\is_array($value['tmp_name'])) { |
|
| 101 | - return self::normalizeNestedFileSpec($value); |
|
| 102 | - } |
|
| 103 | - return new UploadedFile($value['tmp_name'], (int) $value['size'], (int) $value['error'], $value['name'], $value['type']); |
|
| 104 | - } |
|
| 105 | - /** |
|
| 106 | - * Normalize an array of file specifications. |
|
| 107 | - * |
|
| 108 | - * Loops through all nested files and returns a normalized array of |
|
| 109 | - * UploadedFileInterface instances. |
|
| 110 | - * |
|
| 111 | - * @return UploadedFileInterface[] |
|
| 112 | - */ |
|
| 113 | - private static function normalizeNestedFileSpec(array $files = []) : array |
|
| 114 | - { |
|
| 115 | - $normalizedFiles = []; |
|
| 116 | - foreach (\array_keys($files['tmp_name']) as $key) { |
|
| 117 | - $spec = ['tmp_name' => $files['tmp_name'][$key], 'size' => $files['size'][$key] ?? null, 'error' => $files['error'][$key] ?? null, 'name' => $files['name'][$key] ?? null, 'type' => $files['type'][$key] ?? null]; |
|
| 118 | - $normalizedFiles[$key] = self::createUploadedFileFromSpec($spec); |
|
| 119 | - } |
|
| 120 | - return $normalizedFiles; |
|
| 121 | - } |
|
| 122 | - /** |
|
| 123 | - * Return a ServerRequest populated with superglobals: |
|
| 124 | - * $_GET |
|
| 125 | - * $_POST |
|
| 126 | - * $_COOKIE |
|
| 127 | - * $_FILES |
|
| 128 | - * $_SERVER |
|
| 129 | - */ |
|
| 130 | - public static function fromGlobals() : ServerRequestInterface |
|
| 131 | - { |
|
| 132 | - $method = $_SERVER['REQUEST_METHOD'] ?? 'GET'; |
|
| 133 | - $headers = \getallheaders(); |
|
| 134 | - $uri = self::getUriFromGlobals(); |
|
| 135 | - $body = new CachingStream(new LazyOpenStream('php://input', 'r+')); |
|
| 136 | - $protocol = isset($_SERVER['SERVER_PROTOCOL']) ? \str_replace('HTTP/', '', $_SERVER['SERVER_PROTOCOL']) : '1.1'; |
|
| 137 | - $serverRequest = new ServerRequest($method, $uri, $headers, $body, $protocol, $_SERVER); |
|
| 138 | - return $serverRequest->withCookieParams($_COOKIE)->withQueryParams($_GET)->withParsedBody($_POST)->withUploadedFiles(self::normalizeFiles($_FILES)); |
|
| 139 | - } |
|
| 140 | - private static function extractHostAndPortFromAuthority(string $authority) : array |
|
| 141 | - { |
|
| 142 | - $uri = 'http://' . $authority; |
|
| 143 | - $parts = \parse_url($uri); |
|
| 144 | - if (\false === $parts) { |
|
| 145 | - return [null, null]; |
|
| 146 | - } |
|
| 147 | - $host = $parts['host'] ?? null; |
|
| 148 | - $port = $parts['port'] ?? null; |
|
| 149 | - return [$host, $port]; |
|
| 150 | - } |
|
| 151 | - /** |
|
| 152 | - * Get a Uri populated with values from $_SERVER. |
|
| 153 | - */ |
|
| 154 | - public static function getUriFromGlobals() : UriInterface |
|
| 155 | - { |
|
| 156 | - $uri = new Uri(''); |
|
| 157 | - $uri = $uri->withScheme(!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' ? 'https' : 'http'); |
|
| 158 | - $hasPort = \false; |
|
| 159 | - if (isset($_SERVER['HTTP_HOST'])) { |
|
| 160 | - [$host, $port] = self::extractHostAndPortFromAuthority($_SERVER['HTTP_HOST']); |
|
| 161 | - if ($host !== null) { |
|
| 162 | - $uri = $uri->withHost($host); |
|
| 163 | - } |
|
| 164 | - if ($port !== null) { |
|
| 165 | - $hasPort = \true; |
|
| 166 | - $uri = $uri->withPort($port); |
|
| 167 | - } |
|
| 168 | - } elseif (isset($_SERVER['SERVER_NAME'])) { |
|
| 169 | - $uri = $uri->withHost($_SERVER['SERVER_NAME']); |
|
| 170 | - } elseif (isset($_SERVER['SERVER_ADDR'])) { |
|
| 171 | - $uri = $uri->withHost($_SERVER['SERVER_ADDR']); |
|
| 172 | - } |
|
| 173 | - if (!$hasPort && isset($_SERVER['SERVER_PORT'])) { |
|
| 174 | - $uri = $uri->withPort($_SERVER['SERVER_PORT']); |
|
| 175 | - } |
|
| 176 | - $hasQuery = \false; |
|
| 177 | - if (isset($_SERVER['REQUEST_URI'])) { |
|
| 178 | - $requestUriParts = \explode('?', $_SERVER['REQUEST_URI'], 2); |
|
| 179 | - $uri = $uri->withPath($requestUriParts[0]); |
|
| 180 | - if (isset($requestUriParts[1])) { |
|
| 181 | - $hasQuery = \true; |
|
| 182 | - $uri = $uri->withQuery($requestUriParts[1]); |
|
| 183 | - } |
|
| 184 | - } |
|
| 185 | - if (!$hasQuery && isset($_SERVER['QUERY_STRING'])) { |
|
| 186 | - $uri = $uri->withQuery($_SERVER['QUERY_STRING']); |
|
| 187 | - } |
|
| 188 | - return $uri; |
|
| 189 | - } |
|
| 190 | - public function getServerParams() : array |
|
| 191 | - { |
|
| 192 | - return $this->serverParams; |
|
| 193 | - } |
|
| 194 | - public function getUploadedFiles() : array |
|
| 195 | - { |
|
| 196 | - return $this->uploadedFiles; |
|
| 197 | - } |
|
| 198 | - public function withUploadedFiles(array $uploadedFiles) : ServerRequestInterface |
|
| 199 | - { |
|
| 200 | - $new = clone $this; |
|
| 201 | - $new->uploadedFiles = $uploadedFiles; |
|
| 202 | - return $new; |
|
| 203 | - } |
|
| 204 | - public function getCookieParams() : array |
|
| 205 | - { |
|
| 206 | - return $this->cookieParams; |
|
| 207 | - } |
|
| 208 | - public function withCookieParams(array $cookies) : ServerRequestInterface |
|
| 209 | - { |
|
| 210 | - $new = clone $this; |
|
| 211 | - $new->cookieParams = $cookies; |
|
| 212 | - return $new; |
|
| 213 | - } |
|
| 214 | - public function getQueryParams() : array |
|
| 215 | - { |
|
| 216 | - return $this->queryParams; |
|
| 217 | - } |
|
| 218 | - public function withQueryParams(array $query) : ServerRequestInterface |
|
| 219 | - { |
|
| 220 | - $new = clone $this; |
|
| 221 | - $new->queryParams = $query; |
|
| 222 | - return $new; |
|
| 223 | - } |
|
| 224 | - /** |
|
| 225 | - * @return array|object|null |
|
| 226 | - */ |
|
| 227 | - public function getParsedBody() |
|
| 228 | - { |
|
| 229 | - return $this->parsedBody; |
|
| 230 | - } |
|
| 231 | - public function withParsedBody($data) : ServerRequestInterface |
|
| 232 | - { |
|
| 233 | - $new = clone $this; |
|
| 234 | - $new->parsedBody = $data; |
|
| 235 | - return $new; |
|
| 236 | - } |
|
| 237 | - public function getAttributes() : array |
|
| 238 | - { |
|
| 239 | - return $this->attributes; |
|
| 240 | - } |
|
| 241 | - /** |
|
| 242 | - * @return mixed |
|
| 243 | - */ |
|
| 244 | - public function getAttribute($attribute, $default = null) |
|
| 245 | - { |
|
| 246 | - if (\false === \array_key_exists($attribute, $this->attributes)) { |
|
| 247 | - return $default; |
|
| 248 | - } |
|
| 249 | - return $this->attributes[$attribute]; |
|
| 250 | - } |
|
| 251 | - public function withAttribute($attribute, $value) : ServerRequestInterface |
|
| 252 | - { |
|
| 253 | - $new = clone $this; |
|
| 254 | - $new->attributes[$attribute] = $value; |
|
| 255 | - return $new; |
|
| 256 | - } |
|
| 257 | - public function withoutAttribute($attribute) : ServerRequestInterface |
|
| 258 | - { |
|
| 259 | - if (\false === \array_key_exists($attribute, $this->attributes)) { |
|
| 260 | - return $this; |
|
| 261 | - } |
|
| 262 | - $new = clone $this; |
|
| 263 | - unset($new->attributes[$attribute]); |
|
| 264 | - return $new; |
|
| 265 | - } |
|
| 27 | + /** |
|
| 28 | + * @var array |
|
| 29 | + */ |
|
| 30 | + private $attributes = []; |
|
| 31 | + /** |
|
| 32 | + * @var array |
|
| 33 | + */ |
|
| 34 | + private $cookieParams = []; |
|
| 35 | + /** |
|
| 36 | + * @var array|object|null |
|
| 37 | + */ |
|
| 38 | + private $parsedBody; |
|
| 39 | + /** |
|
| 40 | + * @var array |
|
| 41 | + */ |
|
| 42 | + private $queryParams = []; |
|
| 43 | + /** |
|
| 44 | + * @var array |
|
| 45 | + */ |
|
| 46 | + private $serverParams; |
|
| 47 | + /** |
|
| 48 | + * @var array |
|
| 49 | + */ |
|
| 50 | + private $uploadedFiles = []; |
|
| 51 | + /** |
|
| 52 | + * @param string $method HTTP method |
|
| 53 | + * @param string|UriInterface $uri URI |
|
| 54 | + * @param (string|string[])[] $headers Request headers |
|
| 55 | + * @param string|resource|StreamInterface|null $body Request body |
|
| 56 | + * @param string $version Protocol version |
|
| 57 | + * @param array $serverParams Typically the $_SERVER superglobal |
|
| 58 | + */ |
|
| 59 | + public function __construct(string $method, $uri, array $headers = [], $body = null, string $version = '1.1', array $serverParams = []) |
|
| 60 | + { |
|
| 61 | + $this->serverParams = $serverParams; |
|
| 62 | + parent::__construct($method, $uri, $headers, $body, $version); |
|
| 63 | + } |
|
| 64 | + /** |
|
| 65 | + * Return an UploadedFile instance array. |
|
| 66 | + * |
|
| 67 | + * @param array $files An array which respect $_FILES structure |
|
| 68 | + * |
|
| 69 | + * @throws InvalidArgumentException for unrecognized values |
|
| 70 | + */ |
|
| 71 | + public static function normalizeFiles(array $files) : array |
|
| 72 | + { |
|
| 73 | + $normalized = []; |
|
| 74 | + foreach ($files as $key => $value) { |
|
| 75 | + if ($value instanceof UploadedFileInterface) { |
|
| 76 | + $normalized[$key] = $value; |
|
| 77 | + } elseif (\is_array($value) && isset($value['tmp_name'])) { |
|
| 78 | + $normalized[$key] = self::createUploadedFileFromSpec($value); |
|
| 79 | + } elseif (\is_array($value)) { |
|
| 80 | + $normalized[$key] = self::normalizeFiles($value); |
|
| 81 | + continue; |
|
| 82 | + } else { |
|
| 83 | + throw new InvalidArgumentException('Invalid value in files specification'); |
|
| 84 | + } |
|
| 85 | + } |
|
| 86 | + return $normalized; |
|
| 87 | + } |
|
| 88 | + /** |
|
| 89 | + * Create and return an UploadedFile instance from a $_FILES specification. |
|
| 90 | + * |
|
| 91 | + * If the specification represents an array of values, this method will |
|
| 92 | + * delegate to normalizeNestedFileSpec() and return that return value. |
|
| 93 | + * |
|
| 94 | + * @param array $value $_FILES struct |
|
| 95 | + * |
|
| 96 | + * @return UploadedFileInterface|UploadedFileInterface[] |
|
| 97 | + */ |
|
| 98 | + private static function createUploadedFileFromSpec(array $value) |
|
| 99 | + { |
|
| 100 | + if (\is_array($value['tmp_name'])) { |
|
| 101 | + return self::normalizeNestedFileSpec($value); |
|
| 102 | + } |
|
| 103 | + return new UploadedFile($value['tmp_name'], (int) $value['size'], (int) $value['error'], $value['name'], $value['type']); |
|
| 104 | + } |
|
| 105 | + /** |
|
| 106 | + * Normalize an array of file specifications. |
|
| 107 | + * |
|
| 108 | + * Loops through all nested files and returns a normalized array of |
|
| 109 | + * UploadedFileInterface instances. |
|
| 110 | + * |
|
| 111 | + * @return UploadedFileInterface[] |
|
| 112 | + */ |
|
| 113 | + private static function normalizeNestedFileSpec(array $files = []) : array |
|
| 114 | + { |
|
| 115 | + $normalizedFiles = []; |
|
| 116 | + foreach (\array_keys($files['tmp_name']) as $key) { |
|
| 117 | + $spec = ['tmp_name' => $files['tmp_name'][$key], 'size' => $files['size'][$key] ?? null, 'error' => $files['error'][$key] ?? null, 'name' => $files['name'][$key] ?? null, 'type' => $files['type'][$key] ?? null]; |
|
| 118 | + $normalizedFiles[$key] = self::createUploadedFileFromSpec($spec); |
|
| 119 | + } |
|
| 120 | + return $normalizedFiles; |
|
| 121 | + } |
|
| 122 | + /** |
|
| 123 | + * Return a ServerRequest populated with superglobals: |
|
| 124 | + * $_GET |
|
| 125 | + * $_POST |
|
| 126 | + * $_COOKIE |
|
| 127 | + * $_FILES |
|
| 128 | + * $_SERVER |
|
| 129 | + */ |
|
| 130 | + public static function fromGlobals() : ServerRequestInterface |
|
| 131 | + { |
|
| 132 | + $method = $_SERVER['REQUEST_METHOD'] ?? 'GET'; |
|
| 133 | + $headers = \getallheaders(); |
|
| 134 | + $uri = self::getUriFromGlobals(); |
|
| 135 | + $body = new CachingStream(new LazyOpenStream('php://input', 'r+')); |
|
| 136 | + $protocol = isset($_SERVER['SERVER_PROTOCOL']) ? \str_replace('HTTP/', '', $_SERVER['SERVER_PROTOCOL']) : '1.1'; |
|
| 137 | + $serverRequest = new ServerRequest($method, $uri, $headers, $body, $protocol, $_SERVER); |
|
| 138 | + return $serverRequest->withCookieParams($_COOKIE)->withQueryParams($_GET)->withParsedBody($_POST)->withUploadedFiles(self::normalizeFiles($_FILES)); |
|
| 139 | + } |
|
| 140 | + private static function extractHostAndPortFromAuthority(string $authority) : array |
|
| 141 | + { |
|
| 142 | + $uri = 'http://' . $authority; |
|
| 143 | + $parts = \parse_url($uri); |
|
| 144 | + if (\false === $parts) { |
|
| 145 | + return [null, null]; |
|
| 146 | + } |
|
| 147 | + $host = $parts['host'] ?? null; |
|
| 148 | + $port = $parts['port'] ?? null; |
|
| 149 | + return [$host, $port]; |
|
| 150 | + } |
|
| 151 | + /** |
|
| 152 | + * Get a Uri populated with values from $_SERVER. |
|
| 153 | + */ |
|
| 154 | + public static function getUriFromGlobals() : UriInterface |
|
| 155 | + { |
|
| 156 | + $uri = new Uri(''); |
|
| 157 | + $uri = $uri->withScheme(!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' ? 'https' : 'http'); |
|
| 158 | + $hasPort = \false; |
|
| 159 | + if (isset($_SERVER['HTTP_HOST'])) { |
|
| 160 | + [$host, $port] = self::extractHostAndPortFromAuthority($_SERVER['HTTP_HOST']); |
|
| 161 | + if ($host !== null) { |
|
| 162 | + $uri = $uri->withHost($host); |
|
| 163 | + } |
|
| 164 | + if ($port !== null) { |
|
| 165 | + $hasPort = \true; |
|
| 166 | + $uri = $uri->withPort($port); |
|
| 167 | + } |
|
| 168 | + } elseif (isset($_SERVER['SERVER_NAME'])) { |
|
| 169 | + $uri = $uri->withHost($_SERVER['SERVER_NAME']); |
|
| 170 | + } elseif (isset($_SERVER['SERVER_ADDR'])) { |
|
| 171 | + $uri = $uri->withHost($_SERVER['SERVER_ADDR']); |
|
| 172 | + } |
|
| 173 | + if (!$hasPort && isset($_SERVER['SERVER_PORT'])) { |
|
| 174 | + $uri = $uri->withPort($_SERVER['SERVER_PORT']); |
|
| 175 | + } |
|
| 176 | + $hasQuery = \false; |
|
| 177 | + if (isset($_SERVER['REQUEST_URI'])) { |
|
| 178 | + $requestUriParts = \explode('?', $_SERVER['REQUEST_URI'], 2); |
|
| 179 | + $uri = $uri->withPath($requestUriParts[0]); |
|
| 180 | + if (isset($requestUriParts[1])) { |
|
| 181 | + $hasQuery = \true; |
|
| 182 | + $uri = $uri->withQuery($requestUriParts[1]); |
|
| 183 | + } |
|
| 184 | + } |
|
| 185 | + if (!$hasQuery && isset($_SERVER['QUERY_STRING'])) { |
|
| 186 | + $uri = $uri->withQuery($_SERVER['QUERY_STRING']); |
|
| 187 | + } |
|
| 188 | + return $uri; |
|
| 189 | + } |
|
| 190 | + public function getServerParams() : array |
|
| 191 | + { |
|
| 192 | + return $this->serverParams; |
|
| 193 | + } |
|
| 194 | + public function getUploadedFiles() : array |
|
| 195 | + { |
|
| 196 | + return $this->uploadedFiles; |
|
| 197 | + } |
|
| 198 | + public function withUploadedFiles(array $uploadedFiles) : ServerRequestInterface |
|
| 199 | + { |
|
| 200 | + $new = clone $this; |
|
| 201 | + $new->uploadedFiles = $uploadedFiles; |
|
| 202 | + return $new; |
|
| 203 | + } |
|
| 204 | + public function getCookieParams() : array |
|
| 205 | + { |
|
| 206 | + return $this->cookieParams; |
|
| 207 | + } |
|
| 208 | + public function withCookieParams(array $cookies) : ServerRequestInterface |
|
| 209 | + { |
|
| 210 | + $new = clone $this; |
|
| 211 | + $new->cookieParams = $cookies; |
|
| 212 | + return $new; |
|
| 213 | + } |
|
| 214 | + public function getQueryParams() : array |
|
| 215 | + { |
|
| 216 | + return $this->queryParams; |
|
| 217 | + } |
|
| 218 | + public function withQueryParams(array $query) : ServerRequestInterface |
|
| 219 | + { |
|
| 220 | + $new = clone $this; |
|
| 221 | + $new->queryParams = $query; |
|
| 222 | + return $new; |
|
| 223 | + } |
|
| 224 | + /** |
|
| 225 | + * @return array|object|null |
|
| 226 | + */ |
|
| 227 | + public function getParsedBody() |
|
| 228 | + { |
|
| 229 | + return $this->parsedBody; |
|
| 230 | + } |
|
| 231 | + public function withParsedBody($data) : ServerRequestInterface |
|
| 232 | + { |
|
| 233 | + $new = clone $this; |
|
| 234 | + $new->parsedBody = $data; |
|
| 235 | + return $new; |
|
| 236 | + } |
|
| 237 | + public function getAttributes() : array |
|
| 238 | + { |
|
| 239 | + return $this->attributes; |
|
| 240 | + } |
|
| 241 | + /** |
|
| 242 | + * @return mixed |
|
| 243 | + */ |
|
| 244 | + public function getAttribute($attribute, $default = null) |
|
| 245 | + { |
|
| 246 | + if (\false === \array_key_exists($attribute, $this->attributes)) { |
|
| 247 | + return $default; |
|
| 248 | + } |
|
| 249 | + return $this->attributes[$attribute]; |
|
| 250 | + } |
|
| 251 | + public function withAttribute($attribute, $value) : ServerRequestInterface |
|
| 252 | + { |
|
| 253 | + $new = clone $this; |
|
| 254 | + $new->attributes[$attribute] = $value; |
|
| 255 | + return $new; |
|
| 256 | + } |
|
| 257 | + public function withoutAttribute($attribute) : ServerRequestInterface |
|
| 258 | + { |
|
| 259 | + if (\false === \array_key_exists($attribute, $this->attributes)) { |
|
| 260 | + return $this; |
|
| 261 | + } |
|
| 262 | + $new = clone $this; |
|
| 263 | + unset($new->attributes[$attribute]); |
|
| 264 | + return $new; |
|
| 265 | + } |
|
| 266 | 266 | } |
@@ -1,6 +1,6 @@ discard block |
||
| 1 | 1 | <?php |
| 2 | 2 | |
| 3 | -declare (strict_types=1); |
|
| 3 | +declare(strict_types=1); |
|
| 4 | 4 | namespace OCA\FullTextSearch_Elasticsearch\Vendor\GuzzleHttp\Psr7; |
| 5 | 5 | |
| 6 | 6 | use InvalidArgumentException; |
@@ -100,7 +100,7 @@ discard block |
||
| 100 | 100 | if (\is_array($value['tmp_name'])) { |
| 101 | 101 | return self::normalizeNestedFileSpec($value); |
| 102 | 102 | } |
| 103 | - return new UploadedFile($value['tmp_name'], (int) $value['size'], (int) $value['error'], $value['name'], $value['type']); |
|
| 103 | + return new UploadedFile($value['tmp_name'], (int)$value['size'], (int)$value['error'], $value['name'], $value['type']); |
|
| 104 | 104 | } |
| 105 | 105 | /** |
| 106 | 106 | * Normalize an array of file specifications. |
@@ -139,7 +139,7 @@ discard block |
||
| 139 | 139 | } |
| 140 | 140 | private static function extractHostAndPortFromAuthority(string $authority) : array |
| 141 | 141 | { |
| 142 | - $uri = 'http://' . $authority; |
|
| 142 | + $uri = 'http://'.$authority; |
|
| 143 | 143 | $parts = \parse_url($uri); |
| 144 | 144 | if (\false === $parts) { |
| 145 | 145 | return [null, null]; |
@@ -9,8 +9,7 @@ |
||
| 9 | 9 | /** |
| 10 | 10 | * PHP stream implementation. |
| 11 | 11 | */ |
| 12 | -class Stream implements StreamInterface |
|
| 13 | -{ |
|
| 12 | +class Stream implements StreamInterface { |
|
| 14 | 13 | /** |
| 15 | 14 | * @see https://www.php.net/manual/en/function.fopen.php |
| 16 | 15 | * @see https://www.php.net/manual/en/function.gzopen.php |
@@ -9,227 +9,227 @@ |
||
| 9 | 9 | */ |
| 10 | 10 | class Stream implements StreamInterface |
| 11 | 11 | { |
| 12 | - /** |
|
| 13 | - * @see https://www.php.net/manual/en/function.fopen.php |
|
| 14 | - * @see https://www.php.net/manual/en/function.gzopen.php |
|
| 15 | - */ |
|
| 16 | - private const READABLE_MODES = '/r|a\\+|ab\\+|w\\+|wb\\+|x\\+|xb\\+|c\\+|cb\\+/'; |
|
| 17 | - private const WRITABLE_MODES = '/a|w|r\\+|rb\\+|rw|x|c/'; |
|
| 18 | - /** @var resource */ |
|
| 19 | - private $stream; |
|
| 20 | - /** @var int|null */ |
|
| 21 | - private $size; |
|
| 22 | - /** @var bool */ |
|
| 23 | - private $seekable; |
|
| 24 | - /** @var bool */ |
|
| 25 | - private $readable; |
|
| 26 | - /** @var bool */ |
|
| 27 | - private $writable; |
|
| 28 | - /** @var string|null */ |
|
| 29 | - private $uri; |
|
| 30 | - /** @var mixed[] */ |
|
| 31 | - private $customMetadata; |
|
| 32 | - /** |
|
| 33 | - * This constructor accepts an associative array of options. |
|
| 34 | - * |
|
| 35 | - * - size: (int) If a read stream would otherwise have an indeterminate |
|
| 36 | - * size, but the size is known due to foreknowledge, then you can |
|
| 37 | - * provide that size, in bytes. |
|
| 38 | - * - metadata: (array) Any additional metadata to return when the metadata |
|
| 39 | - * of the stream is accessed. |
|
| 40 | - * |
|
| 41 | - * @param resource $stream Stream resource to wrap. |
|
| 42 | - * @param array{size?: int, metadata?: array} $options Associative array of options. |
|
| 43 | - * |
|
| 44 | - * @throws \InvalidArgumentException if the stream is not a stream resource |
|
| 45 | - */ |
|
| 46 | - public function __construct($stream, array $options = []) |
|
| 47 | - { |
|
| 48 | - if (!\is_resource($stream)) { |
|
| 49 | - throw new \InvalidArgumentException('Stream must be a resource'); |
|
| 50 | - } |
|
| 51 | - if (isset($options['size'])) { |
|
| 52 | - $this->size = $options['size']; |
|
| 53 | - } |
|
| 54 | - $this->customMetadata = $options['metadata'] ?? []; |
|
| 55 | - $this->stream = $stream; |
|
| 56 | - $meta = \stream_get_meta_data($this->stream); |
|
| 57 | - $this->seekable = $meta['seekable']; |
|
| 58 | - $this->readable = (bool) \preg_match(self::READABLE_MODES, $meta['mode']); |
|
| 59 | - $this->writable = (bool) \preg_match(self::WRITABLE_MODES, $meta['mode']); |
|
| 60 | - $this->uri = $this->getMetadata('uri'); |
|
| 61 | - } |
|
| 62 | - /** |
|
| 63 | - * Closes the stream when the destructed |
|
| 64 | - */ |
|
| 65 | - public function __destruct() |
|
| 66 | - { |
|
| 67 | - $this->close(); |
|
| 68 | - } |
|
| 69 | - public function __toString() : string |
|
| 70 | - { |
|
| 71 | - try { |
|
| 72 | - if ($this->isSeekable()) { |
|
| 73 | - $this->seek(0); |
|
| 74 | - } |
|
| 75 | - return $this->getContents(); |
|
| 76 | - } catch (\Throwable $e) { |
|
| 77 | - if (\PHP_VERSION_ID >= 70400) { |
|
| 78 | - throw $e; |
|
| 79 | - } |
|
| 80 | - \trigger_error(\sprintf('%s::__toString exception: %s', self::class, (string) $e), \E_USER_ERROR); |
|
| 81 | - return ''; |
|
| 82 | - } |
|
| 83 | - } |
|
| 84 | - public function getContents() : string |
|
| 85 | - { |
|
| 86 | - if (!isset($this->stream)) { |
|
| 87 | - throw new \RuntimeException('Stream is detached'); |
|
| 88 | - } |
|
| 89 | - if (!$this->readable) { |
|
| 90 | - throw new \RuntimeException('Cannot read from non-readable stream'); |
|
| 91 | - } |
|
| 92 | - return Utils::tryGetContents($this->stream); |
|
| 93 | - } |
|
| 94 | - public function close() : void |
|
| 95 | - { |
|
| 96 | - if (isset($this->stream)) { |
|
| 97 | - if (\is_resource($this->stream)) { |
|
| 98 | - \fclose($this->stream); |
|
| 99 | - } |
|
| 100 | - $this->detach(); |
|
| 101 | - } |
|
| 102 | - } |
|
| 103 | - public function detach() |
|
| 104 | - { |
|
| 105 | - if (!isset($this->stream)) { |
|
| 106 | - return null; |
|
| 107 | - } |
|
| 108 | - $result = $this->stream; |
|
| 109 | - unset($this->stream); |
|
| 110 | - $this->size = $this->uri = null; |
|
| 111 | - $this->readable = $this->writable = $this->seekable = \false; |
|
| 112 | - return $result; |
|
| 113 | - } |
|
| 114 | - public function getSize() : ?int |
|
| 115 | - { |
|
| 116 | - if ($this->size !== null) { |
|
| 117 | - return $this->size; |
|
| 118 | - } |
|
| 119 | - if (!isset($this->stream)) { |
|
| 120 | - return null; |
|
| 121 | - } |
|
| 122 | - // Clear the stat cache if the stream has a URI |
|
| 123 | - if ($this->uri) { |
|
| 124 | - \clearstatcache(\true, $this->uri); |
|
| 125 | - } |
|
| 126 | - $stats = \fstat($this->stream); |
|
| 127 | - if (\is_array($stats) && isset($stats['size'])) { |
|
| 128 | - $this->size = $stats['size']; |
|
| 129 | - return $this->size; |
|
| 130 | - } |
|
| 131 | - return null; |
|
| 132 | - } |
|
| 133 | - public function isReadable() : bool |
|
| 134 | - { |
|
| 135 | - return $this->readable; |
|
| 136 | - } |
|
| 137 | - public function isWritable() : bool |
|
| 138 | - { |
|
| 139 | - return $this->writable; |
|
| 140 | - } |
|
| 141 | - public function isSeekable() : bool |
|
| 142 | - { |
|
| 143 | - return $this->seekable; |
|
| 144 | - } |
|
| 145 | - public function eof() : bool |
|
| 146 | - { |
|
| 147 | - if (!isset($this->stream)) { |
|
| 148 | - throw new \RuntimeException('Stream is detached'); |
|
| 149 | - } |
|
| 150 | - return \feof($this->stream); |
|
| 151 | - } |
|
| 152 | - public function tell() : int |
|
| 153 | - { |
|
| 154 | - if (!isset($this->stream)) { |
|
| 155 | - throw new \RuntimeException('Stream is detached'); |
|
| 156 | - } |
|
| 157 | - $result = \ftell($this->stream); |
|
| 158 | - if ($result === \false) { |
|
| 159 | - throw new \RuntimeException('Unable to determine stream position'); |
|
| 160 | - } |
|
| 161 | - return $result; |
|
| 162 | - } |
|
| 163 | - public function rewind() : void |
|
| 164 | - { |
|
| 165 | - $this->seek(0); |
|
| 166 | - } |
|
| 167 | - public function seek($offset, $whence = \SEEK_SET) : void |
|
| 168 | - { |
|
| 169 | - $whence = (int) $whence; |
|
| 170 | - if (!isset($this->stream)) { |
|
| 171 | - throw new \RuntimeException('Stream is detached'); |
|
| 172 | - } |
|
| 173 | - if (!$this->seekable) { |
|
| 174 | - throw new \RuntimeException('Stream is not seekable'); |
|
| 175 | - } |
|
| 176 | - if (\fseek($this->stream, $offset, $whence) === -1) { |
|
| 177 | - throw new \RuntimeException('Unable to seek to stream position ' . $offset . ' with whence ' . \var_export($whence, \true)); |
|
| 178 | - } |
|
| 179 | - } |
|
| 180 | - public function read($length) : string |
|
| 181 | - { |
|
| 182 | - if (!isset($this->stream)) { |
|
| 183 | - throw new \RuntimeException('Stream is detached'); |
|
| 184 | - } |
|
| 185 | - if (!$this->readable) { |
|
| 186 | - throw new \RuntimeException('Cannot read from non-readable stream'); |
|
| 187 | - } |
|
| 188 | - if ($length < 0) { |
|
| 189 | - throw new \RuntimeException('Length parameter cannot be negative'); |
|
| 190 | - } |
|
| 191 | - if (0 === $length) { |
|
| 192 | - return ''; |
|
| 193 | - } |
|
| 194 | - try { |
|
| 195 | - $string = \fread($this->stream, $length); |
|
| 196 | - } catch (\Exception $e) { |
|
| 197 | - throw new \RuntimeException('Unable to read from stream', 0, $e); |
|
| 198 | - } |
|
| 199 | - if (\false === $string) { |
|
| 200 | - throw new \RuntimeException('Unable to read from stream'); |
|
| 201 | - } |
|
| 202 | - return $string; |
|
| 203 | - } |
|
| 204 | - public function write($string) : int |
|
| 205 | - { |
|
| 206 | - if (!isset($this->stream)) { |
|
| 207 | - throw new \RuntimeException('Stream is detached'); |
|
| 208 | - } |
|
| 209 | - if (!$this->writable) { |
|
| 210 | - throw new \RuntimeException('Cannot write to a non-writable stream'); |
|
| 211 | - } |
|
| 212 | - // We can't know the size after writing anything |
|
| 213 | - $this->size = null; |
|
| 214 | - $result = \fwrite($this->stream, $string); |
|
| 215 | - if ($result === \false) { |
|
| 216 | - throw new \RuntimeException('Unable to write to stream'); |
|
| 217 | - } |
|
| 218 | - return $result; |
|
| 219 | - } |
|
| 220 | - /** |
|
| 221 | - * @return mixed |
|
| 222 | - */ |
|
| 223 | - public function getMetadata($key = null) |
|
| 224 | - { |
|
| 225 | - if (!isset($this->stream)) { |
|
| 226 | - return $key ? null : []; |
|
| 227 | - } elseif (!$key) { |
|
| 228 | - return $this->customMetadata + \stream_get_meta_data($this->stream); |
|
| 229 | - } elseif (isset($this->customMetadata[$key])) { |
|
| 230 | - return $this->customMetadata[$key]; |
|
| 231 | - } |
|
| 232 | - $meta = \stream_get_meta_data($this->stream); |
|
| 233 | - return $meta[$key] ?? null; |
|
| 234 | - } |
|
| 12 | + /** |
|
| 13 | + * @see https://www.php.net/manual/en/function.fopen.php |
|
| 14 | + * @see https://www.php.net/manual/en/function.gzopen.php |
|
| 15 | + */ |
|
| 16 | + private const READABLE_MODES = '/r|a\\+|ab\\+|w\\+|wb\\+|x\\+|xb\\+|c\\+|cb\\+/'; |
|
| 17 | + private const WRITABLE_MODES = '/a|w|r\\+|rb\\+|rw|x|c/'; |
|
| 18 | + /** @var resource */ |
|
| 19 | + private $stream; |
|
| 20 | + /** @var int|null */ |
|
| 21 | + private $size; |
|
| 22 | + /** @var bool */ |
|
| 23 | + private $seekable; |
|
| 24 | + /** @var bool */ |
|
| 25 | + private $readable; |
|
| 26 | + /** @var bool */ |
|
| 27 | + private $writable; |
|
| 28 | + /** @var string|null */ |
|
| 29 | + private $uri; |
|
| 30 | + /** @var mixed[] */ |
|
| 31 | + private $customMetadata; |
|
| 32 | + /** |
|
| 33 | + * This constructor accepts an associative array of options. |
|
| 34 | + * |
|
| 35 | + * - size: (int) If a read stream would otherwise have an indeterminate |
|
| 36 | + * size, but the size is known due to foreknowledge, then you can |
|
| 37 | + * provide that size, in bytes. |
|
| 38 | + * - metadata: (array) Any additional metadata to return when the metadata |
|
| 39 | + * of the stream is accessed. |
|
| 40 | + * |
|
| 41 | + * @param resource $stream Stream resource to wrap. |
|
| 42 | + * @param array{size?: int, metadata?: array} $options Associative array of options. |
|
| 43 | + * |
|
| 44 | + * @throws \InvalidArgumentException if the stream is not a stream resource |
|
| 45 | + */ |
|
| 46 | + public function __construct($stream, array $options = []) |
|
| 47 | + { |
|
| 48 | + if (!\is_resource($stream)) { |
|
| 49 | + throw new \InvalidArgumentException('Stream must be a resource'); |
|
| 50 | + } |
|
| 51 | + if (isset($options['size'])) { |
|
| 52 | + $this->size = $options['size']; |
|
| 53 | + } |
|
| 54 | + $this->customMetadata = $options['metadata'] ?? []; |
|
| 55 | + $this->stream = $stream; |
|
| 56 | + $meta = \stream_get_meta_data($this->stream); |
|
| 57 | + $this->seekable = $meta['seekable']; |
|
| 58 | + $this->readable = (bool) \preg_match(self::READABLE_MODES, $meta['mode']); |
|
| 59 | + $this->writable = (bool) \preg_match(self::WRITABLE_MODES, $meta['mode']); |
|
| 60 | + $this->uri = $this->getMetadata('uri'); |
|
| 61 | + } |
|
| 62 | + /** |
|
| 63 | + * Closes the stream when the destructed |
|
| 64 | + */ |
|
| 65 | + public function __destruct() |
|
| 66 | + { |
|
| 67 | + $this->close(); |
|
| 68 | + } |
|
| 69 | + public function __toString() : string |
|
| 70 | + { |
|
| 71 | + try { |
|
| 72 | + if ($this->isSeekable()) { |
|
| 73 | + $this->seek(0); |
|
| 74 | + } |
|
| 75 | + return $this->getContents(); |
|
| 76 | + } catch (\Throwable $e) { |
|
| 77 | + if (\PHP_VERSION_ID >= 70400) { |
|
| 78 | + throw $e; |
|
| 79 | + } |
|
| 80 | + \trigger_error(\sprintf('%s::__toString exception: %s', self::class, (string) $e), \E_USER_ERROR); |
|
| 81 | + return ''; |
|
| 82 | + } |
|
| 83 | + } |
|
| 84 | + public function getContents() : string |
|
| 85 | + { |
|
| 86 | + if (!isset($this->stream)) { |
|
| 87 | + throw new \RuntimeException('Stream is detached'); |
|
| 88 | + } |
|
| 89 | + if (!$this->readable) { |
|
| 90 | + throw new \RuntimeException('Cannot read from non-readable stream'); |
|
| 91 | + } |
|
| 92 | + return Utils::tryGetContents($this->stream); |
|
| 93 | + } |
|
| 94 | + public function close() : void |
|
| 95 | + { |
|
| 96 | + if (isset($this->stream)) { |
|
| 97 | + if (\is_resource($this->stream)) { |
|
| 98 | + \fclose($this->stream); |
|
| 99 | + } |
|
| 100 | + $this->detach(); |
|
| 101 | + } |
|
| 102 | + } |
|
| 103 | + public function detach() |
|
| 104 | + { |
|
| 105 | + if (!isset($this->stream)) { |
|
| 106 | + return null; |
|
| 107 | + } |
|
| 108 | + $result = $this->stream; |
|
| 109 | + unset($this->stream); |
|
| 110 | + $this->size = $this->uri = null; |
|
| 111 | + $this->readable = $this->writable = $this->seekable = \false; |
|
| 112 | + return $result; |
|
| 113 | + } |
|
| 114 | + public function getSize() : ?int |
|
| 115 | + { |
|
| 116 | + if ($this->size !== null) { |
|
| 117 | + return $this->size; |
|
| 118 | + } |
|
| 119 | + if (!isset($this->stream)) { |
|
| 120 | + return null; |
|
| 121 | + } |
|
| 122 | + // Clear the stat cache if the stream has a URI |
|
| 123 | + if ($this->uri) { |
|
| 124 | + \clearstatcache(\true, $this->uri); |
|
| 125 | + } |
|
| 126 | + $stats = \fstat($this->stream); |
|
| 127 | + if (\is_array($stats) && isset($stats['size'])) { |
|
| 128 | + $this->size = $stats['size']; |
|
| 129 | + return $this->size; |
|
| 130 | + } |
|
| 131 | + return null; |
|
| 132 | + } |
|
| 133 | + public function isReadable() : bool |
|
| 134 | + { |
|
| 135 | + return $this->readable; |
|
| 136 | + } |
|
| 137 | + public function isWritable() : bool |
|
| 138 | + { |
|
| 139 | + return $this->writable; |
|
| 140 | + } |
|
| 141 | + public function isSeekable() : bool |
|
| 142 | + { |
|
| 143 | + return $this->seekable; |
|
| 144 | + } |
|
| 145 | + public function eof() : bool |
|
| 146 | + { |
|
| 147 | + if (!isset($this->stream)) { |
|
| 148 | + throw new \RuntimeException('Stream is detached'); |
|
| 149 | + } |
|
| 150 | + return \feof($this->stream); |
|
| 151 | + } |
|
| 152 | + public function tell() : int |
|
| 153 | + { |
|
| 154 | + if (!isset($this->stream)) { |
|
| 155 | + throw new \RuntimeException('Stream is detached'); |
|
| 156 | + } |
|
| 157 | + $result = \ftell($this->stream); |
|
| 158 | + if ($result === \false) { |
|
| 159 | + throw new \RuntimeException('Unable to determine stream position'); |
|
| 160 | + } |
|
| 161 | + return $result; |
|
| 162 | + } |
|
| 163 | + public function rewind() : void |
|
| 164 | + { |
|
| 165 | + $this->seek(0); |
|
| 166 | + } |
|
| 167 | + public function seek($offset, $whence = \SEEK_SET) : void |
|
| 168 | + { |
|
| 169 | + $whence = (int) $whence; |
|
| 170 | + if (!isset($this->stream)) { |
|
| 171 | + throw new \RuntimeException('Stream is detached'); |
|
| 172 | + } |
|
| 173 | + if (!$this->seekable) { |
|
| 174 | + throw new \RuntimeException('Stream is not seekable'); |
|
| 175 | + } |
|
| 176 | + if (\fseek($this->stream, $offset, $whence) === -1) { |
|
| 177 | + throw new \RuntimeException('Unable to seek to stream position ' . $offset . ' with whence ' . \var_export($whence, \true)); |
|
| 178 | + } |
|
| 179 | + } |
|
| 180 | + public function read($length) : string |
|
| 181 | + { |
|
| 182 | + if (!isset($this->stream)) { |
|
| 183 | + throw new \RuntimeException('Stream is detached'); |
|
| 184 | + } |
|
| 185 | + if (!$this->readable) { |
|
| 186 | + throw new \RuntimeException('Cannot read from non-readable stream'); |
|
| 187 | + } |
|
| 188 | + if ($length < 0) { |
|
| 189 | + throw new \RuntimeException('Length parameter cannot be negative'); |
|
| 190 | + } |
|
| 191 | + if (0 === $length) { |
|
| 192 | + return ''; |
|
| 193 | + } |
|
| 194 | + try { |
|
| 195 | + $string = \fread($this->stream, $length); |
|
| 196 | + } catch (\Exception $e) { |
|
| 197 | + throw new \RuntimeException('Unable to read from stream', 0, $e); |
|
| 198 | + } |
|
| 199 | + if (\false === $string) { |
|
| 200 | + throw new \RuntimeException('Unable to read from stream'); |
|
| 201 | + } |
|
| 202 | + return $string; |
|
| 203 | + } |
|
| 204 | + public function write($string) : int |
|
| 205 | + { |
|
| 206 | + if (!isset($this->stream)) { |
|
| 207 | + throw new \RuntimeException('Stream is detached'); |
|
| 208 | + } |
|
| 209 | + if (!$this->writable) { |
|
| 210 | + throw new \RuntimeException('Cannot write to a non-writable stream'); |
|
| 211 | + } |
|
| 212 | + // We can't know the size after writing anything |
|
| 213 | + $this->size = null; |
|
| 214 | + $result = \fwrite($this->stream, $string); |
|
| 215 | + if ($result === \false) { |
|
| 216 | + throw new \RuntimeException('Unable to write to stream'); |
|
| 217 | + } |
|
| 218 | + return $result; |
|
| 219 | + } |
|
| 220 | + /** |
|
| 221 | + * @return mixed |
|
| 222 | + */ |
|
| 223 | + public function getMetadata($key = null) |
|
| 224 | + { |
|
| 225 | + if (!isset($this->stream)) { |
|
| 226 | + return $key ? null : []; |
|
| 227 | + } elseif (!$key) { |
|
| 228 | + return $this->customMetadata + \stream_get_meta_data($this->stream); |
|
| 229 | + } elseif (isset($this->customMetadata[$key])) { |
|
| 230 | + return $this->customMetadata[$key]; |
|
| 231 | + } |
|
| 232 | + $meta = \stream_get_meta_data($this->stream); |
|
| 233 | + return $meta[$key] ?? null; |
|
| 234 | + } |
|
| 235 | 235 | } |
@@ -1,6 +1,6 @@ discard block |
||
| 1 | 1 | <?php |
| 2 | 2 | |
| 3 | -declare (strict_types=1); |
|
| 3 | +declare(strict_types=1); |
|
| 4 | 4 | namespace OCA\FullTextSearch_Elasticsearch\Vendor\GuzzleHttp\Psr7; |
| 5 | 5 | |
| 6 | 6 | use OCA\FullTextSearch_Elasticsearch\Vendor\Psr\Http\Message\StreamInterface; |
@@ -55,8 +55,8 @@ discard block |
||
| 55 | 55 | $this->stream = $stream; |
| 56 | 56 | $meta = \stream_get_meta_data($this->stream); |
| 57 | 57 | $this->seekable = $meta['seekable']; |
| 58 | - $this->readable = (bool) \preg_match(self::READABLE_MODES, $meta['mode']); |
|
| 59 | - $this->writable = (bool) \preg_match(self::WRITABLE_MODES, $meta['mode']); |
|
| 58 | + $this->readable = (bool)\preg_match(self::READABLE_MODES, $meta['mode']); |
|
| 59 | + $this->writable = (bool)\preg_match(self::WRITABLE_MODES, $meta['mode']); |
|
| 60 | 60 | $this->uri = $this->getMetadata('uri'); |
| 61 | 61 | } |
| 62 | 62 | /** |
@@ -77,7 +77,7 @@ discard block |
||
| 77 | 77 | if (\PHP_VERSION_ID >= 70400) { |
| 78 | 78 | throw $e; |
| 79 | 79 | } |
| 80 | - \trigger_error(\sprintf('%s::__toString exception: %s', self::class, (string) $e), \E_USER_ERROR); |
|
| 80 | + \trigger_error(\sprintf('%s::__toString exception: %s', self::class, (string)$e), \E_USER_ERROR); |
|
| 81 | 81 | return ''; |
| 82 | 82 | } |
| 83 | 83 | } |
@@ -166,7 +166,7 @@ discard block |
||
| 166 | 166 | } |
| 167 | 167 | public function seek($offset, $whence = \SEEK_SET) : void |
| 168 | 168 | { |
| 169 | - $whence = (int) $whence; |
|
| 169 | + $whence = (int)$whence; |
|
| 170 | 170 | if (!isset($this->stream)) { |
| 171 | 171 | throw new \RuntimeException('Stream is detached'); |
| 172 | 172 | } |
@@ -174,7 +174,7 @@ discard block |
||
| 174 | 174 | throw new \RuntimeException('Stream is not seekable'); |
| 175 | 175 | } |
| 176 | 176 | if (\fseek($this->stream, $offset, $whence) === -1) { |
| 177 | - throw new \RuntimeException('Unable to seek to stream position ' . $offset . ' with whence ' . \var_export($whence, \true)); |
|
| 177 | + throw new \RuntimeException('Unable to seek to stream position '.$offset.' with whence '.\var_export($whence, \true)); |
|
| 178 | 178 | } |
| 179 | 179 | } |
| 180 | 180 | public function read($length) : string |
@@ -13,8 +13,7 @@ |
||
| 13 | 13 | * |
| 14 | 14 | * @see https://datatracker.ietf.org/doc/html/rfc3986#section-6 |
| 15 | 15 | */ |
| 16 | -final class UriNormalizer |
|
| 17 | -{ |
|
| 16 | +final class UriNormalizer { |
|
| 18 | 17 | /** |
| 19 | 18 | * Default normalizations which only include the ones that preserve semantics. |
| 20 | 19 | */ |
@@ -13,163 +13,163 @@ |
||
| 13 | 13 | */ |
| 14 | 14 | final class UriNormalizer |
| 15 | 15 | { |
| 16 | - /** |
|
| 17 | - * Default normalizations which only include the ones that preserve semantics. |
|
| 18 | - */ |
|
| 19 | - public const PRESERVING_NORMALIZATIONS = self::CAPITALIZE_PERCENT_ENCODING | self::DECODE_UNRESERVED_CHARACTERS | self::CONVERT_EMPTY_PATH | self::REMOVE_DEFAULT_HOST | self::REMOVE_DEFAULT_PORT | self::REMOVE_DOT_SEGMENTS; |
|
| 20 | - /** |
|
| 21 | - * All letters within a percent-encoding triplet (e.g., "%3A") are case-insensitive, and should be capitalized. |
|
| 22 | - * |
|
| 23 | - * Example: http://example.org/a%c2%b1b → http://example.org/a%C2%B1b |
|
| 24 | - */ |
|
| 25 | - public const CAPITALIZE_PERCENT_ENCODING = 1; |
|
| 26 | - /** |
|
| 27 | - * Decodes percent-encoded octets of unreserved characters. |
|
| 28 | - * |
|
| 29 | - * For consistency, percent-encoded octets in the ranges of ALPHA (%41–%5A and %61–%7A), DIGIT (%30–%39), |
|
| 30 | - * hyphen (%2D), period (%2E), underscore (%5F), or tilde (%7E) should not be created by URI producers and, |
|
| 31 | - * when found in a URI, should be decoded to their corresponding unreserved characters by URI normalizers. |
|
| 32 | - * |
|
| 33 | - * Example: http://example.org/%7Eusern%61me/ → http://example.org/~username/ |
|
| 34 | - */ |
|
| 35 | - public const DECODE_UNRESERVED_CHARACTERS = 2; |
|
| 36 | - /** |
|
| 37 | - * Converts the empty path to "/" for http and https URIs. |
|
| 38 | - * |
|
| 39 | - * Example: http://example.org → http://example.org/ |
|
| 40 | - */ |
|
| 41 | - public const CONVERT_EMPTY_PATH = 4; |
|
| 42 | - /** |
|
| 43 | - * Removes the default host of the given URI scheme from the URI. |
|
| 44 | - * |
|
| 45 | - * Only the "file" scheme defines the default host "localhost". |
|
| 46 | - * All of `file:/myfile`, `file:///myfile`, and `file://localhost/myfile` |
|
| 47 | - * are equivalent according to RFC 3986. The first format is not accepted |
|
| 48 | - * by PHPs stream functions and thus already normalized implicitly to the |
|
| 49 | - * second format in the Uri class. See `GuzzleHttp\Psr7\Uri::composeComponents`. |
|
| 50 | - * |
|
| 51 | - * Example: file://localhost/myfile → file:///myfile |
|
| 52 | - */ |
|
| 53 | - public const REMOVE_DEFAULT_HOST = 8; |
|
| 54 | - /** |
|
| 55 | - * Removes the default port of the given URI scheme from the URI. |
|
| 56 | - * |
|
| 57 | - * Example: http://example.org:80/ → http://example.org/ |
|
| 58 | - */ |
|
| 59 | - public const REMOVE_DEFAULT_PORT = 16; |
|
| 60 | - /** |
|
| 61 | - * Removes unnecessary dot-segments. |
|
| 62 | - * |
|
| 63 | - * Dot-segments in relative-path references are not removed as it would |
|
| 64 | - * change the semantics of the URI reference. |
|
| 65 | - * |
|
| 66 | - * Example: http://example.org/../a/b/../c/./d.html → http://example.org/a/c/d.html |
|
| 67 | - */ |
|
| 68 | - public const REMOVE_DOT_SEGMENTS = 32; |
|
| 69 | - /** |
|
| 70 | - * Paths which include two or more adjacent slashes are converted to one. |
|
| 71 | - * |
|
| 72 | - * Webservers usually ignore duplicate slashes and treat those URIs equivalent. |
|
| 73 | - * But in theory those URIs do not need to be equivalent. So this normalization |
|
| 74 | - * may change the semantics. Encoded slashes (%2F) are not removed. |
|
| 75 | - * |
|
| 76 | - * Example: http://example.org//foo///bar.html → http://example.org/foo/bar.html |
|
| 77 | - */ |
|
| 78 | - public const REMOVE_DUPLICATE_SLASHES = 64; |
|
| 79 | - /** |
|
| 80 | - * Sort query parameters with their values in alphabetical order. |
|
| 81 | - * |
|
| 82 | - * However, the order of parameters in a URI may be significant (this is not defined by the standard). |
|
| 83 | - * So this normalization is not safe and may change the semantics of the URI. |
|
| 84 | - * |
|
| 85 | - * Example: ?lang=en&article=fred → ?article=fred&lang=en |
|
| 86 | - * |
|
| 87 | - * Note: The sorting is neither locale nor Unicode aware (the URI query does not get decoded at all) as the |
|
| 88 | - * purpose is to be able to compare URIs in a reproducible way, not to have the params sorted perfectly. |
|
| 89 | - */ |
|
| 90 | - public const SORT_QUERY_PARAMETERS = 128; |
|
| 91 | - /** |
|
| 92 | - * Returns a normalized URI. |
|
| 93 | - * |
|
| 94 | - * The scheme and host component are already normalized to lowercase per PSR-7 UriInterface. |
|
| 95 | - * This methods adds additional normalizations that can be configured with the $flags parameter. |
|
| 96 | - * |
|
| 97 | - * PSR-7 UriInterface cannot distinguish between an empty component and a missing component as |
|
| 98 | - * getQuery(), getFragment() etc. always return a string. This means the URIs "/?#" and "/" are |
|
| 99 | - * treated equivalent which is not necessarily true according to RFC 3986. But that difference |
|
| 100 | - * is highly uncommon in reality. So this potential normalization is implied in PSR-7 as well. |
|
| 101 | - * |
|
| 102 | - * @param UriInterface $uri The URI to normalize |
|
| 103 | - * @param int $flags A bitmask of normalizations to apply, see constants |
|
| 104 | - * |
|
| 105 | - * @see https://datatracker.ietf.org/doc/html/rfc3986#section-6.2 |
|
| 106 | - */ |
|
| 107 | - public static function normalize(UriInterface $uri, int $flags = self::PRESERVING_NORMALIZATIONS) : UriInterface |
|
| 108 | - { |
|
| 109 | - if ($flags & self::CAPITALIZE_PERCENT_ENCODING) { |
|
| 110 | - $uri = self::capitalizePercentEncoding($uri); |
|
| 111 | - } |
|
| 112 | - if ($flags & self::DECODE_UNRESERVED_CHARACTERS) { |
|
| 113 | - $uri = self::decodeUnreservedCharacters($uri); |
|
| 114 | - } |
|
| 115 | - if ($flags & self::CONVERT_EMPTY_PATH && $uri->getPath() === '' && ($uri->getScheme() === 'http' || $uri->getScheme() === 'https')) { |
|
| 116 | - $uri = $uri->withPath('/'); |
|
| 117 | - } |
|
| 118 | - if ($flags & self::REMOVE_DEFAULT_HOST && $uri->getScheme() === 'file' && $uri->getHost() === 'localhost') { |
|
| 119 | - $uri = $uri->withHost(''); |
|
| 120 | - } |
|
| 121 | - if ($flags & self::REMOVE_DEFAULT_PORT && $uri->getPort() !== null && Uri::isDefaultPort($uri)) { |
|
| 122 | - $uri = $uri->withPort(null); |
|
| 123 | - } |
|
| 124 | - if ($flags & self::REMOVE_DOT_SEGMENTS && !Uri::isRelativePathReference($uri)) { |
|
| 125 | - $uri = $uri->withPath(UriResolver::removeDotSegments($uri->getPath())); |
|
| 126 | - } |
|
| 127 | - if ($flags & self::REMOVE_DUPLICATE_SLASHES) { |
|
| 128 | - $uri = $uri->withPath(\preg_replace('#//++#', '/', $uri->getPath())); |
|
| 129 | - } |
|
| 130 | - if ($flags & self::SORT_QUERY_PARAMETERS && $uri->getQuery() !== '') { |
|
| 131 | - $queryKeyValues = \explode('&', $uri->getQuery()); |
|
| 132 | - \sort($queryKeyValues); |
|
| 133 | - $uri = $uri->withQuery(\implode('&', $queryKeyValues)); |
|
| 134 | - } |
|
| 135 | - return $uri; |
|
| 136 | - } |
|
| 137 | - /** |
|
| 138 | - * Whether two URIs can be considered equivalent. |
|
| 139 | - * |
|
| 140 | - * Both URIs are normalized automatically before comparison with the given $normalizations bitmask. The method also |
|
| 141 | - * accepts relative URI references and returns true when they are equivalent. This of course assumes they will be |
|
| 142 | - * resolved against the same base URI. If this is not the case, determination of equivalence or difference of |
|
| 143 | - * relative references does not mean anything. |
|
| 144 | - * |
|
| 145 | - * @param UriInterface $uri1 An URI to compare |
|
| 146 | - * @param UriInterface $uri2 An URI to compare |
|
| 147 | - * @param int $normalizations A bitmask of normalizations to apply, see constants |
|
| 148 | - * |
|
| 149 | - * @see https://datatracker.ietf.org/doc/html/rfc3986#section-6.1 |
|
| 150 | - */ |
|
| 151 | - public static function isEquivalent(UriInterface $uri1, UriInterface $uri2, int $normalizations = self::PRESERVING_NORMALIZATIONS) : bool |
|
| 152 | - { |
|
| 153 | - return (string) self::normalize($uri1, $normalizations) === (string) self::normalize($uri2, $normalizations); |
|
| 154 | - } |
|
| 155 | - private static function capitalizePercentEncoding(UriInterface $uri) : UriInterface |
|
| 156 | - { |
|
| 157 | - $regex = '/(?:%[A-Fa-f0-9]{2})++/'; |
|
| 158 | - $callback = function (array $match) : string { |
|
| 159 | - return \strtoupper($match[0]); |
|
| 160 | - }; |
|
| 161 | - return $uri->withPath(\preg_replace_callback($regex, $callback, $uri->getPath()))->withQuery(\preg_replace_callback($regex, $callback, $uri->getQuery())); |
|
| 162 | - } |
|
| 163 | - private static function decodeUnreservedCharacters(UriInterface $uri) : UriInterface |
|
| 164 | - { |
|
| 165 | - $regex = '/%(?:2D|2E|5F|7E|3[0-9]|[46][1-9A-F]|[57][0-9A])/i'; |
|
| 166 | - $callback = function (array $match) : string { |
|
| 167 | - return \rawurldecode($match[0]); |
|
| 168 | - }; |
|
| 169 | - return $uri->withPath(\preg_replace_callback($regex, $callback, $uri->getPath()))->withQuery(\preg_replace_callback($regex, $callback, $uri->getQuery())); |
|
| 170 | - } |
|
| 171 | - private function __construct() |
|
| 172 | - { |
|
| 173 | - // cannot be instantiated |
|
| 174 | - } |
|
| 16 | + /** |
|
| 17 | + * Default normalizations which only include the ones that preserve semantics. |
|
| 18 | + */ |
|
| 19 | + public const PRESERVING_NORMALIZATIONS = self::CAPITALIZE_PERCENT_ENCODING | self::DECODE_UNRESERVED_CHARACTERS | self::CONVERT_EMPTY_PATH | self::REMOVE_DEFAULT_HOST | self::REMOVE_DEFAULT_PORT | self::REMOVE_DOT_SEGMENTS; |
|
| 20 | + /** |
|
| 21 | + * All letters within a percent-encoding triplet (e.g., "%3A") are case-insensitive, and should be capitalized. |
|
| 22 | + * |
|
| 23 | + * Example: http://example.org/a%c2%b1b → http://example.org/a%C2%B1b |
|
| 24 | + */ |
|
| 25 | + public const CAPITALIZE_PERCENT_ENCODING = 1; |
|
| 26 | + /** |
|
| 27 | + * Decodes percent-encoded octets of unreserved characters. |
|
| 28 | + * |
|
| 29 | + * For consistency, percent-encoded octets in the ranges of ALPHA (%41–%5A and %61–%7A), DIGIT (%30–%39), |
|
| 30 | + * hyphen (%2D), period (%2E), underscore (%5F), or tilde (%7E) should not be created by URI producers and, |
|
| 31 | + * when found in a URI, should be decoded to their corresponding unreserved characters by URI normalizers. |
|
| 32 | + * |
|
| 33 | + * Example: http://example.org/%7Eusern%61me/ → http://example.org/~username/ |
|
| 34 | + */ |
|
| 35 | + public const DECODE_UNRESERVED_CHARACTERS = 2; |
|
| 36 | + /** |
|
| 37 | + * Converts the empty path to "/" for http and https URIs. |
|
| 38 | + * |
|
| 39 | + * Example: http://example.org → http://example.org/ |
|
| 40 | + */ |
|
| 41 | + public const CONVERT_EMPTY_PATH = 4; |
|
| 42 | + /** |
|
| 43 | + * Removes the default host of the given URI scheme from the URI. |
|
| 44 | + * |
|
| 45 | + * Only the "file" scheme defines the default host "localhost". |
|
| 46 | + * All of `file:/myfile`, `file:///myfile`, and `file://localhost/myfile` |
|
| 47 | + * are equivalent according to RFC 3986. The first format is not accepted |
|
| 48 | + * by PHPs stream functions and thus already normalized implicitly to the |
|
| 49 | + * second format in the Uri class. See `GuzzleHttp\Psr7\Uri::composeComponents`. |
|
| 50 | + * |
|
| 51 | + * Example: file://localhost/myfile → file:///myfile |
|
| 52 | + */ |
|
| 53 | + public const REMOVE_DEFAULT_HOST = 8; |
|
| 54 | + /** |
|
| 55 | + * Removes the default port of the given URI scheme from the URI. |
|
| 56 | + * |
|
| 57 | + * Example: http://example.org:80/ → http://example.org/ |
|
| 58 | + */ |
|
| 59 | + public const REMOVE_DEFAULT_PORT = 16; |
|
| 60 | + /** |
|
| 61 | + * Removes unnecessary dot-segments. |
|
| 62 | + * |
|
| 63 | + * Dot-segments in relative-path references are not removed as it would |
|
| 64 | + * change the semantics of the URI reference. |
|
| 65 | + * |
|
| 66 | + * Example: http://example.org/../a/b/../c/./d.html → http://example.org/a/c/d.html |
|
| 67 | + */ |
|
| 68 | + public const REMOVE_DOT_SEGMENTS = 32; |
|
| 69 | + /** |
|
| 70 | + * Paths which include two or more adjacent slashes are converted to one. |
|
| 71 | + * |
|
| 72 | + * Webservers usually ignore duplicate slashes and treat those URIs equivalent. |
|
| 73 | + * But in theory those URIs do not need to be equivalent. So this normalization |
|
| 74 | + * may change the semantics. Encoded slashes (%2F) are not removed. |
|
| 75 | + * |
|
| 76 | + * Example: http://example.org//foo///bar.html → http://example.org/foo/bar.html |
|
| 77 | + */ |
|
| 78 | + public const REMOVE_DUPLICATE_SLASHES = 64; |
|
| 79 | + /** |
|
| 80 | + * Sort query parameters with their values in alphabetical order. |
|
| 81 | + * |
|
| 82 | + * However, the order of parameters in a URI may be significant (this is not defined by the standard). |
|
| 83 | + * So this normalization is not safe and may change the semantics of the URI. |
|
| 84 | + * |
|
| 85 | + * Example: ?lang=en&article=fred → ?article=fred&lang=en |
|
| 86 | + * |
|
| 87 | + * Note: The sorting is neither locale nor Unicode aware (the URI query does not get decoded at all) as the |
|
| 88 | + * purpose is to be able to compare URIs in a reproducible way, not to have the params sorted perfectly. |
|
| 89 | + */ |
|
| 90 | + public const SORT_QUERY_PARAMETERS = 128; |
|
| 91 | + /** |
|
| 92 | + * Returns a normalized URI. |
|
| 93 | + * |
|
| 94 | + * The scheme and host component are already normalized to lowercase per PSR-7 UriInterface. |
|
| 95 | + * This methods adds additional normalizations that can be configured with the $flags parameter. |
|
| 96 | + * |
|
| 97 | + * PSR-7 UriInterface cannot distinguish between an empty component and a missing component as |
|
| 98 | + * getQuery(), getFragment() etc. always return a string. This means the URIs "/?#" and "/" are |
|
| 99 | + * treated equivalent which is not necessarily true according to RFC 3986. But that difference |
|
| 100 | + * is highly uncommon in reality. So this potential normalization is implied in PSR-7 as well. |
|
| 101 | + * |
|
| 102 | + * @param UriInterface $uri The URI to normalize |
|
| 103 | + * @param int $flags A bitmask of normalizations to apply, see constants |
|
| 104 | + * |
|
| 105 | + * @see https://datatracker.ietf.org/doc/html/rfc3986#section-6.2 |
|
| 106 | + */ |
|
| 107 | + public static function normalize(UriInterface $uri, int $flags = self::PRESERVING_NORMALIZATIONS) : UriInterface |
|
| 108 | + { |
|
| 109 | + if ($flags & self::CAPITALIZE_PERCENT_ENCODING) { |
|
| 110 | + $uri = self::capitalizePercentEncoding($uri); |
|
| 111 | + } |
|
| 112 | + if ($flags & self::DECODE_UNRESERVED_CHARACTERS) { |
|
| 113 | + $uri = self::decodeUnreservedCharacters($uri); |
|
| 114 | + } |
|
| 115 | + if ($flags & self::CONVERT_EMPTY_PATH && $uri->getPath() === '' && ($uri->getScheme() === 'http' || $uri->getScheme() === 'https')) { |
|
| 116 | + $uri = $uri->withPath('/'); |
|
| 117 | + } |
|
| 118 | + if ($flags & self::REMOVE_DEFAULT_HOST && $uri->getScheme() === 'file' && $uri->getHost() === 'localhost') { |
|
| 119 | + $uri = $uri->withHost(''); |
|
| 120 | + } |
|
| 121 | + if ($flags & self::REMOVE_DEFAULT_PORT && $uri->getPort() !== null && Uri::isDefaultPort($uri)) { |
|
| 122 | + $uri = $uri->withPort(null); |
|
| 123 | + } |
|
| 124 | + if ($flags & self::REMOVE_DOT_SEGMENTS && !Uri::isRelativePathReference($uri)) { |
|
| 125 | + $uri = $uri->withPath(UriResolver::removeDotSegments($uri->getPath())); |
|
| 126 | + } |
|
| 127 | + if ($flags & self::REMOVE_DUPLICATE_SLASHES) { |
|
| 128 | + $uri = $uri->withPath(\preg_replace('#//++#', '/', $uri->getPath())); |
|
| 129 | + } |
|
| 130 | + if ($flags & self::SORT_QUERY_PARAMETERS && $uri->getQuery() !== '') { |
|
| 131 | + $queryKeyValues = \explode('&', $uri->getQuery()); |
|
| 132 | + \sort($queryKeyValues); |
|
| 133 | + $uri = $uri->withQuery(\implode('&', $queryKeyValues)); |
|
| 134 | + } |
|
| 135 | + return $uri; |
|
| 136 | + } |
|
| 137 | + /** |
|
| 138 | + * Whether two URIs can be considered equivalent. |
|
| 139 | + * |
|
| 140 | + * Both URIs are normalized automatically before comparison with the given $normalizations bitmask. The method also |
|
| 141 | + * accepts relative URI references and returns true when they are equivalent. This of course assumes they will be |
|
| 142 | + * resolved against the same base URI. If this is not the case, determination of equivalence or difference of |
|
| 143 | + * relative references does not mean anything. |
|
| 144 | + * |
|
| 145 | + * @param UriInterface $uri1 An URI to compare |
|
| 146 | + * @param UriInterface $uri2 An URI to compare |
|
| 147 | + * @param int $normalizations A bitmask of normalizations to apply, see constants |
|
| 148 | + * |
|
| 149 | + * @see https://datatracker.ietf.org/doc/html/rfc3986#section-6.1 |
|
| 150 | + */ |
|
| 151 | + public static function isEquivalent(UriInterface $uri1, UriInterface $uri2, int $normalizations = self::PRESERVING_NORMALIZATIONS) : bool |
|
| 152 | + { |
|
| 153 | + return (string) self::normalize($uri1, $normalizations) === (string) self::normalize($uri2, $normalizations); |
|
| 154 | + } |
|
| 155 | + private static function capitalizePercentEncoding(UriInterface $uri) : UriInterface |
|
| 156 | + { |
|
| 157 | + $regex = '/(?:%[A-Fa-f0-9]{2})++/'; |
|
| 158 | + $callback = function (array $match) : string { |
|
| 159 | + return \strtoupper($match[0]); |
|
| 160 | + }; |
|
| 161 | + return $uri->withPath(\preg_replace_callback($regex, $callback, $uri->getPath()))->withQuery(\preg_replace_callback($regex, $callback, $uri->getQuery())); |
|
| 162 | + } |
|
| 163 | + private static function decodeUnreservedCharacters(UriInterface $uri) : UriInterface |
|
| 164 | + { |
|
| 165 | + $regex = '/%(?:2D|2E|5F|7E|3[0-9]|[46][1-9A-F]|[57][0-9A])/i'; |
|
| 166 | + $callback = function (array $match) : string { |
|
| 167 | + return \rawurldecode($match[0]); |
|
| 168 | + }; |
|
| 169 | + return $uri->withPath(\preg_replace_callback($regex, $callback, $uri->getPath()))->withQuery(\preg_replace_callback($regex, $callback, $uri->getQuery())); |
|
| 170 | + } |
|
| 171 | + private function __construct() |
|
| 172 | + { |
|
| 173 | + // cannot be instantiated |
|
| 174 | + } |
|
| 175 | 175 | } |
@@ -1,6 +1,6 @@ discard block |
||
| 1 | 1 | <?php |
| 2 | 2 | |
| 3 | -declare (strict_types=1); |
|
| 3 | +declare(strict_types=1); |
|
| 4 | 4 | namespace OCA\FullTextSearch_Elasticsearch\Vendor\GuzzleHttp\Psr7; |
| 5 | 5 | |
| 6 | 6 | use OCA\FullTextSearch_Elasticsearch\Vendor\Psr\Http\Message\UriInterface; |
@@ -150,12 +150,12 @@ discard block |
||
| 150 | 150 | */ |
| 151 | 151 | public static function isEquivalent(UriInterface $uri1, UriInterface $uri2, int $normalizations = self::PRESERVING_NORMALIZATIONS) : bool |
| 152 | 152 | { |
| 153 | - return (string) self::normalize($uri1, $normalizations) === (string) self::normalize($uri2, $normalizations); |
|
| 153 | + return (string)self::normalize($uri1, $normalizations) === (string)self::normalize($uri2, $normalizations); |
|
| 154 | 154 | } |
| 155 | 155 | private static function capitalizePercentEncoding(UriInterface $uri) : UriInterface |
| 156 | 156 | { |
| 157 | 157 | $regex = '/(?:%[A-Fa-f0-9]{2})++/'; |
| 158 | - $callback = function (array $match) : string { |
|
| 158 | + $callback = function(array $match) : string { |
|
| 159 | 159 | return \strtoupper($match[0]); |
| 160 | 160 | }; |
| 161 | 161 | return $uri->withPath(\preg_replace_callback($regex, $callback, $uri->getPath()))->withQuery(\preg_replace_callback($regex, $callback, $uri->getQuery())); |
@@ -163,7 +163,7 @@ discard block |
||
| 163 | 163 | private static function decodeUnreservedCharacters(UriInterface $uri) : UriInterface |
| 164 | 164 | { |
| 165 | 165 | $regex = '/%(?:2D|2E|5F|7E|3[0-9]|[46][1-9A-F]|[57][0-9A])/i'; |
| 166 | - $callback = function (array $match) : string { |
|
| 166 | + $callback = function(array $match) : string { |
|
| 167 | 167 | return \rawurldecode($match[0]); |
| 168 | 168 | }; |
| 169 | 169 | return $uri->withPath(\preg_replace_callback($regex, $callback, $uri->getPath()))->withQuery(\preg_replace_callback($regex, $callback, $uri->getQuery())); |
@@ -11,8 +11,7 @@ |
||
| 11 | 11 | * |
| 12 | 12 | * @author Graham Campbell |
| 13 | 13 | */ |
| 14 | -final class UriComparator |
|
| 15 | -{ |
|
| 14 | +final class UriComparator { |
|
| 16 | 15 | /** |
| 17 | 16 | * Determines if a modified URL should be considered cross-origin with |
| 18 | 17 | * respect to an original URL. |
@@ -11,33 +11,33 @@ |
||
| 11 | 11 | */ |
| 12 | 12 | final class UriComparator |
| 13 | 13 | { |
| 14 | - /** |
|
| 15 | - * Determines if a modified URL should be considered cross-origin with |
|
| 16 | - * respect to an original URL. |
|
| 17 | - */ |
|
| 18 | - public static function isCrossOrigin(UriInterface $original, UriInterface $modified) : bool |
|
| 19 | - { |
|
| 20 | - if (\strcasecmp($original->getHost(), $modified->getHost()) !== 0) { |
|
| 21 | - return \true; |
|
| 22 | - } |
|
| 23 | - if ($original->getScheme() !== $modified->getScheme()) { |
|
| 24 | - return \true; |
|
| 25 | - } |
|
| 26 | - if (self::computePort($original) !== self::computePort($modified)) { |
|
| 27 | - return \true; |
|
| 28 | - } |
|
| 29 | - return \false; |
|
| 30 | - } |
|
| 31 | - private static function computePort(UriInterface $uri) : int |
|
| 32 | - { |
|
| 33 | - $port = $uri->getPort(); |
|
| 34 | - if (null !== $port) { |
|
| 35 | - return $port; |
|
| 36 | - } |
|
| 37 | - return 'https' === $uri->getScheme() ? 443 : 80; |
|
| 38 | - } |
|
| 39 | - private function __construct() |
|
| 40 | - { |
|
| 41 | - // cannot be instantiated |
|
| 42 | - } |
|
| 14 | + /** |
|
| 15 | + * Determines if a modified URL should be considered cross-origin with |
|
| 16 | + * respect to an original URL. |
|
| 17 | + */ |
|
| 18 | + public static function isCrossOrigin(UriInterface $original, UriInterface $modified) : bool |
|
| 19 | + { |
|
| 20 | + if (\strcasecmp($original->getHost(), $modified->getHost()) !== 0) { |
|
| 21 | + return \true; |
|
| 22 | + } |
|
| 23 | + if ($original->getScheme() !== $modified->getScheme()) { |
|
| 24 | + return \true; |
|
| 25 | + } |
|
| 26 | + if (self::computePort($original) !== self::computePort($modified)) { |
|
| 27 | + return \true; |
|
| 28 | + } |
|
| 29 | + return \false; |
|
| 30 | + } |
|
| 31 | + private static function computePort(UriInterface $uri) : int |
|
| 32 | + { |
|
| 33 | + $port = $uri->getPort(); |
|
| 34 | + if (null !== $port) { |
|
| 35 | + return $port; |
|
| 36 | + } |
|
| 37 | + return 'https' === $uri->getScheme() ? 443 : 80; |
|
| 38 | + } |
|
| 39 | + private function __construct() |
|
| 40 | + { |
|
| 41 | + // cannot be instantiated |
|
| 42 | + } |
|
| 43 | 43 | } |
@@ -1,6 +1,6 @@ |
||
| 1 | 1 | <?php |
| 2 | 2 | |
| 3 | -declare (strict_types=1); |
|
| 3 | +declare(strict_types=1); |
|
| 4 | 4 | namespace OCA\FullTextSearch_Elasticsearch\Vendor\GuzzleHttp\Psr7; |
| 5 | 5 | |
| 6 | 6 | use OCA\FullTextSearch_Elasticsearch\Vendor\Psr\Http\Message\UriInterface; |
@@ -13,8 +13,7 @@ |
||
| 13 | 13 | * |
| 14 | 14 | * @final |
| 15 | 15 | */ |
| 16 | -class RetryMiddleware |
|
| 17 | -{ |
|
| 16 | +class RetryMiddleware { |
|
| 18 | 17 | /** |
| 19 | 18 | * @var callable(RequestInterface, array): PromiseInterface |
| 20 | 19 | */ |
@@ -14,78 +14,78 @@ |
||
| 14 | 14 | */ |
| 15 | 15 | class RetryMiddleware |
| 16 | 16 | { |
| 17 | - /** |
|
| 18 | - * @var callable(RequestInterface, array): PromiseInterface |
|
| 19 | - */ |
|
| 20 | - private $nextHandler; |
|
| 21 | - /** |
|
| 22 | - * @var callable |
|
| 23 | - */ |
|
| 24 | - private $decider; |
|
| 25 | - /** |
|
| 26 | - * @var callable(int) |
|
| 27 | - */ |
|
| 28 | - private $delay; |
|
| 29 | - /** |
|
| 30 | - * @param callable $decider Function that accepts the number of retries, |
|
| 31 | - * a request, [response], and [exception] and |
|
| 32 | - * returns true if the request is to be |
|
| 33 | - * retried. |
|
| 34 | - * @param callable(RequestInterface, array): PromiseInterface $nextHandler Next handler to invoke. |
|
| 35 | - * @param (callable(int): int)|null $delay Function that accepts the number of retries |
|
| 36 | - * and returns the number of |
|
| 37 | - * milliseconds to delay. |
|
| 38 | - */ |
|
| 39 | - public function __construct(callable $decider, callable $nextHandler, callable $delay = null) |
|
| 40 | - { |
|
| 41 | - $this->decider = $decider; |
|
| 42 | - $this->nextHandler = $nextHandler; |
|
| 43 | - $this->delay = $delay ?: __CLASS__ . '::exponentialDelay'; |
|
| 44 | - } |
|
| 45 | - /** |
|
| 46 | - * Default exponential backoff delay function. |
|
| 47 | - * |
|
| 48 | - * @return int milliseconds. |
|
| 49 | - */ |
|
| 50 | - public static function exponentialDelay(int $retries) : int |
|
| 51 | - { |
|
| 52 | - return (int) 2 ** ($retries - 1) * 1000; |
|
| 53 | - } |
|
| 54 | - public function __invoke(RequestInterface $request, array $options) : PromiseInterface |
|
| 55 | - { |
|
| 56 | - if (!isset($options['retries'])) { |
|
| 57 | - $options['retries'] = 0; |
|
| 58 | - } |
|
| 59 | - $fn = $this->nextHandler; |
|
| 60 | - return $fn($request, $options)->then($this->onFulfilled($request, $options), $this->onRejected($request, $options)); |
|
| 61 | - } |
|
| 62 | - /** |
|
| 63 | - * Execute fulfilled closure |
|
| 64 | - */ |
|
| 65 | - private function onFulfilled(RequestInterface $request, array $options) : callable |
|
| 66 | - { |
|
| 67 | - return function ($value) use($request, $options) { |
|
| 68 | - if (!($this->decider)($options['retries'], $request, $value, null)) { |
|
| 69 | - return $value; |
|
| 70 | - } |
|
| 71 | - return $this->doRetry($request, $options, $value); |
|
| 72 | - }; |
|
| 73 | - } |
|
| 74 | - /** |
|
| 75 | - * Execute rejected closure |
|
| 76 | - */ |
|
| 77 | - private function onRejected(RequestInterface $req, array $options) : callable |
|
| 78 | - { |
|
| 79 | - return function ($reason) use($req, $options) { |
|
| 80 | - if (!($this->decider)($options['retries'], $req, null, $reason)) { |
|
| 81 | - return P\Create::rejectionFor($reason); |
|
| 82 | - } |
|
| 83 | - return $this->doRetry($req, $options); |
|
| 84 | - }; |
|
| 85 | - } |
|
| 86 | - private function doRetry(RequestInterface $request, array $options, ResponseInterface $response = null) : PromiseInterface |
|
| 87 | - { |
|
| 88 | - $options['delay'] = ($this->delay)(++$options['retries'], $response, $request); |
|
| 89 | - return $this($request, $options); |
|
| 90 | - } |
|
| 17 | + /** |
|
| 18 | + * @var callable(RequestInterface, array): PromiseInterface |
|
| 19 | + */ |
|
| 20 | + private $nextHandler; |
|
| 21 | + /** |
|
| 22 | + * @var callable |
|
| 23 | + */ |
|
| 24 | + private $decider; |
|
| 25 | + /** |
|
| 26 | + * @var callable(int) |
|
| 27 | + */ |
|
| 28 | + private $delay; |
|
| 29 | + /** |
|
| 30 | + * @param callable $decider Function that accepts the number of retries, |
|
| 31 | + * a request, [response], and [exception] and |
|
| 32 | + * returns true if the request is to be |
|
| 33 | + * retried. |
|
| 34 | + * @param callable(RequestInterface, array): PromiseInterface $nextHandler Next handler to invoke. |
|
| 35 | + * @param (callable(int): int)|null $delay Function that accepts the number of retries |
|
| 36 | + * and returns the number of |
|
| 37 | + * milliseconds to delay. |
|
| 38 | + */ |
|
| 39 | + public function __construct(callable $decider, callable $nextHandler, callable $delay = null) |
|
| 40 | + { |
|
| 41 | + $this->decider = $decider; |
|
| 42 | + $this->nextHandler = $nextHandler; |
|
| 43 | + $this->delay = $delay ?: __CLASS__ . '::exponentialDelay'; |
|
| 44 | + } |
|
| 45 | + /** |
|
| 46 | + * Default exponential backoff delay function. |
|
| 47 | + * |
|
| 48 | + * @return int milliseconds. |
|
| 49 | + */ |
|
| 50 | + public static function exponentialDelay(int $retries) : int |
|
| 51 | + { |
|
| 52 | + return (int) 2 ** ($retries - 1) * 1000; |
|
| 53 | + } |
|
| 54 | + public function __invoke(RequestInterface $request, array $options) : PromiseInterface |
|
| 55 | + { |
|
| 56 | + if (!isset($options['retries'])) { |
|
| 57 | + $options['retries'] = 0; |
|
| 58 | + } |
|
| 59 | + $fn = $this->nextHandler; |
|
| 60 | + return $fn($request, $options)->then($this->onFulfilled($request, $options), $this->onRejected($request, $options)); |
|
| 61 | + } |
|
| 62 | + /** |
|
| 63 | + * Execute fulfilled closure |
|
| 64 | + */ |
|
| 65 | + private function onFulfilled(RequestInterface $request, array $options) : callable |
|
| 66 | + { |
|
| 67 | + return function ($value) use($request, $options) { |
|
| 68 | + if (!($this->decider)($options['retries'], $request, $value, null)) { |
|
| 69 | + return $value; |
|
| 70 | + } |
|
| 71 | + return $this->doRetry($request, $options, $value); |
|
| 72 | + }; |
|
| 73 | + } |
|
| 74 | + /** |
|
| 75 | + * Execute rejected closure |
|
| 76 | + */ |
|
| 77 | + private function onRejected(RequestInterface $req, array $options) : callable |
|
| 78 | + { |
|
| 79 | + return function ($reason) use($req, $options) { |
|
| 80 | + if (!($this->decider)($options['retries'], $req, null, $reason)) { |
|
| 81 | + return P\Create::rejectionFor($reason); |
|
| 82 | + } |
|
| 83 | + return $this->doRetry($req, $options); |
|
| 84 | + }; |
|
| 85 | + } |
|
| 86 | + private function doRetry(RequestInterface $request, array $options, ResponseInterface $response = null) : PromiseInterface |
|
| 87 | + { |
|
| 88 | + $options['delay'] = ($this->delay)(++$options['retries'], $response, $request); |
|
| 89 | + return $this($request, $options); |
|
| 90 | + } |
|
| 91 | 91 | } |
@@ -40,7 +40,7 @@ discard block |
||
| 40 | 40 | { |
| 41 | 41 | $this->decider = $decider; |
| 42 | 42 | $this->nextHandler = $nextHandler; |
| 43 | - $this->delay = $delay ?: __CLASS__ . '::exponentialDelay'; |
|
| 43 | + $this->delay = $delay ?: __CLASS__.'::exponentialDelay'; |
|
| 44 | 44 | } |
| 45 | 45 | /** |
| 46 | 46 | * Default exponential backoff delay function. |
@@ -49,7 +49,7 @@ discard block |
||
| 49 | 49 | */ |
| 50 | 50 | public static function exponentialDelay(int $retries) : int |
| 51 | 51 | { |
| 52 | - return (int) 2 ** ($retries - 1) * 1000; |
|
| 52 | + return (int)2 ** ($retries - 1) * 1000; |
|
| 53 | 53 | } |
| 54 | 54 | public function __invoke(RequestInterface $request, array $options) : PromiseInterface |
| 55 | 55 | { |
@@ -64,7 +64,7 @@ discard block |
||
| 64 | 64 | */ |
| 65 | 65 | private function onFulfilled(RequestInterface $request, array $options) : callable |
| 66 | 66 | { |
| 67 | - return function ($value) use($request, $options) { |
|
| 67 | + return function($value) use($request, $options) { |
|
| 68 | 68 | if (!($this->decider)($options['retries'], $request, $value, null)) { |
| 69 | 69 | return $value; |
| 70 | 70 | } |
@@ -76,7 +76,7 @@ discard block |
||
| 76 | 76 | */ |
| 77 | 77 | private function onRejected(RequestInterface $req, array $options) : callable |
| 78 | 78 | { |
| 79 | - return function ($reason) use($req, $options) { |
|
| 79 | + return function($reason) use($req, $options) { |
|
| 80 | 80 | if (!($this->decider)($options['retries'], $req, null, $reason)) { |
| 81 | 81 | return P\Create::rejectionFor($reason); |
| 82 | 82 | } |
@@ -5,8 +5,7 @@ |
||
| 5 | 5 | use OCA\FullTextSearch_Elasticsearch\Vendor\Psr\Http\Message\RequestInterface; |
| 6 | 6 | use OCA\FullTextSearch_Elasticsearch\Vendor\Psr\Http\Message\ResponseInterface; |
| 7 | 7 | |
| 8 | -interface MessageFormatterInterface |
|
| 9 | -{ |
|
| 8 | +interface MessageFormatterInterface { |
|
| 10 | 9 | /** |
| 11 | 10 | * Returns a formatted message string. |
| 12 | 11 | * |
@@ -6,12 +6,12 @@ |
||
| 6 | 6 | use OCA\FullTextSearch_Elasticsearch\Vendor\Psr\Http\Message\ResponseInterface; |
| 7 | 7 | interface MessageFormatterInterface |
| 8 | 8 | { |
| 9 | - /** |
|
| 10 | - * Returns a formatted message string. |
|
| 11 | - * |
|
| 12 | - * @param RequestInterface $request Request that was sent |
|
| 13 | - * @param ResponseInterface|null $response Response that was received |
|
| 14 | - * @param \Throwable|null $error Exception that was received |
|
| 15 | - */ |
|
| 16 | - public function format(RequestInterface $request, ResponseInterface $response = null, \Throwable $error = null) : string; |
|
| 9 | + /** |
|
| 10 | + * Returns a formatted message string. |
|
| 11 | + * |
|
| 12 | + * @param RequestInterface $request Request that was sent |
|
| 13 | + * @param ResponseInterface|null $response Response that was received |
|
| 14 | + * @param \Throwable|null $error Exception that was received |
|
| 15 | + */ |
|
| 16 | + public function format(RequestInterface $request, ResponseInterface $response = null, \Throwable $error = null) : string; |
|
| 17 | 17 | } |