You are here

public static function UriNormalizer::normalize in Lockr 7.3

Returns a normalized URI.

The scheme and host component are already normalized to lowercase per PSR-7 UriInterface. This methods adds additional normalizations that can be configured with the $flags parameter.

PSR-7 UriInterface cannot distinguish between an empty component and a missing component as getQuery(), getFragment() etc. always return a string. This means the URIs "/?#" and "/" are treated equivalent which is not necessarily true according to RFC 3986. But that difference is highly uncommon in reality. So this potential normalization is implied in PSR-7 as well.

@link https://tools.ietf.org/html/rfc3986#section-6.2

Parameters

UriInterface $uri The URI to normalize:

int $flags A bitmask of normalizations to apply, see constants:

Return value

UriInterface The normalized URI

1 call to UriNormalizer::normalize()
UriNormalizer::isEquivalent in vendor/guzzlehttp/psr7/src/UriNormalizer.php
Whether two URIs can be considered equivalent.

File

vendor/guzzlehttp/psr7/src/UriNormalizer.php, line 119

Class

UriNormalizer
Provides methods to normalize and compare URIs.

Namespace

GuzzleHttp\Psr7

Code

public static function normalize(UriInterface $uri, $flags = self::PRESERVING_NORMALIZATIONS) {
  if ($flags & self::CAPITALIZE_PERCENT_ENCODING) {
    $uri = self::capitalizePercentEncoding($uri);
  }
  if ($flags & self::DECODE_UNRESERVED_CHARACTERS) {
    $uri = self::decodeUnreservedCharacters($uri);
  }
  if ($flags & self::CONVERT_EMPTY_PATH && $uri
    ->getPath() === '' && ($uri
    ->getScheme() === 'http' || $uri
    ->getScheme() === 'https')) {
    $uri = $uri
      ->withPath('/');
  }
  if ($flags & self::REMOVE_DEFAULT_HOST && $uri
    ->getScheme() === 'file' && $uri
    ->getHost() === 'localhost') {
    $uri = $uri
      ->withHost('');
  }
  if ($flags & self::REMOVE_DEFAULT_PORT && $uri
    ->getPort() !== null && Uri::isDefaultPort($uri)) {
    $uri = $uri
      ->withPort(null);
  }
  if ($flags & self::REMOVE_DOT_SEGMENTS && !Uri::isRelativePathReference($uri)) {
    $uri = $uri
      ->withPath(UriResolver::removeDotSegments($uri
      ->getPath()));
  }
  if ($flags & self::REMOVE_DUPLICATE_SLASHES) {
    $uri = $uri
      ->withPath(preg_replace('#//++#', '/', $uri
      ->getPath()));
  }
  if ($flags & self::SORT_QUERY_PARAMETERS && $uri
    ->getQuery() !== '') {
    $queryKeyValues = explode('&', $uri
      ->getQuery());
    sort($queryKeyValues);
    $uri = $uri
      ->withQuery(implode('&', $queryKeyValues));
  }
  return $uri;
}