"erusev/parsedown": "^1.7.4",
"ezyang/htmlpurifier": "^4.16",
"guzzlehttp/guzzle": "^7.7.0",
- "guzzlehttp/psr7": "^2.5.0",
+ "guzzlehttp/psr7": "^2.6.0",
"laminas/laminas-diactoros": "^3.1.0",
"laminas/laminas-httphandlerrunner": "^2.7.0",
"laminas/laminas-progressbar": "^2.12",
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
- "content-hash": "f22e1ed8363f1981362682c58a866a8a",
+ "content-hash": "d94553c231572f020140e0c1ed535635",
"packages": [
{
"name": "cuyz/valinor",
},
{
"name": "guzzlehttp/promises",
- "version": "2.0.0",
+ "version": "2.0.1",
"source": {
"type": "git",
"url": "https://github.com/guzzle/promises.git",
- "reference": "3a494dc7dc1d7d12e511890177ae2d0e6c107da6"
+ "reference": "111166291a0f8130081195ac4556a5587d7f1b5d"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/guzzle/promises/zipball/3a494dc7dc1d7d12e511890177ae2d0e6c107da6",
- "reference": "3a494dc7dc1d7d12e511890177ae2d0e6c107da6",
+ "url": "https://api.github.com/repos/guzzle/promises/zipball/111166291a0f8130081195ac4556a5587d7f1b5d",
+ "reference": "111166291a0f8130081195ac4556a5587d7f1b5d",
"shasum": ""
},
"require": {
],
"support": {
"issues": "https://github.com/guzzle/promises/issues",
- "source": "https://github.com/guzzle/promises/tree/2.0.0"
+ "source": "https://github.com/guzzle/promises/tree/2.0.1"
},
"funding": [
{
"type": "tidelift"
}
],
- "time": "2023-05-21T13:50:22+00:00"
+ "time": "2023-08-03T15:11:55+00:00"
},
{
"name": "guzzlehttp/psr7",
- "version": "2.5.0",
+ "version": "2.6.0",
"source": {
"type": "git",
"url": "https://github.com/guzzle/psr7.git",
- "reference": "b635f279edd83fc275f822a1188157ffea568ff6"
+ "reference": "8bd7c33a0734ae1c5d074360512beb716bef3f77"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/guzzle/psr7/zipball/b635f279edd83fc275f822a1188157ffea568ff6",
- "reference": "b635f279edd83fc275f822a1188157ffea568ff6",
+ "url": "https://api.github.com/repos/guzzle/psr7/zipball/8bd7c33a0734ae1c5d074360512beb716bef3f77",
+ "reference": "8bd7c33a0734ae1c5d074360512beb716bef3f77",
"shasum": ""
},
"require": {
],
"support": {
"issues": "https://github.com/guzzle/psr7/issues",
- "source": "https://github.com/guzzle/psr7/tree/2.5.0"
+ "source": "https://github.com/guzzle/psr7/tree/2.6.0"
},
"funding": [
{
"type": "tidelift"
}
],
- "time": "2023-04-17T16:11:26+00:00"
+ "time": "2023-08-03T15:06:02+00:00"
},
{
"name": "laminas/laminas-diactoros",
},
{
"name": "guzzlehttp/promises",
- "version": "2.0.0",
- "version_normalized": "2.0.0.0",
+ "version": "2.0.1",
+ "version_normalized": "2.0.1.0",
"source": {
"type": "git",
"url": "https://github.com/guzzle/promises.git",
- "reference": "3a494dc7dc1d7d12e511890177ae2d0e6c107da6"
+ "reference": "111166291a0f8130081195ac4556a5587d7f1b5d"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/guzzle/promises/zipball/3a494dc7dc1d7d12e511890177ae2d0e6c107da6",
- "reference": "3a494dc7dc1d7d12e511890177ae2d0e6c107da6",
+ "url": "https://api.github.com/repos/guzzle/promises/zipball/111166291a0f8130081195ac4556a5587d7f1b5d",
+ "reference": "111166291a0f8130081195ac4556a5587d7f1b5d",
"shasum": ""
},
"require": {
"bamarni/composer-bin-plugin": "^1.8.1",
"phpunit/phpunit": "^8.5.29 || ^9.5.23"
},
- "time": "2023-05-21T13:50:22+00:00",
+ "time": "2023-08-03T15:11:55+00:00",
"type": "library",
"extra": {
"bamarni-bin": {
],
"support": {
"issues": "https://github.com/guzzle/promises/issues",
- "source": "https://github.com/guzzle/promises/tree/2.0.0"
+ "source": "https://github.com/guzzle/promises/tree/2.0.1"
},
"funding": [
{
},
{
"name": "guzzlehttp/psr7",
- "version": "2.5.0",
- "version_normalized": "2.5.0.0",
+ "version": "2.6.0",
+ "version_normalized": "2.6.0.0",
"source": {
"type": "git",
"url": "https://github.com/guzzle/psr7.git",
- "reference": "b635f279edd83fc275f822a1188157ffea568ff6"
+ "reference": "8bd7c33a0734ae1c5d074360512beb716bef3f77"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/guzzle/psr7/zipball/b635f279edd83fc275f822a1188157ffea568ff6",
- "reference": "b635f279edd83fc275f822a1188157ffea568ff6",
+ "url": "https://api.github.com/repos/guzzle/psr7/zipball/8bd7c33a0734ae1c5d074360512beb716bef3f77",
+ "reference": "8bd7c33a0734ae1c5d074360512beb716bef3f77",
"shasum": ""
},
"require": {
"suggest": {
"laminas/laminas-httphandlerrunner": "Emit PSR-7 responses"
},
- "time": "2023-04-17T16:11:26+00:00",
+ "time": "2023-08-03T15:06:02+00:00",
"type": "library",
"extra": {
"bamarni-bin": {
],
"support": {
"issues": "https://github.com/guzzle/psr7/issues",
- "source": "https://github.com/guzzle/psr7/tree/2.5.0"
+ "source": "https://github.com/guzzle/psr7/tree/2.6.0"
},
"funding": [
{
'dev_requirement' => false,
),
'guzzlehttp/promises' => array(
- 'pretty_version' => '2.0.0',
- 'version' => '2.0.0.0',
- 'reference' => '3a494dc7dc1d7d12e511890177ae2d0e6c107da6',
+ 'pretty_version' => '2.0.1',
+ 'version' => '2.0.1.0',
+ 'reference' => '111166291a0f8130081195ac4556a5587d7f1b5d',
'type' => 'library',
'install_path' => __DIR__ . '/../guzzlehttp/promises',
'aliases' => array(),
'dev_requirement' => false,
),
'guzzlehttp/psr7' => array(
- 'pretty_version' => '2.5.0',
- 'version' => '2.5.0.0',
- 'reference' => 'b635f279edd83fc275f822a1188157ffea568ff6',
+ 'pretty_version' => '2.6.0',
+ 'version' => '2.6.0.0',
+ 'reference' => '8bd7c33a0734ae1c5d074360512beb716bef3f77',
'type' => 'library',
'install_path' => __DIR__ . '/../guzzlehttp/psr7',
'aliases' => array(),
'psr/http-factory-implementation' => array(
'dev_requirement' => false,
'provided' => array(
- 0 => '1.0',
- 1 => '^1.1 || ^2.0',
+ 0 => '^1.1 || ^2.0',
+ 1 => '1.0',
),
),
'psr/http-message' => array(
'psr/http-message-implementation' => array(
'dev_requirement' => false,
'provided' => array(
- 0 => '1.0',
- 1 => '^1.1 || ^2.0',
+ 0 => '^1.1 || ^2.0',
+ 1 => '1.0',
),
),
'psr/http-server-handler' => array(
# CHANGELOG
-## 2.0.0 - TBC
+## 2.0.1 - 2023-08-03
+
+### Changed
+
+- PHP 8.3 support
+
+
+## 2.0.0 - 2023-05-21
### Added
| Version | Status | PHP Version |
|---------|------------------------|--------------|
| 1.x | Bug and security fixes | >=5.5,<8.3 |
-| 2.x | Latest | >=7.2.5,<8.3 |
+| 2.x | Latest | >=7.2.5,<8.4 |
## Quick Start
* @param mixed $reason Rejection reason.
* @param string|null $description Optional description.
*/
- public function __construct($reason, $description = null)
+ public function __construct($reason, ?string $description = null)
{
$this->reason = $reason;
+++ /dev/null
-{
- "require": {
- "php": "^7.4 || ^8.0",
- "friendsofphp/php-cs-fixer": "3.16.0"
- },
- "config": {
- "preferred-install": "dist"
- }
-}
+++ /dev/null
-{
- "require": {
- "php": "^7.4 || ^8.0",
- "phpstan/phpstan": "1.10.11",
- "phpstan/phpstan-deprecation-rules": "1.1.3"
- },
- "config": {
- "preferred-install": "dist"
- }
-}
+++ /dev/null
-{
- "require": {
- "php": "^7.4 || ^8.0",
- "psalm/phar": "5.9.0"
- },
- "config": {
- "preferred-install": "dist"
- }
-}
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
-## Unreleased
+## 2.6.0 - 2023-08-03
+
+### Changed
+
+- Updated the mime type map to add some new entries, fix a couple of invalid entries, and remove an invalid entry
+- Fallback to `application/octet-stream` if we are unable to guess the content type for a multipart file upload
+
+## 2.5.1 - 2023-08-03
+
+### Fixed
+
+- Corrected mime type for `.acc` files to `audio/aac`
+
+### Changed
+
+- PHP 8.3 support
## 2.5.0 - 2023-04-17
![Static analysis](https://github.com/guzzle/psr7/workflows/Static%20analysis/badge.svg)
-# Installation
+## Features
+
+This package comes with a number of stream implementations and stream
+decorators.
+
+
+## Installation
```shell
composer require guzzlehttp/psr7
```
-# Stream implementation
+## Version Guidance
-This package comes with a number of stream implementations and stream
-decorators.
+| Version | Status | PHP Version |
+|---------|---------------------|--------------|
+| 1.x | Security fixes only | >=5.4,<8.1 |
+| 2.x | Latest | >=7.2.5,<8.4 |
## AppendStream
equivalence or difference of relative references does not mean anything.
-## Version Guidance
-
-| Version | Status | PHP Version |
-|---------|----------------|------------------|
-| 1.x | Security fixes | >=5.4,<8.1 |
-| 2.x | Latest | ^7.2.5 \|\| ^8.0 |
-
-
## Security
If you discover a security vulnerability within this package, please send an email to security@tidelift.com. All security vulnerabilities will be promptly addressed. Please do not disclose security-related issues publicly until a fix has been announced. Please see [Security Policy](https://github.com/guzzle/psr7/security/policy) for more information.
{
try {
$this->rewind();
+
return $this->getContents();
} catch (\Throwable $e) {
if (\PHP_VERSION_ID >= 70400) {
throw $e;
}
trigger_error(sprintf('%s::__toString exception: %s', self::class, (string) $e), E_USER_ERROR);
+
return '';
}
}
$stream->rewind();
} catch (\Exception $e) {
throw new \RuntimeException('Unable to seek stream '
- . $i . ' of the AppendStream', 0, $e);
+ .$i.' of the AppendStream', 0, $e);
}
}
if ($this->current === $total) {
break;
}
- $this->current++;
+ ++$this->current;
}
$result = $this->streams[$this->current]->read($remaining);
private const SLOTS = [
'__toString', 'close', 'detach', 'rewind',
'getSize', 'tell', 'eof', 'isSeekable', 'seek', 'isWritable', 'write',
- 'isReadable', 'read', 'getContents', 'getMetadata'
+ 'isReadable', 'read', 'getContents', 'getMetadata',
];
/** @var array<string, callable> */
// Create the functions on the class
foreach ($methods as $name => $fn) {
- $this->{'_fn_' . $name} = $fn;
+ $this->{'_fn_'.$name} = $fn;
}
}
public function __get(string $name): void
{
throw new \BadMethodCallException(str_replace('_fn_', '', $name)
- . '() is not implemented in the FnStream');
+ .'() is not implemented in the FnStream');
}
/**
throw $e;
}
trigger_error(sprintf('%s::__toString exception: %s', self::class, (string) $e), E_USER_ERROR);
+
return '';
}
}
$v = '';
$isQuoted = false;
$isEscaped = false;
- for ($i = 0, $max = \strlen($value); $i < $max; $i++) {
+ for ($i = 0, $max = \strlen($value); $i < $max; ++$i) {
if ($isEscaped) {
$v .= $value[$i];
$isEscaped = false;
* Note: in consuming code it is recommended to require the implemented interfaces
* and inject the instance of this class multiple times.
*/
-final class HttpFactory implements
- RequestFactoryInterface,
- ResponseFactoryInterface,
- ServerRequestFactoryInterface,
- StreamFactoryInterface,
- UploadedFileFactoryInterface,
- UriFactoryInterface
+final class HttpFactory implements RequestFactoryInterface, ResponseFactoryInterface, ServerRequestFactoryInterface, StreamFactoryInterface, UploadedFileFactoryInterface, UriFactoryInterface
{
public function createUploadedFile(
StreamInterface $stream,
* then appends the zlib.inflate filter. The stream is then converted back
* to a Guzzle stream resource to be used as a Guzzle stream.
*
- * @link http://tools.ietf.org/html/rfc1950
- * @link http://tools.ietf.org/html/rfc1952
- * @link http://php.net/manual/en/filters.compression.php
+ * @see http://tools.ietf.org/html/rfc1950
+ * @see http://tools.ietf.org/html/rfc1952
+ * @see http://php.net/manual/en/filters.compression.php
*/
final class InflateStream implements StreamInterface
{
public static function toString(MessageInterface $message): string
{
if ($message instanceof RequestInterface) {
- $msg = trim($message->getMethod() . ' '
- . $message->getRequestTarget())
- . ' HTTP/' . $message->getProtocolVersion();
+ $msg = trim($message->getMethod().' '
+ .$message->getRequestTarget())
+ .' HTTP/'.$message->getProtocolVersion();
if (!$message->hasHeader('host')) {
- $msg .= "\r\nHost: " . $message->getUri()->getHost();
+ $msg .= "\r\nHost: ".$message->getUri()->getHost();
}
} elseif ($message instanceof ResponseInterface) {
- $msg = 'HTTP/' . $message->getProtocolVersion() . ' '
- . $message->getStatusCode() . ' '
- . $message->getReasonPhrase();
+ $msg = 'HTTP/'.$message->getProtocolVersion().' '
+ .$message->getStatusCode().' '
+ .$message->getReasonPhrase();
} else {
throw new \InvalidArgumentException('Unknown message type');
}
foreach ($message->getHeaders() as $name => $values) {
if (strtolower($name) === 'set-cookie') {
foreach ($values as $value) {
- $msg .= "\r\n{$name}: " . $value;
+ $msg .= "\r\n{$name}: ".$value;
}
} else {
- $msg .= "\r\n{$name}: " . implode(', ', $values);
+ $msg .= "\r\n{$name}: ".implode(', ', $values);
}
}
- return "{$msg}\r\n\r\n" . $message->getBody();
+ return "{$msg}\r\n\r\n".$message->getBody();
}
/**
$host = $headers[reset($hostKey)][0];
$scheme = substr($host, -4) === ':443' ? 'https' : 'http';
- return $scheme . '://' . $host . '/' . ltrim($path, '/');
+ return $scheme.'://'.$host.'/'.ltrim($path, '/');
}
/**
// between status-code and reason-phrase is required. But browsers accept
// responses without space and reason as well.
if (!preg_match('/^HTTP\/.* [0-9]{3}( .*|$)/', $data['start-line'])) {
- throw new \InvalidArgumentException('Invalid response string: ' . $data['start-line']);
+ throw new \InvalidArgumentException('Invalid response string: '.$data['start-line']);
}
$parts = explode(' ', $data['start-line'], 3);
private $headers = [];
/** @var array<string, string> Map of lowercase header name => original name at registration */
- private $headerNames = [];
+ private $headerNames = [];
/** @var string */
private $protocol = '1.1';
$new = clone $this;
$new->protocol = $version;
+
return $new;
}
$new = clone $this;
$new->stream = $body;
+
return $new;
}
));
}
- if (! preg_match('/^[a-zA-Z0-9\'`#$%&*+.^_|~!-]+$/D', $header)) {
+ if (!preg_match('/^[a-zA-Z0-9\'`#$%&*+.^_|~!-]+$/D', $header)) {
throw new \InvalidArgumentException(
sprintf('"%s" is not valid header name.', $header)
);
// Clients must not send a request with line folding and a server sending folded headers is
// likely very rare. Line folding is a fairly obscure feature of HTTP/1.1 and thus not accepting
// folding is not likely to break any legitimate use case.
- if (! preg_match('/^[\x20\x09\x21-\x7E\x80-\xFF]*$/D', $value)) {
+ if (!preg_match('/^[\x20\x09\x21-\x7E\x80-\xFF]*$/D', $value)) {
throw new \InvalidArgumentException(
sprintf('"%s" is not valid header value.', $value)
);
'7zip' => 'application/x-7z-compressed',
'123' => 'application/vnd.lotus-1-2-3',
'aab' => 'application/x-authorware-bin',
- 'aac' => 'audio/x-acc',
+ 'aac' => 'audio/aac',
'aam' => 'application/x-authorware-map',
'aas' => 'application/x-authorware-seg',
'abw' => 'application/x-abiword',
'acu' => 'application/vnd.acucobol',
'acutc' => 'application/vnd.acucorp',
'adp' => 'audio/adpcm',
+ 'adts' => 'audio/aac',
'aep' => 'application/vnd.audiograph',
'afm' => 'application/x-font-type1',
'afp' => 'application/vnd.ibm.modcap',
'air' => 'application/vnd.adobe.air-application-installer-package+zip',
'ait' => 'application/vnd.dvb.ait',
'ami' => 'application/vnd.amiga.ami',
+ 'aml' => 'application/automationml-aml+xml',
+ 'amlx' => 'application/automationml-amlx+zip',
'amr' => 'audio/amr',
'apk' => 'application/vnd.android.package-archive',
'apng' => 'image/apng',
'appcache' => 'text/cache-manifest',
+ 'appinstaller' => 'application/appinstaller',
'application' => 'application/x-ms-application',
+ 'appx' => 'application/appx',
+ 'appxbundle' => 'application/appxbundle',
'apr' => 'application/vnd.lotus-approach',
'arc' => 'application/x-freearc',
'arj' => 'application/x-arj',
'bpk' => 'application/octet-stream',
'bpmn' => 'application/octet-stream',
'bsp' => 'model/vnd.valve.source.compiled-map',
+ 'btf' => 'image/prs.btif',
'btif' => 'image/prs.btif',
'buffer' => 'application/octet-stream',
'bz' => 'application/x-bzip',
'cjs' => 'application/node',
'cla' => 'application/vnd.claymore',
'class' => 'application/octet-stream',
+ 'cld' => 'model/vnd.cld',
'clkk' => 'application/vnd.crick.clicker.keyboard',
'clkp' => 'application/vnd.crick.clicker.palette',
'clkt' => 'application/vnd.crick.clicker.template',
'csv' => 'text/csv',
'cu' => 'application/cu-seeme',
'curl' => 'text/vnd.curl',
+ 'cwl' => 'application/cwl',
'cww' => 'application/prs.cww',
'cxt' => 'application/x-director',
'cxx' => 'text/x-c',
'der' => 'application/x-x509-ca-cert',
'dfac' => 'application/vnd.dreamfactory',
'dgc' => 'application/x-dgc-compressed',
+ 'dib' => 'image/bmp',
'dic' => 'text/x-c',
'dir' => 'application/x-director',
'dis' => 'application/vnd.mobius.dis',
'dotx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template',
'dp' => 'application/vnd.osgi.dp',
'dpg' => 'application/vnd.dpgraph',
+ 'dpx' => 'image/dpx',
'dra' => 'audio/vnd.dra',
'drle' => 'image/dicom-rle',
'dsc' => 'text/prs.lines.tag',
'eot' => 'application/vnd.ms-fontobject',
'eps' => 'application/postscript',
'epub' => 'application/epub+zip',
- 'es' => 'application/ecmascript',
'es3' => 'application/vnd.eszigno3+xml',
'esa' => 'application/vnd.osgi.subsystem',
'esf' => 'application/vnd.epson.esf',
'jsonld' => 'application/ld+json',
'jsonml' => 'application/jsonml+json',
'jsx' => 'text/jsx',
+ 'jt' => 'model/jt',
'jxr' => 'image/jxr',
'jxra' => 'image/jxra',
'jxrs' => 'image/jxrs',
'mime' => 'message/rfc822',
'mj2' => 'video/mj2',
'mjp2' => 'video/mj2',
- 'mjs' => 'application/javascript',
+ 'mjs' => 'text/javascript',
'mk3d' => 'video/x-matroska',
'mka' => 'audio/x-matroska',
'mkd' => 'text/x-markdown',
'msg' => 'application/vnd.ms-outlook',
'msh' => 'model/mesh',
'msi' => 'application/x-msdownload',
+ 'msix' => 'application/msix',
+ 'msixbundle' => 'application/msixbundle',
'msl' => 'application/vnd.mobius.msl',
'msm' => 'application/octet-stream',
'msp' => 'application/octet-stream',
'pvb' => 'application/vnd.3gpp.pic-bw-var',
'pwn' => 'application/vnd.3m.post-it-notes',
'pya' => 'audio/vnd.ms-playready.media.pya',
+ 'pyo' => 'model/vnd.pytha.pyox',
+ 'pyox' => 'model/vnd.pytha.pyox',
'pyv' => 'video/vnd.ms-playready.media.pyv',
'qam' => 'application/vnd.epson.quickanime',
'qbo' => 'application/vnd.intu.qbo',
'st' => 'application/vnd.sailingtracker.track',
'stc' => 'application/vnd.sun.xml.calc.template',
'std' => 'application/vnd.sun.xml.draw.template',
+ 'step' => 'application/STEP',
'stf' => 'application/vnd.wt.stf',
'sti' => 'application/vnd.sun.xml.impress.template',
'stk' => 'application/hyperstudio',
'stl' => 'model/stl',
+ 'stp' => 'application/STEP',
'stpx' => 'model/step+xml',
'stpxz' => 'model/step-xml+zip',
'stpz' => 'model/step+zip',
'ulx' => 'application/x-glulx',
'umj' => 'application/vnd.umajin',
'unityweb' => 'application/vnd.unity',
+ 'uo' => 'application/vnd.uoml+xml',
'uoml' => 'application/vnd.uoml+xml',
'uri' => 'text/uri-list',
'uris' => 'text/uri-list',
'urls' => 'text/uri-list',
+ 'usda' => 'model/vnd.usda',
'usdz' => 'model/vnd.usdz+zip',
'ustar' => 'application/x-ustar',
'utz' => 'application/vnd.uiq.theme',
'webmanifest' => 'application/manifest+json',
'webp' => 'image/webp',
'wg' => 'application/vnd.pmi.widget',
+ 'wgsl' => 'text/wgsl',
'wgt' => 'application/widget',
'wif' => 'application/watcherinfo+xml',
'wks' => 'application/vnd.ms-works',
'xel' => 'application/xcap-el+xml',
'xenc' => 'application/xenc+xml',
'xer' => 'application/patch-ops-error+xml',
- 'xfdf' => 'application/vnd.adobe.xfdf',
+ 'xfdf' => 'application/xfdf',
'xfdl' => 'application/vnd.xfdl',
'xht' => 'application/xhtml+xml',
+ 'xhtm' => 'application/vnd.pwg-xhtml-print+xml',
'xhtml' => 'application/xhtml+xml',
'xhvml' => 'application/xv+xml',
'xif' => 'image/vnd.xiff',
'xpw' => 'application/vnd.intercon.formnet',
'xpx' => 'application/vnd.intercon.formnet',
'xsd' => 'application/xml',
+ 'xsf' => 'application/prs.xsf+xml',
'xsl' => 'application/xml',
'xslt' => 'application/xslt+xml',
'xsm' => 'application/vnd.syncml+xml',
/**
* Determines the mimetype of a file by looking at its extension.
*
- * @link https://raw.githubusercontent.com/jshttp/mime-db/master/db.json
+ * @see https://raw.githubusercontent.com/jshttp/mime-db/master/db.json
*/
public static function fromFilename(string $filename): ?string
{
/**
* Maps a file extensions to a mimetype.
*
- * @link https://raw.githubusercontent.com/jshttp/mime-db/master/db.json
+ * @see https://raw.githubusercontent.com/jshttp/mime-db/master/db.json
*/
public static function fromExtension(string $extension): ?string
{
$str .= "{$key}: {$value}\r\n";
}
- return "--{$this->boundary}\r\n" . trim($str) . "\r\n\r\n";
+ return "--{$this->boundary}\r\n".trim($str)."\r\n\r\n";
}
/**
foreach ($elements as $element) {
if (!is_array($element)) {
- throw new \UnexpectedValueException("An array is expected");
+ throw new \UnexpectedValueException('An array is expected');
}
$this->addElement($stream, $element);
}
// Set a default Content-Type if one was not supplied
$type = $this->getHeader($headers, 'content-type');
if (!$type && ($filename === '0' || $filename)) {
- if ($type = MimeType::fromFilename($filename)) {
- $headers['Content-Type'] = $type;
- }
+ $headers['Content-Type'] = MimeType::fromFilename($filename) ?? 'application/octet-stream';
}
return [$stream, $headers];
throw $e;
}
trigger_error(sprintf('%s::__toString exception: %s', self::class, (string) $e), E_USER_ERROR);
+
return '';
}
}
$data = call_user_func($this->source, $length);
if ($data === false || $data === null) {
$this->source = null;
+
return;
}
$this->buffer->write($data);
$qs .= $k;
$v = is_bool($v) ? (int) $v : $v;
if ($v !== null) {
- $qs .= '=' . $encoder((string) $v);
+ $qs .= '='.$encoder((string) $v);
}
$qs .= '&';
} else {
$qs .= $k;
$vv = is_bool($vv) ? (int) $vv : $vv;
if ($vv !== null) {
- $qs .= '=' . $encoder((string) $vv);
+ $qs .= '='.$encoder((string) $vv);
}
$qs .= '&';
}
$target = '/';
}
if ($this->uri->getQuery() != '') {
- $target .= '?' . $this->uri->getQuery();
+ $target .= '?'.$this->uri->getQuery();
}
return $target;
$new = clone $this;
$new->requestTarget = $requestTarget;
+
return $new;
}
$this->assertMethod($method);
$new = clone $this;
$new->method = strtoupper($method);
+
return $new;
}
}
if (($port = $this->uri->getPort()) !== null) {
- $host .= ':' . $port;
+ $host .= ':'.$port;
}
if (isset($this->headerNames['host'])) {
$reasonPhrase = self::PHRASES[$new->statusCode];
}
$new->reasonPhrase = (string) $reasonPhrase;
+
return $new;
}
*
* Note: header delimiter (\r\n) is modified to \r?\n to accept line feed only delimiters for BC reasons.
*
- * @link https://github.com/amphp/http/blob/v1.0.1/src/Rfc7230.php#L12-L15
+ * @see https://github.com/amphp/http/blob/v1.0.1/src/Rfc7230.php#L12-L15
*
* @license https://github.com/amphp/http/blob/v1.0.1/LICENSE
*/
foreach (array_keys($files['tmp_name']) as $key) {
$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,
+ 'size' => $files['size'][$key] ?? null,
+ 'error' => $files['error'][$key] ?? null,
+ 'name' => $files['name'][$key] ?? null,
+ 'type' => $files['type'][$key] ?? null,
];
$normalizedFiles[$key] = self::createUploadedFileFromSpec($spec);
}
private static function extractHostAndPortFromAuthority(string $authority): array
{
- $uri = 'http://' . $authority;
+ $uri = 'http://'.$authority;
$parts = parse_url($uri);
if (false === $parts) {
return [null, null];
$this->stream = $stream;
$meta = stream_get_meta_data($this->stream);
$this->seekable = $meta['seekable'];
- $this->readable = (bool)preg_match(self::READABLE_MODES, $meta['mode']);
- $this->writable = (bool)preg_match(self::WRITABLE_MODES, $meta['mode']);
+ $this->readable = (bool) preg_match(self::READABLE_MODES, $meta['mode']);
+ $this->writable = (bool) preg_match(self::WRITABLE_MODES, $meta['mode']);
$this->uri = $this->getMetadata('uri');
}
if ($this->isSeekable()) {
$this->seek(0);
}
+
return $this->getContents();
} catch (\Throwable $e) {
if (\PHP_VERSION_ID >= 70400) {
throw $e;
}
trigger_error(sprintf('%s::__toString exception: %s', self::class, (string) $e), E_USER_ERROR);
+
return '';
}
}
$stats = fstat($this->stream);
if (is_array($stats) && isset($stats['size'])) {
$this->size = $stats['size'];
+
return $this->size;
}
}
if (fseek($this->stream, $offset, $whence) === -1) {
throw new \RuntimeException('Unable to seek to stream position '
- . $offset . ' with whence ' . var_export($whence, true));
+ .$offset.' with whence '.var_export($whence, true));
}
}
{
if ($name === 'stream') {
$this->stream = $this->createStream();
+
return $this->stream;
}
if ($this->isSeekable()) {
$this->seek(0);
}
+
return $this->getContents();
} catch (\Throwable $e) {
if (\PHP_VERSION_ID >= 70400) {
throw $e;
}
trigger_error(sprintf('%s::__toString exception: %s', self::class, (string) $e), E_USER_ERROR);
+
return '';
}
}
$mode = 'w';
} else {
throw new \InvalidArgumentException('The stream must be readable, '
- . 'writable, or both.');
+ .'writable, or both.');
}
return fopen('guzzle://stream', $mode, false, self::createStreamContext($stream));
public static function createStreamContext(StreamInterface $stream)
{
return stream_context_create([
- 'guzzle' => ['stream' => $stream]
+ 'guzzle' => ['stream' => $stream],
]);
}
*/
public function stream_cast(int $cast_as)
{
- $stream = clone($this->stream);
+ $stream = clone $this->stream;
$resource = $stream->detach();
return $resource ?? false;
public function stream_stat(): array
{
static $modeMap = [
- 'r' => 33060,
+ 'r' => 33060,
'rb' => 33060,
'r+' => 33206,
- 'w' => 33188,
- 'wb' => 33188
+ 'w' => 33188,
+ 'wb' => 33188,
];
return [
- 'dev' => 0,
- 'ino' => 0,
- 'mode' => $modeMap[$this->mode],
- 'nlink' => 0,
- 'uid' => 0,
- 'gid' => 0,
- 'rdev' => 0,
- 'size' => $this->stream->getSize() ?: 0,
- 'atime' => 0,
- 'mtime' => 0,
- 'ctime' => 0,
+ 'dev' => 0,
+ 'ino' => 0,
+ 'mode' => $modeMap[$this->mode],
+ 'nlink' => 0,
+ 'uid' => 0,
+ 'gid' => 0,
+ 'rdev' => 0,
+ 'size' => $this->stream->getSize() ?: 0,
+ 'atime' => 0,
+ 'mtime' => 0,
+ 'ctime' => 0,
'blksize' => 0,
- 'blocks' => 0
+ 'blocks' => 0,
];
}
public function url_stat(string $path, int $flags): array
{
return [
- 'dev' => 0,
- 'ino' => 0,
- 'mode' => 0,
- 'nlink' => 0,
- 'uid' => 0,
- 'gid' => 0,
- 'rdev' => 0,
- 'size' => 0,
- 'atime' => 0,
- 'mtime' => 0,
- 'ctime' => 0,
+ 'dev' => 0,
+ 'ino' => 0,
+ 'mode' => 0,
+ 'nlink' => 0,
+ 'uid' => 0,
+ 'gid' => 0,
+ 'rdev' => 0,
+ 'size' => 0,
+ 'atime' => 0,
+ 'mtime' => 0,
+ 'ctime' => 0,
'blksize' => 0,
- 'blocks' => 0
+ 'blocks' => 0,
];
}
}
private const HTTP_DEFAULT_HOST = 'localhost';
private const DEFAULT_PORTS = [
- 'http' => 80,
+ 'http' => 80,
'https' => 443,
'ftp' => 21,
'gopher' => 70,
/**
* Unreserved characters for use in a regex.
*
- * @link https://tools.ietf.org/html/rfc3986#section-2.3
+ * @see https://tools.ietf.org/html/rfc3986#section-2.3
*/
private const CHAR_UNRESERVED = 'a-zA-Z0-9_\-\.~';
/**
* Sub-delims for use in a regex.
*
- * @link https://tools.ietf.org/html/rfc3986#section-2.2
+ * @see https://tools.ietf.org/html/rfc3986#section-2.2
*/
private const CHAR_SUB_DELIMS = '!\$&\'\(\)\*\+,;=';
private const QUERY_SEPARATORS_REPLACEMENT = ['=' => '%3D', '&' => '%26'];
$this->applyParts($parts);
}
}
+
/**
* UTF-8 aware \parse_url() replacement.
*
$url
);
- $result = parse_url($prefix . $encodedUrl);
+ $result = parse_url($prefix.$encodedUrl);
if ($result === false) {
return false;
* `file:///` is the more common syntax for the file scheme anyway (Chrome for example redirects to
* that format).
*
- * @link https://tools.ietf.org/html/rfc3986#section-5.3
+ * @see https://tools.ietf.org/html/rfc3986#section-5.3
*/
public static function composeComponents(?string $scheme, ?string $authority, string $path, ?string $query, ?string $fragment): string
{
// weak type checks to also accept null until we can add scalar type hints
if ($scheme != '') {
- $uri .= $scheme . ':';
+ $uri .= $scheme.':';
}
if ($authority != '' || $scheme === 'file') {
- $uri .= '//' . $authority;
+ $uri .= '//'.$authority;
}
if ($authority != '' && $path != '' && $path[0] != '/') {
- $path = '/' . $path;
+ $path = '/'.$path;
}
$uri .= $path;
if ($query != '') {
- $uri .= '?' . $query;
+ $uri .= '?'.$query;
}
if ($fragment != '') {
- $uri .= '#' . $fragment;
+ $uri .= '#'.$fragment;
}
return $uri;
* @see Uri::isNetworkPathReference
* @see Uri::isAbsolutePathReference
* @see Uri::isRelativePathReference
- * @link https://tools.ietf.org/html/rfc3986#section-4
+ * @see https://tools.ietf.org/html/rfc3986#section-4
*/
public static function isAbsolute(UriInterface $uri): bool
{
*
* A relative reference that begins with two slash characters is termed an network-path reference.
*
- * @link https://tools.ietf.org/html/rfc3986#section-4.2
+ * @see https://tools.ietf.org/html/rfc3986#section-4.2
*/
public static function isNetworkPathReference(UriInterface $uri): bool
{
*
* A relative reference that begins with a single slash character is termed an absolute-path reference.
*
- * @link https://tools.ietf.org/html/rfc3986#section-4.2
+ * @see https://tools.ietf.org/html/rfc3986#section-4.2
*/
public static function isAbsolutePathReference(UriInterface $uri): bool
{
*
* A relative reference that does not begin with a slash character is termed a relative-path reference.
*
- * @link https://tools.ietf.org/html/rfc3986#section-4.2
+ * @see https://tools.ietf.org/html/rfc3986#section-4.2
*/
public static function isRelativePathReference(UriInterface $uri): bool
{
* @param UriInterface $uri The URI to check
* @param UriInterface|null $base An optional base URI to compare against
*
- * @link https://tools.ietf.org/html/rfc3986#section-4.4
+ * @see https://tools.ietf.org/html/rfc3986#section-4.4
*/
public static function isSameDocumentReference(UriInterface $uri, UriInterface $base = null): bool
{
/**
* Creates a URI from a hash of `parse_url` components.
*
- * @link http://php.net/manual/en/function.parse-url.php
+ * @see http://php.net/manual/en/function.parse-url.php
*
* @throws MalformedUriException If the components do not form a valid URI.
*/
{
$authority = $this->host;
if ($this->userInfo !== '') {
- $authority = $this->userInfo . '@' . $authority;
+ $authority = $this->userInfo.'@'.$authority;
}
if ($this->port !== null) {
- $authority .= ':' . $this->port;
+ $authority .= ':'.$this->port;
}
return $authority;
{
$info = $this->filterUserInfoComponent($user);
if ($password !== null) {
- $info .= ':' . $this->filterUserInfoComponent($password);
+ $info .= ':'.$this->filterUserInfoComponent($password);
}
if ($this->userInfo === $info) {
? $this->filterQueryAndFragment($parts['fragment'])
: '';
if (isset($parts['pass'])) {
- $this->userInfo .= ':' . $this->filterUserInfoComponent($parts['pass']);
+ $this->userInfo .= ':'.$this->filterUserInfoComponent($parts['pass']);
}
$this->removeDefaultPort();
}
return preg_replace_callback(
- '/(?:[^%' . self::CHAR_UNRESERVED . self::CHAR_SUB_DELIMS . ']+|%(?![A-Fa-f0-9]{2}))/',
+ '/(?:[^%'.self::CHAR_UNRESERVED.self::CHAR_SUB_DELIMS.']+|%(?![A-Fa-f0-9]{2}))/',
[$this, 'rawurlencodeMatchZero'],
$component
);
}
$port = (int) $port;
- if (0 > $port || 0xffff < $port) {
+ if (0 > $port || 0xFFFF < $port) {
throw new \InvalidArgumentException(
sprintf('Invalid port: %d. Must be between 0 and 65535', $port)
);
$queryString = strtr($key, self::QUERY_SEPARATORS_REPLACEMENT);
if ($value !== null) {
- $queryString .= '=' . strtr($value, self::QUERY_SEPARATORS_REPLACEMENT);
+ $queryString .= '='.strtr($value, self::QUERY_SEPARATORS_REPLACEMENT);
}
return $queryString;
}
return preg_replace_callback(
- '/(?:[^' . self::CHAR_UNRESERVED . self::CHAR_SUB_DELIMS . '%:@\/]++|%(?![A-Fa-f0-9]{2}))/',
+ '/(?:[^'.self::CHAR_UNRESERVED.self::CHAR_SUB_DELIMS.'%:@\/]++|%(?![A-Fa-f0-9]{2}))/',
[$this, 'rawurlencodeMatchZero'],
$path
);
}
return preg_replace_callback(
- '/(?:[^' . self::CHAR_UNRESERVED . self::CHAR_SUB_DELIMS . '%:@\/\?]++|%(?![A-Fa-f0-9]{2}))/',
+ '/(?:[^'.self::CHAR_UNRESERVED.self::CHAR_SUB_DELIMS.'%:@\/\?]++|%(?![A-Fa-f0-9]{2}))/',
[$this, 'rawurlencodeMatchZero'],
$str
);
*
* @author Tobias Schultze
*
- * @link https://tools.ietf.org/html/rfc3986#section-6
+ * @see https://tools.ietf.org/html/rfc3986#section-6
*/
final class UriNormalizer
{
* @param UriInterface $uri The URI to normalize
* @param int $flags A bitmask of normalizations to apply, see constants
*
- * @link https://tools.ietf.org/html/rfc3986#section-6.2
+ * @see https://tools.ietf.org/html/rfc3986#section-6.2
*/
public static function normalize(UriInterface $uri, int $flags = self::PRESERVING_NORMALIZATIONS): UriInterface
{
* @param UriInterface $uri2 An URI to compare
* @param int $normalizations A bitmask of normalizations to apply, see constants
*
- * @link https://tools.ietf.org/html/rfc3986#section-6.1
+ * @see https://tools.ietf.org/html/rfc3986#section-6.1
*/
public static function isEquivalent(UriInterface $uri1, UriInterface $uri2, int $normalizations = self::PRESERVING_NORMALIZATIONS): bool
{
*
* @author Tobias Schultze
*
- * @link https://tools.ietf.org/html/rfc3986#section-5
+ * @see https://tools.ietf.org/html/rfc3986#section-5
*/
final class UriResolver
{
/**
* Removes dot segments from a path and returns the new path.
*
- * @link http://tools.ietf.org/html/rfc3986#section-5.2.4
+ * @see http://tools.ietf.org/html/rfc3986#section-5.2.4
*/
public static function removeDotSegments(string $path): string
{
if ($path[0] === '/' && (!isset($newPath[0]) || $newPath[0] !== '/')) {
// Re-add the leading slash if necessary for cases like "/.."
- $newPath = '/' . $newPath;
+ $newPath = '/'.$newPath;
} elseif ($newPath !== '' && ($segment === '.' || $segment === '..')) {
// Add the trailing slash if necessary
// If newPath is not empty, then $segment must be set and is the last segment from the foreach
/**
* Converts the relative URI into a new URI that is resolved against the base URI.
*
- * @link http://tools.ietf.org/html/rfc3986#section-5.2
+ * @see http://tools.ietf.org/html/rfc3986#section-5.2
*/
public static function resolve(UriInterface $base, UriInterface $rel): UriInterface
{
$targetPath = $rel->getPath();
} else {
if ($targetAuthority != '' && $base->getPath() === '') {
- $targetPath = '/' . $rel->getPath();
+ $targetPath = '/'.$rel->getPath();
} else {
$lastSlashPos = strrpos($base->getPath(), '/');
if ($lastSlashPos === false) {
$targetPath = $rel->getPath();
} else {
- $targetPath = substr($base->getPath(), 0, $lastSlashPos + 1) . $rel->getPath();
+ $targetPath = substr($base->getPath(), 0, $lastSlashPos + 1).$rel->getPath();
}
}
}
}
}
$targetSegments[] = $targetLastSegment;
- $relativePath = str_repeat('../', count($sourceSegments)) . implode('/', $targetSegments);
+ $relativePath = str_repeat('../', count($sourceSegments)).implode('/', $targetSegments);
// A reference to am empty last segment or an empty first sub-segment must be prefixed with "./".
// This also applies to a segment with a colon character (e.g., "file:colon") that cannot be used
}
$buffer .= $buf;
}
+
return $buffer;
}
$standardPorts = ['http' => 80, 'https' => 443];
$scheme = $changes['uri']->getScheme();
if (isset($standardPorts[$scheme]) && $port != $standardPorts[$scheme]) {
- $changes['set_headers']['Host'] .= ':' . $port;
+ $changes['set_headers']['Host'] .= ':'.$port;
}
}
}
fwrite($stream, (string) $resource);
fseek($stream, 0);
}
+
return new Stream($stream, $options);
}
fseek($stream, 0);
$resource = $stream;
}
+
return new Stream($resource, $options);
case 'object':
/** @var object $resource */
}
$result = $resource->current();
$resource->next();
+
return $result;
}, $options);
} elseif (method_exists($resource, '__toString')) {
return new PumpStream($resource, $options);
}
- throw new \InvalidArgumentException('Invalid resource type: ' . gettype($resource));
+ throw new \InvalidArgumentException('Invalid resource type: '.gettype($resource));
}
/**