Warning, /webapps/ocs-webserver/library/vendor/guzzlehttp/psr7/README.md is written in an unsupported language. File is not indexed.
0001 # PSR-7 Message Implementation 0002 0003 This repository contains a full [PSR-7](http://www.php-fig.org/psr/psr-7/) 0004 message implementation, several stream decorators, and some helpful 0005 functionality like query string parsing. 0006 0007 0008 [![Build Status](https://travis-ci.org/guzzle/psr7.svg?branch=master)](https://travis-ci.org/guzzle/psr7) 0009 0010 0011 # Stream implementation 0012 0013 This package comes with a number of stream implementations and stream 0014 decorators. 0015 0016 0017 ## AppendStream 0018 0019 `GuzzleHttp\Psr7\AppendStream` 0020 0021 Reads from multiple streams, one after the other. 0022 0023 ```php 0024 use GuzzleHttp\Psr7; 0025 0026 $a = Psr7\stream_for('abc, '); 0027 $b = Psr7\stream_for('123.'); 0028 $composed = new Psr7\AppendStream([$a, $b]); 0029 0030 $composed->addStream(Psr7\stream_for(' Above all listen to me')); 0031 0032 echo $composed; // abc, 123. Above all listen to me. 0033 ``` 0034 0035 0036 ## BufferStream 0037 0038 `GuzzleHttp\Psr7\BufferStream` 0039 0040 Provides a buffer stream that can be written to fill a buffer, and read 0041 from to remove bytes from the buffer. 0042 0043 This stream returns a "hwm" metadata value that tells upstream consumers 0044 what the configured high water mark of the stream is, or the maximum 0045 preferred size of the buffer. 0046 0047 ```php 0048 use GuzzleHttp\Psr7; 0049 0050 // When more than 1024 bytes are in the buffer, it will begin returning 0051 // false to writes. This is an indication that writers should slow down. 0052 $buffer = new Psr7\BufferStream(1024); 0053 ``` 0054 0055 0056 ## CachingStream 0057 0058 The CachingStream is used to allow seeking over previously read bytes on 0059 non-seekable streams. This can be useful when transferring a non-seekable 0060 entity body fails due to needing to rewind the stream (for example, resulting 0061 from a redirect). Data that is read from the remote stream will be buffered in 0062 a PHP temp stream so that previously read bytes are cached first in memory, 0063 then on disk. 0064 0065 ```php 0066 use GuzzleHttp\Psr7; 0067 0068 $original = Psr7\stream_for(fopen('http://www.google.com', 'r')); 0069 $stream = new Psr7\CachingStream($original); 0070 0071 $stream->read(1024); 0072 echo $stream->tell(); 0073 // 1024 0074 0075 $stream->seek(0); 0076 echo $stream->tell(); 0077 // 0 0078 ``` 0079 0080 0081 ## DroppingStream 0082 0083 `GuzzleHttp\Psr7\DroppingStream` 0084 0085 Stream decorator that begins dropping data once the size of the underlying 0086 stream becomes too full. 0087 0088 ```php 0089 use GuzzleHttp\Psr7; 0090 0091 // Create an empty stream 0092 $stream = Psr7\stream_for(); 0093 0094 // Start dropping data when the stream has more than 10 bytes 0095 $dropping = new Psr7\DroppingStream($stream, 10); 0096 0097 $dropping->write('01234567890123456789'); 0098 echo $stream; // 0123456789 0099 ``` 0100 0101 0102 ## FnStream 0103 0104 `GuzzleHttp\Psr7\FnStream` 0105 0106 Compose stream implementations based on a hash of functions. 0107 0108 Allows for easy testing and extension of a provided stream without needing 0109 to create a concrete class for a simple extension point. 0110 0111 ```php 0112 0113 use GuzzleHttp\Psr7; 0114 0115 $stream = Psr7\stream_for('hi'); 0116 $fnStream = Psr7\FnStream::decorate($stream, [ 0117 'rewind' => function () use ($stream) { 0118 echo 'About to rewind - '; 0119 $stream->rewind(); 0120 echo 'rewound!'; 0121 } 0122 ]); 0123 0124 $fnStream->rewind(); 0125 // Outputs: About to rewind - rewound! 0126 ``` 0127 0128 0129 ## InflateStream 0130 0131 `GuzzleHttp\Psr7\InflateStream` 0132 0133 Uses PHP's zlib.inflate filter to inflate deflate or gzipped content. 0134 0135 This stream decorator skips the first 10 bytes of the given stream to remove 0136 the gzip header, converts the provided stream to a PHP stream resource, 0137 then appends the zlib.inflate filter. The stream is then converted back 0138 to a Guzzle stream resource to be used as a Guzzle stream. 0139 0140 0141 ## LazyOpenStream 0142 0143 `GuzzleHttp\Psr7\LazyOpenStream` 0144 0145 Lazily reads or writes to a file that is opened only after an IO operation 0146 take place on the stream. 0147 0148 ```php 0149 use GuzzleHttp\Psr7; 0150 0151 $stream = new Psr7\LazyOpenStream('/path/to/file', 'r'); 0152 // The file has not yet been opened... 0153 0154 echo $stream->read(10); 0155 // The file is opened and read from only when needed. 0156 ``` 0157 0158 0159 ## LimitStream 0160 0161 `GuzzleHttp\Psr7\LimitStream` 0162 0163 LimitStream can be used to read a subset or slice of an existing stream object. 0164 This can be useful for breaking a large file into smaller pieces to be sent in 0165 chunks (e.g. Amazon S3's multipart upload API). 0166 0167 ```php 0168 use GuzzleHttp\Psr7; 0169 0170 $original = Psr7\stream_for(fopen('/tmp/test.txt', 'r+')); 0171 echo $original->getSize(); 0172 // >>> 1048576 0173 0174 // Limit the size of the body to 1024 bytes and start reading from byte 2048 0175 $stream = new Psr7\LimitStream($original, 1024, 2048); 0176 echo $stream->getSize(); 0177 // >>> 1024 0178 echo $stream->tell(); 0179 // >>> 0 0180 ``` 0181 0182 0183 ## MultipartStream 0184 0185 `GuzzleHttp\Psr7\MultipartStream` 0186 0187 Stream that when read returns bytes for a streaming multipart or 0188 multipart/form-data stream. 0189 0190 0191 ## NoSeekStream 0192 0193 `GuzzleHttp\Psr7\NoSeekStream` 0194 0195 NoSeekStream wraps a stream and does not allow seeking. 0196 0197 ```php 0198 use GuzzleHttp\Psr7; 0199 0200 $original = Psr7\stream_for('foo'); 0201 $noSeek = new Psr7\NoSeekStream($original); 0202 0203 echo $noSeek->read(3); 0204 // foo 0205 var_export($noSeek->isSeekable()); 0206 // false 0207 $noSeek->seek(0); 0208 var_export($noSeek->read(3)); 0209 // NULL 0210 ``` 0211 0212 0213 ## PumpStream 0214 0215 `GuzzleHttp\Psr7\PumpStream` 0216 0217 Provides a read only stream that pumps data from a PHP callable. 0218 0219 When invoking the provided callable, the PumpStream will pass the amount of 0220 data requested to read to the callable. The callable can choose to ignore 0221 this value and return fewer or more bytes than requested. Any extra data 0222 returned by the provided callable is buffered internally until drained using 0223 the read() function of the PumpStream. The provided callable MUST return 0224 false when there is no more data to read. 0225 0226 0227 ## Implementing stream decorators 0228 0229 Creating a stream decorator is very easy thanks to the 0230 `GuzzleHttp\Psr7\StreamDecoratorTrait`. This trait provides methods that 0231 implement `Psr\Http\Message\StreamInterface` by proxying to an underlying 0232 stream. Just `use` the `StreamDecoratorTrait` and implement your custom 0233 methods. 0234 0235 For example, let's say we wanted to call a specific function each time the last 0236 byte is read from a stream. This could be implemented by overriding the 0237 `read()` method. 0238 0239 ```php 0240 use Psr\Http\Message\StreamInterface; 0241 use GuzzleHttp\Psr7\StreamDecoratorTrait; 0242 0243 class EofCallbackStream implements StreamInterface 0244 { 0245 use StreamDecoratorTrait; 0246 0247 private $callback; 0248 0249 public function __construct(StreamInterface $stream, callable $cb) 0250 { 0251 $this->stream = $stream; 0252 $this->callback = $cb; 0253 } 0254 0255 public function read($length) 0256 { 0257 $result = $this->stream->read($length); 0258 0259 // Invoke the callback when EOF is hit. 0260 if ($this->eof()) { 0261 call_user_func($this->callback); 0262 } 0263 0264 return $result; 0265 } 0266 } 0267 ``` 0268 0269 This decorator could be added to any existing stream and used like so: 0270 0271 ```php 0272 use GuzzleHttp\Psr7; 0273 0274 $original = Psr7\stream_for('foo'); 0275 0276 $eofStream = new EofCallbackStream($original, function () { 0277 echo 'EOF!'; 0278 }); 0279 0280 $eofStream->read(2); 0281 $eofStream->read(1); 0282 // echoes "EOF!" 0283 $eofStream->seek(0); 0284 $eofStream->read(3); 0285 // echoes "EOF!" 0286 ``` 0287 0288 0289 ## PHP StreamWrapper 0290 0291 You can use the `GuzzleHttp\Psr7\StreamWrapper` class if you need to use a 0292 PSR-7 stream as a PHP stream resource. 0293 0294 Use the `GuzzleHttp\Psr7\StreamWrapper::getResource()` method to create a PHP 0295 stream from a PSR-7 stream. 0296 0297 ```php 0298 use GuzzleHttp\Psr7\StreamWrapper; 0299 0300 $stream = GuzzleHttp\Psr7\stream_for('hello!'); 0301 $resource = StreamWrapper::getResource($stream); 0302 echo fread($resource, 6); // outputs hello! 0303 ``` 0304 0305 0306 # Function API 0307 0308 There are various functions available under the `GuzzleHttp\Psr7` namespace. 0309 0310 0311 ## `function str` 0312 0313 `function str(MessageInterface $message)` 0314 0315 Returns the string representation of an HTTP message. 0316 0317 ```php 0318 $request = new GuzzleHttp\Psr7\Request('GET', 'http://example.com'); 0319 echo GuzzleHttp\Psr7\str($request); 0320 ``` 0321 0322 0323 ## `function uri_for` 0324 0325 `function uri_for($uri)` 0326 0327 This function accepts a string or `Psr\Http\Message\UriInterface` and returns a 0328 UriInterface for the given value. If the value is already a `UriInterface`, it 0329 is returned as-is. 0330 0331 ```php 0332 $uri = GuzzleHttp\Psr7\uri_for('http://example.com'); 0333 assert($uri === GuzzleHttp\Psr7\uri_for($uri)); 0334 ``` 0335 0336 0337 ## `function stream_for` 0338 0339 `function stream_for($resource = '', array $options = [])` 0340 0341 Create a new stream based on the input type. 0342 0343 Options is an associative array that can contain the following keys: 0344 0345 * - metadata: Array of custom metadata. 0346 * - size: Size of the stream. 0347 0348 This method accepts the following `$resource` types: 0349 0350 - `Psr\Http\Message\StreamInterface`: Returns the value as-is. 0351 - `string`: Creates a stream object that uses the given string as the contents. 0352 - `resource`: Creates a stream object that wraps the given PHP stream resource. 0353 - `Iterator`: If the provided value implements `Iterator`, then a read-only 0354 stream object will be created that wraps the given iterable. Each time the 0355 stream is read from, data from the iterator will fill a buffer and will be 0356 continuously called until the buffer is equal to the requested read size. 0357 Subsequent read calls will first read from the buffer and then call `next` 0358 on the underlying iterator until it is exhausted. 0359 - `object` with `__toString()`: If the object has the `__toString()` method, 0360 the object will be cast to a string and then a stream will be returned that 0361 uses the string value. 0362 - `NULL`: When `null` is passed, an empty stream object is returned. 0363 - `callable` When a callable is passed, a read-only stream object will be 0364 created that invokes the given callable. The callable is invoked with the 0365 number of suggested bytes to read. The callable can return any number of 0366 bytes, but MUST return `false` when there is no more data to return. The 0367 stream object that wraps the callable will invoke the callable until the 0368 number of requested bytes are available. Any additional bytes will be 0369 buffered and used in subsequent reads. 0370 0371 ```php 0372 $stream = GuzzleHttp\Psr7\stream_for('foo'); 0373 $stream = GuzzleHttp\Psr7\stream_for(fopen('/path/to/file', 'r')); 0374 0375 $generator function ($bytes) { 0376 for ($i = 0; $i < $bytes; $i++) { 0377 yield ' '; 0378 } 0379 } 0380 0381 $stream = GuzzleHttp\Psr7\stream_for($generator(100)); 0382 ``` 0383 0384 0385 ## `function parse_header` 0386 0387 `function parse_header($header)` 0388 0389 Parse an array of header values containing ";" separated data into an array of 0390 associative arrays representing the header key value pair data of the header. 0391 When a parameter does not contain a value, but just contains a key, this 0392 function will inject a key with a '' string value. 0393 0394 0395 ## `function normalize_header` 0396 0397 `function normalize_header($header)` 0398 0399 Converts an array of header values that may contain comma separated headers 0400 into an array of headers with no comma separated values. 0401 0402 0403 ## `function modify_request` 0404 0405 `function modify_request(RequestInterface $request, array $changes)` 0406 0407 Clone and modify a request with the given changes. This method is useful for 0408 reducing the number of clones needed to mutate a message. 0409 0410 The changes can be one of: 0411 0412 - method: (string) Changes the HTTP method. 0413 - set_headers: (array) Sets the given headers. 0414 - remove_headers: (array) Remove the given headers. 0415 - body: (mixed) Sets the given body. 0416 - uri: (UriInterface) Set the URI. 0417 - query: (string) Set the query string value of the URI. 0418 - version: (string) Set the protocol version. 0419 0420 0421 ## `function rewind_body` 0422 0423 `function rewind_body(MessageInterface $message)` 0424 0425 Attempts to rewind a message body and throws an exception on failure. The body 0426 of the message will only be rewound if a call to `tell()` returns a value other 0427 than `0`. 0428 0429 0430 ## `function try_fopen` 0431 0432 `function try_fopen($filename, $mode)` 0433 0434 Safely opens a PHP stream resource using a filename. 0435 0436 When fopen fails, PHP normally raises a warning. This function adds an error 0437 handler that checks for errors and throws an exception instead. 0438 0439 0440 ## `function copy_to_string` 0441 0442 `function copy_to_string(StreamInterface $stream, $maxLen = -1)` 0443 0444 Copy the contents of a stream into a string until the given number of bytes 0445 have been read. 0446 0447 0448 ## `function copy_to_stream` 0449 0450 `function copy_to_stream(StreamInterface $source, StreamInterface $dest, $maxLen = -1)` 0451 0452 Copy the contents of a stream into another stream until the given number of 0453 bytes have been read. 0454 0455 0456 ## `function hash` 0457 0458 `function hash(StreamInterface $stream, $algo, $rawOutput = false)` 0459 0460 Calculate a hash of a Stream. This method reads the entire stream to calculate 0461 a rolling hash (based on PHP's hash_init functions). 0462 0463 0464 ## `function readline` 0465 0466 `function readline(StreamInterface $stream, $maxLength = null)` 0467 0468 Read a line from the stream up to the maximum allowed buffer length. 0469 0470 0471 ## `function parse_request` 0472 0473 `function parse_request($message)` 0474 0475 Parses a request message string into a request object. 0476 0477 0478 ## `function parse_response` 0479 0480 `function parse_response($message)` 0481 0482 Parses a response message string into a response object. 0483 0484 0485 ## `function parse_query` 0486 0487 `function parse_query($str, $urlEncoding = true)` 0488 0489 Parse a query string into an associative array. 0490 0491 If multiple values are found for the same key, the value of that key value pair 0492 will become an array. This function does not parse nested PHP style arrays into 0493 an associative array (e.g., `foo[a]=1&foo[b]=2` will be parsed into 0494 `['foo[a]' => '1', 'foo[b]' => '2']`). 0495 0496 0497 ## `function build_query` 0498 0499 `function build_query(array $params, $encoding = PHP_QUERY_RFC3986)` 0500 0501 Build a query string from an array of key value pairs. 0502 0503 This function can use the return value of parse_query() to build a query string. 0504 This function does not modify the provided keys when an array is encountered 0505 (like http_build_query would). 0506 0507 0508 ## `function mimetype_from_filename` 0509 0510 `function mimetype_from_filename($filename)` 0511 0512 Determines the mimetype of a file by looking at its extension. 0513 0514 0515 ## `function mimetype_from_extension` 0516 0517 `function mimetype_from_extension($extension)` 0518 0519 Maps a file extensions to a mimetype. 0520 0521 0522 # Additional URI Methods 0523 0524 Aside from the standard `Psr\Http\Message\UriInterface` implementation in form of the `GuzzleHttp\Psr7\Uri` class, 0525 this library also provides additional functionality when working with URIs as static methods. 0526 0527 ## URI Types 0528 0529 An instance of `Psr\Http\Message\UriInterface` can either be an absolute URI or a relative reference. 0530 An absolute URI has a scheme. A relative reference is used to express a URI relative to another URI, 0531 the base URI. Relative references can be divided into several forms according to 0532 [RFC 3986 Section 4.2](https://tools.ietf.org/html/rfc3986#section-4.2): 0533 0534 - network-path references, e.g. `//example.com/path` 0535 - absolute-path references, e.g. `/path` 0536 - relative-path references, e.g. `subpath` 0537 0538 The following methods can be used to identify the type of the URI. 0539 0540 ### `GuzzleHttp\Psr7\Uri::isAbsolute` 0541 0542 `public static function isAbsolute(UriInterface $uri): bool` 0543 0544 Whether the URI is absolute, i.e. it has a scheme. 0545 0546 ### `GuzzleHttp\Psr7\Uri::isNetworkPathReference` 0547 0548 `public static function isNetworkPathReference(UriInterface $uri): bool` 0549 0550 Whether the URI is a network-path reference. A relative reference that begins with two slash characters is 0551 termed an network-path reference. 0552 0553 ### `GuzzleHttp\Psr7\Uri::isAbsolutePathReference` 0554 0555 `public static function isAbsolutePathReference(UriInterface $uri): bool` 0556 0557 Whether the URI is a absolute-path reference. A relative reference that begins with a single slash character is 0558 termed an absolute-path reference. 0559 0560 ### `GuzzleHttp\Psr7\Uri::isRelativePathReference` 0561 0562 `public static function isRelativePathReference(UriInterface $uri): bool` 0563 0564 Whether the URI is a relative-path reference. A relative reference that does not begin with a slash character is 0565 termed a relative-path reference. 0566 0567 ### `GuzzleHttp\Psr7\Uri::isSameDocumentReference` 0568 0569 `public static function isSameDocumentReference(UriInterface $uri, UriInterface $base = null): bool` 0570 0571 Whether the URI is a same-document reference. A same-document reference refers to a URI that is, aside from its 0572 fragment component, identical to the base URI. When no base URI is given, only an empty URI reference 0573 (apart from its fragment) is considered a same-document reference. 0574 0575 ## URI Components 0576 0577 Additional methods to work with URI components. 0578 0579 ### `GuzzleHttp\Psr7\Uri::isDefaultPort` 0580 0581 `public static function isDefaultPort(UriInterface $uri): bool` 0582 0583 Whether the URI has the default port of the current scheme. `Psr\Http\Message\UriInterface::getPort` may return null 0584 or the standard port. This method can be used independently of the implementation. 0585 0586 ### `GuzzleHttp\Psr7\Uri::composeComponents` 0587 0588 `public static function composeComponents($scheme, $authority, $path, $query, $fragment): string` 0589 0590 Composes a URI reference string from its various components according to 0591 [RFC 3986 Section 5.3](https://tools.ietf.org/html/rfc3986#section-5.3). Usually this method does not need to be called 0592 manually but instead is used indirectly via `Psr\Http\Message\UriInterface::__toString`. 0593 0594 ### `GuzzleHttp\Psr7\Uri::fromParts` 0595 0596 `public static function fromParts(array $parts): UriInterface` 0597 0598 Creates a URI from a hash of [`parse_url`](http://php.net/manual/en/function.parse-url.php) components. 0599 0600 0601 ### `GuzzleHttp\Psr7\Uri::withQueryValue` 0602 0603 `public static function withQueryValue(UriInterface $uri, $key, $value): UriInterface` 0604 0605 Creates a new URI with a specific query string value. Any existing query string values that exactly match the 0606 provided key are removed and replaced with the given key value pair. A value of null will set the query string 0607 key without a value, e.g. "key" instead of "key=value". 0608 0609 0610 ### `GuzzleHttp\Psr7\Uri::withoutQueryValue` 0611 0612 `public static function withoutQueryValue(UriInterface $uri, $key): UriInterface` 0613 0614 Creates a new URI with a specific query string value removed. Any existing query string values that exactly match the 0615 provided key are removed. 0616 0617 ## Reference Resolution 0618 0619 `GuzzleHttp\Psr7\UriResolver` provides methods to resolve a URI reference in the context of a base URI according 0620 to [RFC 3986 Section 5](https://tools.ietf.org/html/rfc3986#section-5). This is for example also what web browsers 0621 do when resolving a link in a website based on the current request URI. 0622 0623 ### `GuzzleHttp\Psr7\UriResolver::resolve` 0624 0625 `public static function resolve(UriInterface $base, UriInterface $rel): UriInterface` 0626 0627 Converts the relative URI into a new URI that is resolved against the base URI. 0628 0629 ### `GuzzleHttp\Psr7\UriResolver::removeDotSegments` 0630 0631 `public static function removeDotSegments(string $path): string` 0632 0633 Removes dot segments from a path and returns the new path according to 0634 [RFC 3986 Section 5.2.4](https://tools.ietf.org/html/rfc3986#section-5.2.4). 0635 0636 ### `GuzzleHttp\Psr7\UriResolver::relativize` 0637 0638 `public static function relativize(UriInterface $base, UriInterface $target): UriInterface` 0639 0640 Returns the target URI as a relative reference from the base URI. This method is the counterpart to resolve(): 0641 0642 ```php 0643 (string) $target === (string) UriResolver::resolve($base, UriResolver::relativize($base, $target)) 0644 ``` 0645 0646 One use-case is to use the current request URI as base URI and then generate relative links in your documents 0647 to reduce the document size or offer self-contained downloadable document archives. 0648 0649 ```php 0650 $base = new Uri('http://example.com/a/b/'); 0651 echo UriResolver::relativize($base, new Uri('http://example.com/a/b/c')); // prints 'c'. 0652 echo UriResolver::relativize($base, new Uri('http://example.com/a/x/y')); // prints '../x/y'. 0653 echo UriResolver::relativize($base, new Uri('http://example.com/a/b/?q')); // prints '?q'. 0654 echo UriResolver::relativize($base, new Uri('http://example.org/a/b/')); // prints '//example.org/a/b/'. 0655 ``` 0656 0657 ## Normalization and Comparison 0658 0659 `GuzzleHttp\Psr7\UriNormalizer` provides methods to normalize and compare URIs according to 0660 [RFC 3986 Section 6](https://tools.ietf.org/html/rfc3986#section-6). 0661 0662 ### `GuzzleHttp\Psr7\UriNormalizer::normalize` 0663 0664 `public static function normalize(UriInterface $uri, $flags = self::PRESERVING_NORMALIZATIONS): UriInterface` 0665 0666 Returns a normalized URI. The scheme and host component are already normalized to lowercase per PSR-7 UriInterface. 0667 This methods adds additional normalizations that can be configured with the `$flags` parameter which is a bitmask 0668 of normalizations to apply. The following normalizations are available: 0669 0670 - `UriNormalizer::PRESERVING_NORMALIZATIONS` 0671 0672 Default normalizations which only include the ones that preserve semantics. 0673 0674 - `UriNormalizer::CAPITALIZE_PERCENT_ENCODING` 0675 0676 All letters within a percent-encoding triplet (e.g., "%3A") are case-insensitive, and should be capitalized. 0677 0678 Example: `http://example.org/a%c2%b1b` → `http://example.org/a%C2%B1b` 0679 0680 - `UriNormalizer::DECODE_UNRESERVED_CHARACTERS` 0681 0682 Decodes percent-encoded octets of unreserved characters. For consistency, percent-encoded octets in the ranges of 0683 ALPHA (%41–%5A and %61–%7A), DIGIT (%30–%39), hyphen (%2D), period (%2E), underscore (%5F), or tilde (%7E) should 0684 not be created by URI producers and, when found in a URI, should be decoded to their corresponding unreserved 0685 characters by URI normalizers. 0686 0687 Example: `http://example.org/%7Eusern%61me/` → `http://example.org/~username/` 0688 0689 - `UriNormalizer::CONVERT_EMPTY_PATH` 0690 0691 Converts the empty path to "/" for http and https URIs. 0692 0693 Example: `http://example.org` → `http://example.org/` 0694 0695 - `UriNormalizer::REMOVE_DEFAULT_HOST` 0696 0697 Removes the default host of the given URI scheme from the URI. Only the "file" scheme defines the default host 0698 "localhost". All of `file:/myfile`, `file:///myfile`, and `file://localhost/myfile` are equivalent according to 0699 RFC 3986. 0700 0701 Example: `file://localhost/myfile` → `file:///myfile` 0702 0703 - `UriNormalizer::REMOVE_DEFAULT_PORT` 0704 0705 Removes the default port of the given URI scheme from the URI. 0706 0707 Example: `http://example.org:80/` → `http://example.org/` 0708 0709 - `UriNormalizer::REMOVE_DOT_SEGMENTS` 0710 0711 Removes unnecessary dot-segments. Dot-segments in relative-path references are not removed as it would 0712 change the semantics of the URI reference. 0713 0714 Example: `http://example.org/../a/b/../c/./d.html` → `http://example.org/a/c/d.html` 0715 0716 - `UriNormalizer::REMOVE_DUPLICATE_SLASHES` 0717 0718 Paths which include two or more adjacent slashes are converted to one. Webservers usually ignore duplicate slashes 0719 and treat those URIs equivalent. But in theory those URIs do not need to be equivalent. So this normalization 0720 may change the semantics. Encoded slashes (%2F) are not removed. 0721 0722 Example: `http://example.org//foo///bar.html` → `http://example.org/foo/bar.html` 0723 0724 - `UriNormalizer::SORT_QUERY_PARAMETERS` 0725 0726 Sort query parameters with their values in alphabetical order. However, the order of parameters in a URI may be 0727 significant (this is not defined by the standard). So this normalization is not safe and may change the semantics 0728 of the URI. 0729 0730 Example: `?lang=en&article=fred` → `?article=fred&lang=en` 0731 0732 ### `GuzzleHttp\Psr7\UriNormalizer::isEquivalent` 0733 0734 `public static function isEquivalent(UriInterface $uri1, UriInterface $uri2, $normalizations = self::PRESERVING_NORMALIZATIONS): bool` 0735 0736 Whether two URIs can be considered equivalent. Both URIs are normalized automatically before comparison with the given 0737 `$normalizations` bitmask. The method also accepts relative URI references and returns true when they are equivalent. 0738 This of course assumes they will be resolved against the same base URI. If this is not the case, determination of 0739 equivalence or difference of relative references does not mean anything.