Этот репозиторий содержит полную реализацию сообщений PSR-7, несколько декораторов потоков и некоторые полезные функции, такие как синтаксический анализ строки запроса.

Потоковая реализация.

Этот пакет поставляется с рядом реализаций потоков и декораторов потоков.

AppendStream

GuzzleHttp\Psr7\AppendStream

Считывает данные из нескольких потоков, один за другим.

use GuzzleHttp\Psr7;

$a = Psr7\Utils::streamFor('abc, ');
$b = Psr7\Utils::streamFor('123.');
$composed = new Psr7\AppendStream([$a, $b]);

$composed->addStream(Psr7\Utils::streamFor(' Прежде всего выслушай меня'));

echo $composed; // abc, 123. Прежде всего, выслушай меня.

BufferStream

GuzzleHttp\Psr7\BufferStream

Предоставляет поток буфера, который может быть записан для заполнения буфера и считан для удаления байтов из буфера.

Этот поток возвращает значение метаданных "hwm", которое сообщает вышестоящим потребителям, какова настроенная отметка высокого уровня воды в потоке или максимальный предпочтительный размер буфера.

use GuzzleHttp\Psr7;

// Когда в буфере находится более 1024 байт, он начнет возвращать false
// для записи. Это признак того, что писателям следует притормозить.
$buffer = new Psr7\BufferStream(1024);

CachingStream

CachingStream используется для разрешения поиска по ранее прочитанным байтам в потоках, не подлежащих поиску. Это может быть полезно, когда передача тела объекта, не подлежащего поиску, завершается неудачей из-за необходимости перемотки потока (например, в результате перенаправления). Данные, считываемые из удаленного потока, будут буферизованы во временном потоке PHP, так что ранее прочитанные байты кэшируются сначала в памяти, а затем на диске.

use GuzzleHttp\Psr7;

$original = Psr7\Utils::streamFor(fopen('http://www.google.com', 'r'));
$stream = new Psr7\CachingStream($original);

$stream->read(1024);
echo $stream->tell();
// 1024

$stream->seek(0);
echo $stream->tell();
// 0

DroppingStream

GuzzleHttp\Psr7\DroppingStream

Декоратор потока, который начинает отбрасывать данные, как только размер базового потока становится слишком большим.

use GuzzleHttp\Psr7;

// Создать пустой поток
$stream = Psr7\Utils::streamFor();

// Начать отбрасывать данные, когда поток содержит более 10 байт
$dropping = new Psr7\DroppingStream($stream, 10);

$dropping->write('01234567890123456789');
echo $stream; // 0123456789

FnStream

GuzzleHttp\Psr7\FnStream

Создаёт потоковые реализации на основе хэша функций.

Позволяет легко тестировать и расширять предоставленный поток без необходимости создания конкретного класса для простой точки расширения.

use GuzzleHttp\Psr7;

$stream = Psr7\Utils::streamFor('hi');
$fnStream = Psr7\FnStream::decorate($stream, [
    'rewind' => function () use ($stream) {
        echo 'О перемотке - ';
        $stream->rewind();
        echo 'rewound!';
    }
]);

$fnStream->rewind();
//Выводы: Насчет перемотать - перемотать!

InflateStream

GuzzleHttp\Psr7\InflateStream

Использует фильтр zlib.inflate PHP для того чтобы надуть содержание zlib (выкачать HTTP, RFC1950) или gzipped (RFC1952).

Этот декоратор потока преобразует предоставленный поток в ресурс потока РНР, а затем добавляет фильтр zlib.inflate. Затем поток преобразуется обратно в ресурс потока Guzzle для использования в качестве потока Guzzle.

LazyOpenStream

GuzzleHttp\Psr7\LazyOpenStream

Лениво читает или записывает файл, который открывается только после операции IO на потоке.

use GuzzleHttp\Psr7;

$stream = new Psr7\LazyOpenStream('/path/to/file', 'r');
// Файл еще не открыт...

echo $stream->read(10);
// Файл открывается и читается только в случае необходимости.

LimitStream

GuzzleHttp\Psr7\LimitStream

LimitStream может использоваться для чтения подмножества или среза существующего объекта потока. Это может быть полезно для разбивки большого файла на более мелкие части, которые будут отправлены в кусках (например, Amazon S3's multipart upload API).

use GuzzleHttp\Psr7;

$original = Psr7\Utils::streamFor(fopen('/tmp/test.txt', 'r+'));
echo $original->getSize();
// >>> 1048576

// Ограничить размер тела до 1024 байт и начать чтение с байта 2048
$stream = new Psr7\LimitStream($original, 1024, 2048);
echo $stream->getSize();
// >>> 1024
echo $stream->tell();
// >>> 0

MultipartStream

GuzzleHttp\Psr7\MultipartStream

Поток, который при чтении возвращает байты для потокового мультиарт или multipart/form-data потока.

NoSeekStream

GuzzleHttp\Psr7\NoSeekStream

NoSeekStream обтекает поток и не позволяет искать.

use GuzzleHttp\Psr7;

$original = Psr7\Utils::streamFor('foo');
$noSeek = new Psr7\NoSeekStream($original);

echo $noSeek->read(3);
// foo
var_export($noSeek->isSeekable());
// false
$noSeek->seek(0);
var_export($noSeek->read(3));
// NULL

PumpStream

GuzzleHttp\Psr7\PumpStream

Предоставляет поток, доступный только для чтения, который перекачивает данные из вызываемого РНР.

При вызове предоставленного вызываемого, PumpStream передаст количество данных, запрошенных для чтения вызываемому. Вызываемый пользователь может игнорировать это значение и возвращать меньше или больше байт, чем требуется. Любые дополнительные данные, возвращаемые предоставленным вызываемым, буферизуются внутри, пока не будут удалены с помощью функции read() PumpStream. Предоставленное вызываемое ДОЛЖНО возвращать false, когда нет больше данных для чтения.

Implementing stream decorators

Создание декоратора потока очень легко благодаря GuzzleHttp\Psr7\StreamDecoratorTrait. Эта особенность предоставляет методы, которые реализуют Psr\Http\Message\StreamInterface путем прокси к основному потоку. Просто используйте use  StreamDecoratorTrait и выполните свои пользовательские методы.

Например, предположим, что мы хотим вызывать определенную функцию каждый раз, когда последний байт считывается из потока. Это может быть реализовано путем переопределения метода read().

use Psr\Http\Message\StreamInterface;
use GuzzleHttp\Psr7\StreamDecoratorTrait;

class EofCallbackStream implements StreamInterface
{
    use StreamDecoratorTrait;

    private $callback;

    public function __construct(StreamInterface $stream, callable $cb)
    {
        $this->stream = $stream;
        $this->callback = $cb;
    }

    public function read($length)
    {
        $result = $this->stream->read($length);

        // Вызвать обратный вызов при достижении EOF.
        if ($this->eof()) {
            call_user_func($this->callback);
        }

        return $result;
    }
}

Этот декоратор можно добавить в любой существующий поток и использовать следующим образом:

use GuzzleHttp\Psr7;

$original = Psr7\Utils::streamFor('foo');

$eofStream = new EofCallbackStream($original, function () {
    echo 'EOF!';
});

$eofStream->read(2);
$eofStream->read(1);
// echoes "EOF!"
$eofStream->seek(0);
$eofStream->read(3);
// echoes "EOF!"

PHP StreamWrapper

Вы можете использовать класс GuzzleHttp\Psr7\StreamWrapper, если вам нужно использовать поток PSR-7 в качестве ресурса потока PHP.

Используйте метод GuzzleHttp\Psr7\StreamWrapper::getResource() для создания потока PHP из потока PSR-7.

use GuzzleHttp\Psr7\StreamWrapper;

$stream = GuzzleHttp\Psr7\Utils::streamFor('hello!');
$resource = StreamWrapper::getResource($stream);
echo fread($resource, 6); // outputs hello!

Static API

Существуют различные статические методы, доступные в пространстве имен GuzzleHttp\Psr7.

GuzzleHttp\Psr7\Message::toString

public static function toString(MessageInterface $message): string

Возвращает строковое представление HTTP-сообщения.

$request = new GuzzleHttp\Psr7\Request('GET', 'http://example.com');
echo GuzzleHttp\Psr7\Message::toString($request);

GuzzleHttp\Psr7\Message::bodySummary

public static function bodySummary(MessageInterface $message, int $truncateAt = 120): string|null

Получите краткое изложение текста сообщения.

Вернет значение null, если ответ не доступен для печати.

GuzzleHttp\Psr7\Message::rewindBody

public static function rewindBody(MessageInterface $message): void

Пытается перемотать текст сообщения назад и выдает исключение при сбое.

Текст сообщения будет перемотан назад только в том случае, если вызов функции tell() возвращает значение, отличное от 0.

GuzzleHttp\Psr7\Message::parseMessage

public static function parseMessage(string $message): array

Анализирует HTTP-сообщение в ассоциативный массив.

Массив содержит ключ "start-line", содержащий начальную строку сообщения, ключ "headers", содержащий ассоциативный массив значений массива заголовков, и ключ "body", содержащий тело сообщения.

GuzzleHttp\Psr7\Message::parseRequestUri

public static function parseRequestUri(string $path, array $headers): string

Создает URI для сообщения HTTP-запроса.

GuzzleHttp\Psr7\Message::parseRequest

public static function parseRequest(string $message): Request

Анализирует строку сообщения запроса в объект запроса.

GuzzleHttp\Psr7\Message::parseResponse

public static function parseResponse(string $message): Response

Анализирует строку ответного сообщения в объект ответа.

GuzzleHttp\Psr7\Header::parse

public static function parse(string|array $header): array

Проанализируйте массив значений заголовка, содержащий разделенные ";" данные, в массив ассоциативных массивов, представляющих данные пары ключ-значение заголовка заголовка. Когда параметр не содержит значения, а просто содержит ключ, эта функция вводит ключ с " строковым значением.

GuzzleHttp\Psr7\Header::normalize

public static function normalize(string|array $header): array

Преобразует массив значений заголовка, которые могут содержать заголовки, разделенные запятыми, в массив заголовков без значений, разделенных запятыми.

GuzzleHttp\Psr7\Query::parse

public static function parse(string $str, int|bool $urlEncoding = true): array

Преобразуйте строку запроса в ассоциативный массив.

Если для одного и того же ключа найдено несколько значений, значение этой пары ключ-значение станет массивом. Эта функция не анализирует вложенные массивы в стиле PHP в ассоциативный массив (например, foo[a]=1&foo[b]=2 будут проанализированы в ['foo[a]' => '1', 'foo[b]' => '2']).

GuzzleHttp\Psr7\Query::build

public static function build(array $params, int|false $encoding = PHP_QUERY_RFC3986): string

Создайте строку запроса из массива пар ключ-значение.

Эта функция может использовать возвращаемое значение parse() для построения строки запроса. Эта функция не изменяет предоставленные ключи при обнаружении массива (как это сделал бы http_build_query()).

GuzzleHttp\Psr7\Utils::caselessRemove

public static function caselessRemove(iterable<string> $keys, $keys, array $data): array

Удалите из данных элементы, заданные ключами, без учета регистра.

GuzzleHttp\Psr7\Utils::copyToStream

public static function copyToStream(StreamInterface $source, StreamInterface $dest, int $maxLen = -1): void

Скопируйте содержимое потока в другой поток до тех пор, пока не будет прочитано заданное количество байтов.

GuzzleHttp\Psr7\Utils::copyToString

public static function copyToString(StreamInterface $stream, int $maxLen = -1): string

Копирует содержимое потока в строку до тех пор, пока не будет прочитано заданное количество байт.

GuzzleHttp\Psr7\Utils::hash

public static function hash(StreamInterface $stream, string $algo, bool $rawOutput = false): string

Вычислить хэш потока.

Этот метод считывает весь поток для вычисления скользящего хэша на основе функций PHP hash_init.

GuzzleHttp\Psr7\Utils::modifyRequest

public static function modifyRequest(RequestInterface $request, array $changes): RequestInterface

Клонирует и модифицируйте запрос с учетом заданных изменений.

Этот метод полезен для уменьшения количества клонов, необходимых для изменения сообщения.

  • method: (строка) Изменяет метод HTTP.
  • set_headers: (массив) Задает заголовки.
  • remove_headers: (массив) Удаляет заданные заголовки.
  • body: (смешанный) Задает заданное тело.
  • uri: (UriInterface) Устанавливает URI.
  • query: (строка) Задает строковое значение URI запроса.
  • version: (строка) Устанавливает версию протокола.

GuzzleHttp\Psr7\Utils::readLine

public static function readLine(StreamInterface $stream, int $maxLength = null): string

Считает строку из потока до максимально допустимой длины буфера.

GuzzleHttp\Psr7\Utils::streamFor

public static function streamFor(resource|string|null|int|float|bool|StreamInterface|callable|\Iterator $resource = '', array $options = []): StreamInterface

Создать новый поток на основе типа ввода.

Options - ассоциативный массив, который может содержать следующие ключи:

  • metadata: Массив пользовательских метаданных.
  • size: Размер потока.

Этот метод принимает следующие типы ресурсов $resource:

  • Psr\Http\Message\StreamInterface: возвращает значение как есть.
  • string: Создает объект потока, который использует данную строку в качестве содержимого.
  • resource: Создает объект потока, который обтекает данный ресурс потока РНР.
  • Iterator: Если предоставленное значение реализует Iterator, то будет создан объект потока, доступный только для чтения. Каждый раз, когда поток читается с, данные из итератора заполняют буфер и будут непрерывно вызываться, пока буфер не будет равен запрошенному размеру чтения. Последующие вызовы чтения сначала читаются из буфера, а затем вызываются next на основной итератор, пока он не будет исчерпан.
  • object с __toString(): Если объект имеет метод __toString(), объект будет преобразован в строку, а затем будет возвращен поток, который использует строковое значение.
  • NULL: Когда передается значение null, возвращается пустой объект stream.
  • callable При передаче вызываемого объекта будет создан объект потока, доступный только для чтения, который вызывает данный вызываемый объект. Вызываемый объект вызывается с количеством предлагаемых байтов для чтения. Вызываемый объект может возвращать любое количество байтов, но ДОЛЖЕН возвращать значение false, когда возвращаемых данных больше нет. Объект потока, который обертывает вызываемый объект, будет вызывать вызываемый объект до тех пор, пока не будет доступно количество запрошенных байтов. Любые дополнительные байты будут буферизованы и использованы при последующих чтениях.
$stream = GuzzleHttp\Psr7\Utils::streamFor('foo');
$stream = GuzzleHttp\Psr7\Utils::streamFor(fopen('/path/to/file', 'r'));

$generator = function ($bytes) {
    for ($i = 0; $i < $bytes; $i++) {
        yield ' ';
    }
}

$stream = GuzzleHttp\Psr7\Utils::streamFor($generator(100));

GuzzleHttp\Psr7\Utils::tryFopen

public static function tryFopen(string $filename, string $mode): resource

Безопасно открывает ресурс РНР-потока, используя имя файла.

Когда fopen терпит неудачу, PHP обычно поднимает предупреждение. Эта функция добавляет обработчик ошибок, который проверяет ошибки и вместо этого бросает исключение.

GuzzleHttp\Psr7\Utils::tryGetContents

public static function tryGetContents(resource $stream): string

Безопасно получает содержимое данного потока.

Когда stream_get_content терпит неудачу, PHP обычно делает предупреждение. Эта функция добавляет обработчик ошибок, который проверяет ошибки и вместо этого бросает исключение.

GuzzleHttp\Psr7\Utils::uriFor

public static function uriFor(string|UriInterface $uri): UriInterface

Возвращает UriInterface для заданного значения.

Эта функция принимает строку или UriInterface и возвращает UriInterface для заданного значения. Если значение уже является UriInterface, оно возвращается как есть.

GuzzleHttp\Psr7\MimeType::fromFilename

public static function fromFilename(string $filename): string|null

Определяет mimetype файла, глядя на его расширение.

GuzzleHttp\Psr7\MimeType::fromExtension

public static function fromExtension(string $extension): string|null

Сопоставляет расширения файлов с типом mimetype.

Обновление с помощью Function API

Статический API был впервые представлен в версии 1.7.0, чтобы смягчить проблемы, связанные с конфликтом функций между глобальной и локальной копиями пакета. API функций был удален в версии 2.0.0. Для вашего удобства здесь приведена таблица миграции:

Оригинальная функцияСпособ замены
str Message::toString
uri_for Utils::uriFor
stream_for Utils::streamFor
parse_header Header::parse
normalize_header Header::normalize
modify_request Utils::modifyRequest
rewind_body Message::rewindBody
try_fopen Utils::tryFopen
copy_to_string Utils::copyToString
copy_to_stream Utils::copyToStream
hash Utils::hash
readline Utils::readLine
parse_request Message::parseRequest
parse_response Message::parseResponse
parse_query Query::parse
build_query Query::build
mimetype_from_filename MimeType::fromFilename
mimetype_from_extension MimeType::fromExtension
_parse_message Message::parseMessage
_parse_request_uri Message::parseRequestUri
get_message_body_summary Message::bodySummary
_caseless_remove Utils::caselessRemove

Дополнительные методы URI

Помимо стандартной реализации Psr\Http\Message\UriInterface в виде класса GuzzleHttp\Psr7\Uri, эта библиотека также предоставляет дополнительные функциональные возможности при работе с URI в качестве статических методов.

Типы URI

Экземпляр Psr\Http\Message\UriInterface может быть либо абсолютным URI, либо относительной ссылкой. Абсолютный URI имеет схему. Относительная ссылка используется для выражения URI относительно другого URI, базового URI. Относительные ссылки могут быть разделены на несколько форм в соответствии с разделом 4.2 RFC 3986:

  • ссылки на сетевые пути, например. //example.com/path
  • ссылки на абсолютные пути, например. /path
  • ссылки на относительные пути, например. subpath

Для определения типа URI можно использовать следующие методы.

GuzzleHttp\Psr7\Uri::isAbsolute

public static function isAbsolute(UriInterface $uri): bool

Является ли URI абсолютным, т.Е. у него есть схема.

GuzzleHttp\Psr7\Uri::isNetworkPathReference

public static function isNetworkPathReference(UriInterface $uri): bool

Является ли URI ссылкой на сетевой путь. Относительная ссылка, начинающаяся с двух символов косой черты, называется ссылкой на сетевой путь.

GuzzleHttp\Psr7\Uri::isAbsolutePathReference

public static function isAbsolutePathReference(UriInterface $uri): bool

Является ли URI ссылкой на абсолютный путь. Относительная ссылка, начинающаяся с одного символа косой черты, называется ссылкой на абсолютный путь.

GuzzleHttp\Psr7\Uri::isRelativePathReference

public static function isRelativePathReference(UriInterface $uri): bool

Является ли URI ссылкой на относительный путь. Относительная ссылка, которая не начинается с символа косой черты, называется ссылкой на относительный путь.

GuzzleHttp\Psr7\Uri::isSameDocumentReference

public static function isSameDocumentReference(UriInterface $uri, UriInterface $base = null): bool

Является ли URI ссылкой на один и тот же документ. Ссылка на тот же документ относится к URI, который, помимо его компонента фрагмента, идентичен базовому URI. Когда базовый URI не задан, только пустая ссылка на URI (кроме его фрагмента) считается ссылкой на один и тот же документ.

Компоненты URI.

Дополнительные методы для работы с компонентами URI.

GuzzleHttp\Psr7\Uri::isDefaultPort

public static function isDefaultPort(UriInterface $uri): bool

Имеет ли URI порт по умолчанию для текущей схемы. Psr\Http\Message\UriInterface::getPort может возвращать значение null или стандартный порт. Этот метод может быть использован независимо от реализации.

GuzzleHttp\Psr7\Uri::composeComponents

public static function composeComponents($scheme, $authority, $path, $query, $fragment): string

Составляет ссылочную строку URI из ее различных компонентов в соответствии с разделом 5.3 RFC 3986. Обычно этот метод не нужно вызывать вручную, а вместо этого используется косвенно через Psr\Http\Message\UriInterface::__toString.

GuzzleHttp\Psr7\Uri::fromParts

public static function fromParts(array $parts): UriInterface

Создает URI из хэша компонентов parse_url.

GuzzleHttp\Psr7\Uri::withQueryValue

public static function withQueryValue(UriInterface $uri, $key, $value): UriInterface

Создает новый URI с определенным значением строки запроса. Все существующие значения строки запроса, которые точно соответствуют предоставленному ключу, удаляются и заменяются заданной парой ключ-значение. Значение null установит ключ строки запроса без значения, например "key" вместо "key=value".

GuzzleHttp\Psr7\Uri::withQueryValues

public static function withQueryValues(UriInterface $uri, array $keyValueArray): UriInterface

Создает новый URI с несколькими значениями строки запроса. Он имеет то же поведение, что и с withQueryValue() , но для ассоциативного массива key => value.

GuzzleHttp\Psr7\Uri::withoutQueryValue

public static function withoutQueryValue(UriInterface $uri, $key): UriInterface

Создает новый URI с удаленным значением строки конкретного запроса. Все существующие значения строки запроса, которые точно соответствуют предоставленному ключу, удаляются.

Эталонное разрешение

GuzzleHttp\Psr7\UriResolver предоставляет методы для разрешения ссылки URI в контексте базового URI в соответствии с разделом 5 RFC 3986. Это, например, также то, что делают веб-браузеры при разрешении ссылки на веб-сайте на основе текущего URI запроса.

GuzzleHttp\Psr7\UriResolver::resolve

public static function resolve(UriInterface $base, UriInterface $rel): UriInterface

Преобразует относительный URI в новый URI, который сопоставляется с базовым URI.

GuzzleHttp\Psr7\UriResolver::removeDotSegments

public static function removeDotSegments(string $path): string

Удаляет точечные сегменты из пути и возвращает новый путь в соответствии с разделом 5.2.4 RFC 3986.

GuzzleHttp\Psr7\UriResolver::relativize

public static function relativize(UriInterface $base, UriInterface $target): UriInterface

Возвращает целевой URI в качестве относительной ссылки из базового URI. Этот метод является аналогом метода resolve():

(string) $target === (string) UriResolver::resolve($base, UriResolver::relativize($base, $target))

Одним из вариантов использования является использование текущего URI запроса в качестве базового URI, а затем создание относительных ссылок в ваших документах для уменьшения размера документа или предоставления автономных загружаемых архивов документов.

$base = new Uri('http://example.com/a/b/');
echo UriResolver::relativize($base, new Uri('http://example.com/a/b/c'));  // prints 'c'.
echo UriResolver::relativize($base, new Uri('http://example.com/a/x/y'));  // prints '../x/y'.
echo UriResolver::relativize($base, new Uri('http://example.com/a/b/?q')); // prints '?q'.
echo UriResolver::relativize($base, new Uri('http://example.org/a/b/'));   // prints '//example.org/a/b/'.

Нормализация и сравнение

GuzzleHttp\Psr7\UriNormalizer предоставляет методы для нормализации и сравнения URI в соответствии с разделом 6 RFC 3986.

GuzzleHttp\Psr7\UriNormalizer::normalize

public static function normalize(UriInterface $uri, $flags = self::PRESERVING_NORMALIZATIONS): UriInterface

Возвращает нормализованный URI. Схема и хост-компонент уже нормализованы до нижнего регистра в соответствии с UriInterface PSR-7. Этот метод добавляет дополнительные нормализации, которые можно настроить с помощью параметра $flags, который представляет собой битовую маску нормализаций для применения. Доступны следующие нормализации:

  • UriNormalizer::PRESERVING_NORMALIZATIONS

    Нормализации по умолчанию, которые включают только те, которые сохраняют семантику.

  • UriNormalizer::CAPITALIZE_PERCENT_ENCODING

    Все буквы внутри триплета с процентной кодировкой (например, "%3A") не чувствительны к регистру и должны быть заглавными.

    Пример: http://example.org/a%c2%b1bhttp://example.org/a%C2%B1b

  • UriNormalizer::DECODE_UNRESERVED_CHARACTERS

    Декодирует закодированные в процентах октеты незарегистрированных символов. Для обеспечения согласованности октеты, закодированные в процентах, в диапазонах БУКВ (%41–%5A и %61–%7A), ЦИФР (%30–%39), дефиса(%2D), точки (%2E), подчеркивания (%5F), или тильды (%7E) должны не должны создаваться производителями URI и, при обнаружении в URI, должны быть декодированы в соответствующие им незарегистрированные символы нормализаторами URI.

    Пример: http://example.org/%7Eusern%61me/http://example.org/~username/

  • UriNormalizer::CONVERT_EMPTY_PATH

    Преобразует пустой путь в "/" для URI http и https.

    Пример: http://example.orghttp://example.org/

  • UriNormalizer::REMOVE_DEFAULT_HOST

    Удаляет хост по умолчанию данной схемы URI из URI. Только схема "file" определяет хост по умолчанию "localhost". Все file:/myfile, file:///myfile, и file://localhost/myfile эквивалентны RFC 3986.

    Пример: file://localhost/myfilefile:///myfile

  • UriNormalizer::REMOVE_DEFAULT_PORT

    Удаляет порт по умолчанию для данной схемы URI из URI.

    Example: http://example.org:80/http://example.org/

  • UriNormalizer::REMOVE_DOT_SEGMENTS

    Удаляет ненужные точечные сегменты. Точечные сегменты в ссылках на относительный путь не удаляются, так как это изменило бы семантику ссылки URI.

    Example: http://example.org/../a/b/../c/./d.htmlhttp://example.org/a/c/d.html

  • UriNormalizer::REMOVE_DUPLICATE_SLASHES

    Пути, которые содержат две или более соседних косых черт, преобразуются в одну. Веб-серверы обычно игнорируют повторяющиеся косые черты и рассматривают эти URI как эквивалентные. Но теоретически эти URI не обязательно должны быть эквивалентными. Таким образом, эта нормализация может изменить семантику. Закодированные косые черты (%2F) не удаляются.

    Пример: http://example.org//foo///bar.htmlhttp://example.org/foo/bar.html

  • UriNormalizer::SORT_QUERY_PARAMETERS

    Сортировка параметров запроса по их значениям в алфавитном порядке. Однако порядок параметров в URI может быть значительным (это не определено стандартом). Таким образом, эта нормализация небезопасна и может изменить семантику URI.

    Пример: ?lang=en&article=fred?article=fred&lang=en

GuzzleHttp\Psr7\UriNormalizer::isEquivalent

public static function isEquivalent(UriInterface $uri1, UriInterface $uri2, $normalizations = self::PRESERVING_NORMALIZATIONS): bool

Можно ли считать два URI эквивалентными. Оба URI нормализуются автоматически перед сравнением с заданной битовой маской $normalizations. Метод также принимает относительные ссылки URI и возвращает true, если они эквивалентны. Это, конечно, предполагает, что они будут разрешены по одному и тому же базовому URI. Если это не так, то определение эквивалентности или различия относительных ссылок ничего не значит.

Руководство по версии

ВерсияСтатусВерсия PHP
1.x Security fixes >= 5.4, < 8.2
2.x Latest ^7.2.5 || ^8.0

Безопасность

Если вы обнаружите уязвимость в системе безопасности в этом пакете, пожалуйста, отправьте электронное письмо по адресу security@tidelift.com. Все уязвимости в системе безопасности будут оперативно устранены. Пожалуйста, не разглашайте публично проблемы, связанные с безопасностью, до тех пор, пока не будет объявлено об исправлении. Пожалуйста, ознакомьтесь с Политикой безопасности для получения дополнительной информации.

License

Guzzle is made available under the MIT License (MIT). Please see License File for more information.

For Enterprise

Available as part of the Tidelift Subscription

The maintainers of Guzzle and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source dependencies you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact dependencies you use. Learn more.