| Index: sdk/lib/core/uri.dart
|
| diff --git a/sdk/lib/core/uri.dart b/sdk/lib/core/uri.dart
|
| index 4ce1c17f64b89ec1deaabb803d08b22e90298451..2493a029ea5a682e9746e098386b4c4e425bbd6d 100644
|
| --- a/sdk/lib/core/uri.dart
|
| +++ b/sdk/lib/core/uri.dart
|
| @@ -118,15 +118,16 @@ abstract class Uri {
|
| * general delimiters, are escaped if necessary.
|
| * If `fragment` is omitted or `null`, the URI has no fragment part.
|
| */
|
| - factory Uri({String scheme,
|
| - String userInfo,
|
| - String host,
|
| - int port,
|
| - String path,
|
| - Iterable<String> pathSegments,
|
| - String query,
|
| - Map<String, dynamic/*String|Iterable<String>*/> queryParameters,
|
| - String fragment}) = _Uri;
|
| + factory Uri(
|
| + {String scheme,
|
| + String userInfo,
|
| + String host,
|
| + int port,
|
| + String path,
|
| + Iterable<String> pathSegments,
|
| + String query,
|
| + Map<String, dynamic /*String|Iterable<String>*/ > queryParameters,
|
| + String fragment}) = _Uri;
|
|
|
| /**
|
| * Creates a new `http` URI from authority, path and query.
|
| @@ -161,9 +162,8 @@ abstract class Uri {
|
| * The `query` component is set from the optional [queryParameters]
|
| * argument.
|
| */
|
| - factory Uri.http(String authority,
|
| - String unencodedPath,
|
| - [Map<String, String> queryParameters]) = _Uri.http;
|
| + factory Uri.http(String authority, String unencodedPath,
|
| + [Map<String, String> queryParameters]) = _Uri.http;
|
|
|
| /**
|
| * Creates a new `https` URI from authority, path and query.
|
| @@ -171,9 +171,8 @@ abstract class Uri {
|
| * This constructor is the same as [Uri.http] except for the scheme
|
| * which is set to `https`.
|
| */
|
| - factory Uri.https(String authority,
|
| - String unencodedPath,
|
| - [Map<String, String> queryParameters]) = _Uri.https;
|
| + factory Uri.https(String authority, String unencodedPath,
|
| + [Map<String, String> queryParameters]) = _Uri.https;
|
|
|
| /**
|
| * Creates a new file URI from an absolute or relative file path.
|
| @@ -298,15 +297,15 @@ abstract class Uri {
|
| * To read the content back, use [UriData.contentAsString].
|
| */
|
| factory Uri.dataFromString(String content,
|
| - {String mimeType,
|
| - Encoding encoding,
|
| - Map<String, String> parameters,
|
| - bool base64: false}) {
|
| - UriData data = new UriData.fromString(content,
|
| - mimeType: mimeType,
|
| - encoding: encoding,
|
| - parameters: parameters,
|
| - base64: base64);
|
| + {String mimeType,
|
| + Encoding encoding,
|
| + Map<String, String> parameters,
|
| + bool base64: false}) {
|
| + UriData data = new UriData.fromString(content,
|
| + mimeType: mimeType,
|
| + encoding: encoding,
|
| + parameters: parameters,
|
| + base64: base64);
|
| return data.uri;
|
| }
|
|
|
| @@ -327,13 +326,13 @@ abstract class Uri {
|
| * encoded.
|
| */
|
| factory Uri.dataFromBytes(List<int> bytes,
|
| - {mimeType: "application/octet-stream",
|
| - Map<String, String> parameters,
|
| - percentEncoded: false}) {
|
| + {mimeType: "application/octet-stream",
|
| + Map<String, String> parameters,
|
| + percentEncoded: false}) {
|
| UriData data = new UriData.fromBytes(bytes,
|
| - mimeType: mimeType,
|
| - parameters: parameters,
|
| - percentEncoded: percentEncoded);
|
| + mimeType: mimeType,
|
| + parameters: parameters,
|
| + percentEncoded: percentEncoded);
|
| return data.uri;
|
| }
|
|
|
| @@ -614,7 +613,7 @@ abstract class Uri {
|
| int get hashCode;
|
|
|
| /// A URI is equal to another URI with the same normalized representation.
|
| - bool operator==(Object other);
|
| + bool operator ==(Object other);
|
|
|
| /// Returns the normalized string representation of the URI.
|
| String toString();
|
| @@ -659,15 +658,16 @@ abstract class Uri {
|
| * call above, but may also be slightly faster because the parts taken
|
| * from this `Uri` need not be checked for validity again.
|
| */
|
| - Uri replace({String scheme,
|
| - String userInfo,
|
| - String host,
|
| - int port,
|
| - String path,
|
| - Iterable<String> pathSegments,
|
| - String query,
|
| - Map<String, dynamic/*String|Iterable<String>*/> queryParameters,
|
| - String fragment});
|
| + Uri replace(
|
| + {String scheme,
|
| + String userInfo,
|
| + String host,
|
| + int port,
|
| + String path,
|
| + Iterable<String> pathSegments,
|
| + String query,
|
| + Map<String, dynamic /*String|Iterable<String>*/ > queryParameters,
|
| + String fragment});
|
|
|
| /**
|
| * Returns a `Uri` that differs from this only in not having a fragment.
|
| @@ -803,7 +803,7 @@ abstract class Uri {
|
| // The following index-normalization belongs with the scanning, but is
|
| // easier to do here because we already have extracted variables from the
|
| // indices list.
|
| - var indices = new List<int>(8);//new List<int>.filled(8, start - 1);
|
| + var indices = new List<int>(8);
|
|
|
| // Set default values for each position.
|
| // The value will either be correct in some cases where it isn't set
|
| @@ -839,10 +839,10 @@ abstract class Uri {
|
| // `/` is part of the path or is leading an authority component when we see
|
| // the next character.
|
|
|
| - int hostStart = indices[_hostStartIndex] + 1;
|
| - int portStart = indices[_portStartIndex];
|
| - int pathStart = indices[_pathStartIndex];
|
| - int queryStart = indices[_queryStartIndex];
|
| + int hostStart = indices[_hostStartIndex] + 1;
|
| + int portStart = indices[_portStartIndex];
|
| + int pathStart = indices[_pathStartIndex];
|
| + int queryStart = indices[_queryStartIndex];
|
| int fragmentStart = indices[_fragmentStartIndex];
|
|
|
| // We may discover scheme while handling special cases.
|
| @@ -884,10 +884,10 @@ abstract class Uri {
|
| // Pathological case, don't bother correcting it.
|
| isSimple = false;
|
| } else if (queryStart < end &&
|
| - (queryStart == pathStart + 2 &&
|
| + (queryStart == pathStart + 2 &&
|
| uri.startsWith("..", pathStart)) ||
|
| - (queryStart > pathStart + 2 &&
|
| - uri.startsWith("/..", queryStart - 3))) {
|
| + (queryStart > pathStart + 2 &&
|
| + uri.startsWith("/..", queryStart - 3))) {
|
| // The path ends in a ".." segment. This should be normalized to "../".
|
| // We didn't detect this while scanning because a query or fragment was
|
| // detected at the same time (which is why we only need to check this
|
| @@ -929,7 +929,7 @@ abstract class Uri {
|
| end += 1;
|
| } else {
|
| uri = "${uri.substring(start, pathStart)}/"
|
| - "${uri.substring(queryStart, end)}";
|
| + "${uri.substring(queryStart, end)}";
|
| schemeEnd -= start;
|
| hostStart -= start;
|
| portStart -= start;
|
| @@ -943,7 +943,8 @@ abstract class Uri {
|
| } else if (uri.startsWith("http", start)) {
|
| scheme = "http";
|
| // HTTP URIs should not have an explicit port of 80.
|
| - if (portStart > start && portStart + 3 == pathStart &&
|
| + if (portStart > start &&
|
| + portStart + 3 == pathStart &&
|
| uri.startsWith("80", portStart + 1)) {
|
| if (start == 0 && end == uri.length) {
|
| uri = uri.replaceRange(portStart, pathStart, "");
|
| @@ -953,7 +954,7 @@ abstract class Uri {
|
| end -= 3;
|
| } else {
|
| uri = uri.substring(start, portStart) +
|
| - uri.substring(pathStart, end);
|
| + uri.substring(pathStart, end);
|
| schemeEnd -= start;
|
| hostStart -= start;
|
| portStart -= start;
|
| @@ -968,7 +969,8 @@ abstract class Uri {
|
| } else if (schemeEnd == start + 5 && uri.startsWith("https", start)) {
|
| scheme = "https";
|
| // HTTPS URIs should not have an explicit port of 443.
|
| - if (portStart > start && portStart + 4 == pathStart &&
|
| + if (portStart > start &&
|
| + portStart + 4 == pathStart &&
|
| uri.startsWith("443", portStart + 1)) {
|
| if (start == 0 && end == uri.length) {
|
| uri = uri.replaceRange(portStart, pathStart, "");
|
| @@ -978,7 +980,7 @@ abstract class Uri {
|
| end -= 3;
|
| } else {
|
| uri = uri.substring(start, portStart) +
|
| - uri.substring(pathStart, end);
|
| + uri.substring(pathStart, end);
|
| schemeEnd -= start;
|
| hostStart -= start;
|
| portStart -= start;
|
| @@ -1004,12 +1006,11 @@ abstract class Uri {
|
| fragmentStart -= start;
|
| }
|
| return new _SimpleUri(uri, schemeEnd, hostStart, portStart, pathStart,
|
| - queryStart, fragmentStart, scheme);
|
| -
|
| + queryStart, fragmentStart, scheme);
|
| }
|
|
|
| return new _Uri.notSimple(uri, start, end, schemeEnd, hostStart, portStart,
|
| - pathStart, queryStart, fragmentStart, scheme);
|
| + pathStart, queryStart, fragmentStart, scheme);
|
| }
|
|
|
| /**
|
| @@ -1070,7 +1071,7 @@ abstract class Uri {
|
| * details.
|
| */
|
| static String encodeQueryComponent(String component,
|
| - {Encoding encoding: UTF8}) {
|
| + {Encoding encoding: UTF8}) {
|
| return _Uri._uriEncode(_Uri._unreservedTable, component, encoding, true);
|
| }
|
|
|
| @@ -1088,8 +1089,8 @@ abstract class Uri {
|
| * decoded component.
|
| */
|
| static String decodeComponent(String encodedComponent) {
|
| - return _Uri._uriDecode(encodedComponent, 0, encodedComponent.length,
|
| - UTF8, false);
|
| + return _Uri._uriDecode(
|
| + encodedComponent, 0, encodedComponent.length, UTF8, false);
|
| }
|
|
|
| /**
|
| @@ -1100,11 +1101,10 @@ abstract class Uri {
|
| * [encoding] to decode the byte-list to a String. The default encoding is
|
| * UTF-8.
|
| */
|
| - static String decodeQueryComponent(
|
| - String encodedComponent,
|
| + static String decodeQueryComponent(String encodedComponent,
|
| {Encoding encoding: UTF8}) {
|
| - return _Uri._uriDecode(encodedComponent, 0, encodedComponent.length,
|
| - encoding, true);
|
| + return _Uri._uriDecode(
|
| + encodedComponent, 0, encodedComponent.length, encoding, true);
|
| }
|
|
|
| /**
|
| @@ -1146,7 +1146,7 @@ abstract class Uri {
|
| * is UTF-8.
|
| */
|
| static Map<String, String> splitQueryString(String query,
|
| - {Encoding encoding: UTF8}) {
|
| + {Encoding encoding: UTF8}) {
|
| return query.split("&").fold({}, (map, element) {
|
| int index = element.indexOf("=");
|
| if (index == -1) {
|
| @@ -1163,7 +1163,6 @@ abstract class Uri {
|
| });
|
| }
|
|
|
| -
|
| /**
|
| * Parse the [host] as an IP version 4 (IPv4) address, returning the address
|
| * as a list of 4 bytes in network byte order (big endian).
|
| @@ -1172,7 +1171,7 @@ abstract class Uri {
|
| * representation.
|
| */
|
| static List<int> parseIPv4Address(String host) =>
|
| - _parseIPv4Address(host, 0, host.length);
|
| + _parseIPv4Address(host, 0, host.length);
|
|
|
| /// Implementation of [parseIPv4Address] that can work on a substring.
|
| static List<int> _parseIPv4Address(String host, int start, int end) {
|
| @@ -1413,22 +1412,25 @@ class _Uri implements Uri {
|
| /// component of that type.
|
| ///
|
| /// The [path] and [scheme] are never empty.
|
| - _Uri._internal(this.scheme,
|
| - this._userInfo,
|
| - this._host,
|
| - this._port,
|
| - this.path,
|
| - this._query,
|
| - this._fragment);
|
| + _Uri._internal(this.scheme, this._userInfo, this._host, this._port, this.path,
|
| + this._query, this._fragment);
|
|
|
| /// Create a [_Uri] from parts of [uri].
|
| ///
|
| /// The parameters specify the start/end of particular components of the URI.
|
| /// The [scheme] may contain a string representing a normalized scheme
|
| /// component if one has already been discovered.
|
| - factory _Uri.notSimple(String uri, int start, int end, int schemeEnd,
|
| - int hostStart, int portStart, int pathStart,
|
| - int queryStart, int fragmentStart, String scheme) {
|
| + factory _Uri.notSimple(
|
| + String uri,
|
| + int start,
|
| + int end,
|
| + int schemeEnd,
|
| + int hostStart,
|
| + int portStart,
|
| + int pathStart,
|
| + int queryStart,
|
| + int fragmentStart,
|
| + String scheme) {
|
| if (scheme == null) {
|
| scheme = "";
|
| if (schemeEnd > start) {
|
| @@ -1454,8 +1456,8 @@ class _Uri implements Uri {
|
| port = _makePort(port, scheme);
|
| }
|
| }
|
| - String path = _makePath(uri, pathStart, queryStart, null,
|
| - scheme, host != null);
|
| + String path =
|
| + _makePath(uri, pathStart, queryStart, null, scheme, host != null);
|
| String query;
|
| if (queryStart < fragmentStart) {
|
| query = _makeQuery(uri, queryStart + 1, fragmentStart, null);
|
| @@ -1464,25 +1466,21 @@ class _Uri implements Uri {
|
| if (fragmentStart < end) {
|
| fragment = _makeFragment(uri, fragmentStart + 1, end);
|
| }
|
| - return new _Uri._internal(scheme,
|
| - userInfo,
|
| - host,
|
| - port,
|
| - path,
|
| - query,
|
| - fragment);
|
| + return new _Uri._internal(
|
| + scheme, userInfo, host, port, path, query, fragment);
|
| }
|
|
|
| /// Implementation of [Uri.Uri].
|
| - factory _Uri({String scheme,
|
| - String userInfo,
|
| - String host,
|
| - int port,
|
| - String path,
|
| - Iterable<String> pathSegments,
|
| - String query,
|
| - Map<String, dynamic/*String|Iterable<String>*/> queryParameters,
|
| - String fragment}) {
|
| + factory _Uri(
|
| + {String scheme,
|
| + String userInfo,
|
| + String host,
|
| + int port,
|
| + String path,
|
| + Iterable<String> pathSegments,
|
| + String query,
|
| + Map<String, dynamic /*String|Iterable<String>*/ > queryParameters,
|
| + String fragment}) {
|
| scheme = _makeScheme(scheme, 0, _stringOrNullLength(scheme));
|
| userInfo = _makeUserInfo(userInfo, 0, _stringOrNullLength(userInfo));
|
| host = _makeHost(host, 0, _stringOrNullLength(host), false);
|
| @@ -1492,13 +1490,12 @@ class _Uri implements Uri {
|
| fragment = _makeFragment(fragment, 0, _stringOrNullLength(fragment));
|
| port = _makePort(port, scheme);
|
| bool isFile = (scheme == "file");
|
| - if (host == null &&
|
| - (userInfo.isNotEmpty || port != null || isFile)) {
|
| + if (host == null && (userInfo.isNotEmpty || port != null || isFile)) {
|
| host = "";
|
| }
|
| bool hasAuthority = (host != null);
|
| - path = _makePath(path, 0, _stringOrNullLength(path), pathSegments,
|
| - scheme, hasAuthority);
|
| + path = _makePath(
|
| + path, 0, _stringOrNullLength(path), pathSegments, scheme, hasAuthority);
|
| if (scheme.isEmpty && host == null && !path.startsWith('/')) {
|
| bool allowScheme = scheme.isNotEmpty || host != null;
|
| path = _normalizeRelativePath(path, allowScheme);
|
| @@ -1508,21 +1505,19 @@ class _Uri implements Uri {
|
| if (host == null && path.startsWith("//")) {
|
| host = "";
|
| }
|
| - return new _Uri._internal(scheme, userInfo, host, port,
|
| - path, query, fragment);
|
| + return new _Uri._internal(
|
| + scheme, userInfo, host, port, path, query, fragment);
|
| }
|
|
|
| /// Implementation of [Uri.http].
|
| - factory _Uri.http(String authority,
|
| - String unencodedPath,
|
| - [Map<String, String> queryParameters]) {
|
| + factory _Uri.http(String authority, String unencodedPath,
|
| + [Map<String, String> queryParameters]) {
|
| return _makeHttpUri("http", authority, unencodedPath, queryParameters);
|
| }
|
|
|
| /// Implementation of [Uri.https].
|
| - factory _Uri.https(String authority,
|
| - String unencodedPath,
|
| - [Map<String, String> queryParameters]) {
|
| + factory _Uri.https(String authority, String unencodedPath,
|
| + [Map<String, String> queryParameters]) {
|
| return _makeHttpUri("https", authority, unencodedPath, queryParameters);
|
| }
|
|
|
| @@ -1602,10 +1597,8 @@ class _Uri implements Uri {
|
| throw new FormatException(message, uri, index);
|
| }
|
|
|
| - static Uri _makeHttpUri(String scheme,
|
| - String authority,
|
| - String unencodedPath,
|
| - Map<String, String> queryParameters) {
|
| + static Uri _makeHttpUri(String scheme, String authority, String unencodedPath,
|
| + Map<String, String> queryParameters) {
|
| var userInfo = "";
|
| var host = null;
|
| var port = null;
|
| @@ -1631,15 +1624,15 @@ class _Uri implements Uri {
|
| if (authority.codeUnitAt(hostEnd) == _RIGHT_BRACKET) break;
|
| }
|
| if (hostEnd == authority.length) {
|
| - throw new FormatException("Invalid IPv6 host entry.",
|
| - authority, hostStart);
|
| + throw new FormatException(
|
| + "Invalid IPv6 host entry.", authority, hostStart);
|
| }
|
| Uri.parseIPv6Address(authority, hostStart + 1, hostEnd);
|
| - hostEnd++; // Skip the closing bracket.
|
| + hostEnd++; // Skip the closing bracket.
|
| if (hostEnd != authority.length &&
|
| authority.codeUnitAt(hostEnd) != _COLON) {
|
| - throw new FormatException("Invalid end of authority",
|
| - authority, hostEnd);
|
| + throw new FormatException(
|
| + "Invalid end of authority", authority, hostEnd);
|
| }
|
| }
|
| // Split host and port.
|
| @@ -1654,34 +1647,34 @@ class _Uri implements Uri {
|
| }
|
| host = authority.substring(hostStart, hostEnd);
|
| }
|
| - return new Uri(scheme: scheme,
|
| - userInfo: userInfo,
|
| - host: host,
|
| - port: port,
|
| - pathSegments: unencodedPath.split("/"),
|
| - queryParameters: queryParameters);
|
| + return new Uri(
|
| + scheme: scheme,
|
| + userInfo: userInfo,
|
| + host: host,
|
| + port: port,
|
| + pathSegments: unencodedPath.split("/"),
|
| + queryParameters: queryParameters);
|
| }
|
|
|
| /// Implementation of [Uri.file].
|
| factory _Uri.file(String path, {bool windows}) {
|
| windows = (windows == null) ? _Uri._isWindows : windows;
|
| - return windows ? _makeWindowsFileUrl(path, false)
|
| - : _makeFileUri(path, false);
|
| + return windows
|
| + ? _makeWindowsFileUrl(path, false)
|
| + : _makeFileUri(path, false);
|
| }
|
|
|
| /// Implementation of [Uri.directory].
|
| factory _Uri.directory(String path, {bool windows}) {
|
| windows = (windows == null) ? _Uri._isWindows : windows;
|
| - return windows ? _makeWindowsFileUrl(path, true)
|
| - : _makeFileUri(path, true);
|
| + return windows ? _makeWindowsFileUrl(path, true) : _makeFileUri(path, true);
|
| }
|
|
|
| -
|
| /// Used internally in path-related constructors.
|
| external static bool get _isWindows;
|
|
|
| - static _checkNonWindowsPathReservedCharacters(List<String> segments,
|
| - bool argumentError) {
|
| + static _checkNonWindowsPathReservedCharacters(
|
| + List<String> segments, bool argumentError) {
|
| segments.forEach((segment) {
|
| if (segment.contains("/")) {
|
| if (argumentError) {
|
| @@ -1693,9 +1686,9 @@ class _Uri implements Uri {
|
| });
|
| }
|
|
|
| - static _checkWindowsPathReservedCharacters(List<String> segments,
|
| - bool argumentError,
|
| - [int firstSegment = 0]) {
|
| + static _checkWindowsPathReservedCharacters(
|
| + List<String> segments, bool argumentError,
|
| + [int firstSegment = 0]) {
|
| for (var segment in segments.skip(firstSegment)) {
|
| if (segment.contains(new RegExp(r'["*/:<>?\\|]'))) {
|
| if (argumentError) {
|
| @@ -1713,21 +1706,19 @@ class _Uri implements Uri {
|
| return;
|
| }
|
| if (argumentError) {
|
| - throw new ArgumentError("Illegal drive letter " +
|
| - new String.fromCharCode(charCode));
|
| + throw new ArgumentError(
|
| + "Illegal drive letter " + new String.fromCharCode(charCode));
|
| } else {
|
| - throw new UnsupportedError("Illegal drive letter " +
|
| - new String.fromCharCode(charCode));
|
| + throw new UnsupportedError(
|
| + "Illegal drive letter " + new String.fromCharCode(charCode));
|
| }
|
| }
|
|
|
| static _makeFileUri(String path, bool slashTerminated) {
|
| const String sep = "/";
|
| var segments = path.split(sep);
|
| - if (slashTerminated &&
|
| - segments.isNotEmpty &&
|
| - segments.last.isNotEmpty) {
|
| - segments.add(""); // Extra separator at end.
|
| + if (slashTerminated && segments.isNotEmpty && segments.last.isNotEmpty) {
|
| + segments.add(""); // Extra separator at end.
|
| }
|
| if (path.startsWith(sep)) {
|
| // Absolute file:// URI.
|
| @@ -1763,9 +1754,8 @@ class _Uri implements Uri {
|
| }
|
| // Absolute file://C:/ URI.
|
| var pathSegments = path.split(sep);
|
| - if (slashTerminated &&
|
| - pathSegments.last.isNotEmpty) {
|
| - pathSegments.add(""); // Extra separator at end.
|
| + if (slashTerminated && pathSegments.last.isNotEmpty) {
|
| + pathSegments.add(""); // Extra separator at end.
|
| }
|
| _checkWindowsPathReservedCharacters(pathSegments, true, 1);
|
| return new Uri(scheme: "file", pathSegments: pathSegments);
|
| @@ -1777,22 +1767,19 @@ class _Uri implements Uri {
|
| int pathStart = path.indexOf(r'\', 2);
|
| String hostPart =
|
| (pathStart < 0) ? path.substring(2) : path.substring(2, pathStart);
|
| - String pathPart =
|
| - (pathStart < 0) ? "" : path.substring(pathStart + 1);
|
| + String pathPart = (pathStart < 0) ? "" : path.substring(pathStart + 1);
|
| var pathSegments = pathPart.split(sep);
|
| _checkWindowsPathReservedCharacters(pathSegments, true);
|
| - if (slashTerminated &&
|
| - pathSegments.last.isNotEmpty) {
|
| - pathSegments.add(""); // Extra separator at end.
|
| + if (slashTerminated && pathSegments.last.isNotEmpty) {
|
| + pathSegments.add(""); // Extra separator at end.
|
| }
|
| return new Uri(
|
| scheme: "file", host: hostPart, pathSegments: pathSegments);
|
| } else {
|
| // Absolute file:// URI.
|
| var pathSegments = path.split(sep);
|
| - if (slashTerminated &&
|
| - pathSegments.last.isNotEmpty) {
|
| - pathSegments.add(""); // Extra separator at end.
|
| + if (slashTerminated && pathSegments.last.isNotEmpty) {
|
| + pathSegments.add(""); // Extra separator at end.
|
| }
|
| _checkWindowsPathReservedCharacters(pathSegments, true);
|
| return new Uri(scheme: "file", pathSegments: pathSegments);
|
| @@ -1804,21 +1791,22 @@ class _Uri implements Uri {
|
| if (slashTerminated &&
|
| pathSegments.isNotEmpty &&
|
| pathSegments.last.isNotEmpty) {
|
| - pathSegments.add(""); // Extra separator at end.
|
| + pathSegments.add(""); // Extra separator at end.
|
| }
|
| return new Uri(pathSegments: pathSegments);
|
| }
|
| }
|
|
|
| - Uri replace({String scheme,
|
| - String userInfo,
|
| - String host,
|
| - int port,
|
| - String path,
|
| - Iterable<String> pathSegments,
|
| - String query,
|
| - Map<String, dynamic/*String|Iterable<String>*/> queryParameters,
|
| - String fragment}) {
|
| + Uri replace(
|
| + {String scheme,
|
| + String userInfo,
|
| + String host,
|
| + int port,
|
| + String path,
|
| + Iterable<String> pathSegments,
|
| + String query,
|
| + Map<String, dynamic /*String|Iterable<String>*/ > queryParameters,
|
| + String fragment}) {
|
| // Set to true if the scheme has (potentially) changed.
|
| // In that case, the default port may also have changed and we need
|
| // to check even the existing port.
|
| @@ -1854,8 +1842,8 @@ class _Uri implements Uri {
|
|
|
| bool hasAuthority = host != null;
|
| if (path != null || pathSegments != null) {
|
| - path = _makePath(path, 0, _stringOrNullLength(path), pathSegments,
|
| - scheme, hasAuthority);
|
| + path = _makePath(path, 0, _stringOrNullLength(path), pathSegments, scheme,
|
| + hasAuthority);
|
| } else {
|
| path = this.path;
|
| if ((isFile || (hasAuthority && !path.isEmpty)) &&
|
| @@ -1882,8 +1870,8 @@ class _Uri implements Uri {
|
|
|
| Uri removeFragment() {
|
| if (!this.hasFragment) return this;
|
| - return new _Uri._internal(scheme, _userInfo, _host, _port,
|
| - path, _query, null);
|
| + return new _Uri._internal(
|
| + scheme, _userInfo, _host, _port, path, _query, null);
|
| }
|
|
|
| List<String> get pathSegments {
|
| @@ -1895,9 +1883,9 @@ class _Uri implements Uri {
|
| pathToSplit = pathToSplit.substring(1);
|
| }
|
| result = (pathToSplit == "")
|
| - ? const<String>[]
|
| + ? const <String>[]
|
| : new List<String>.unmodifiable(
|
| - pathToSplit.split("/").map(Uri.decodeComponent));
|
| + pathToSplit.split("/").map(Uri.decodeComponent));
|
| _pathSegments = result;
|
| return result;
|
| }
|
| @@ -2096,9 +2084,7 @@ class _Uri implements Uri {
|
| }
|
|
|
| static String _makePath(String path, int start, int end,
|
| - Iterable<String> pathSegments,
|
| - String scheme,
|
| - bool hasAuthority) {
|
| + Iterable<String> pathSegments, String scheme, bool hasAuthority) {
|
| bool isFile = (scheme == "file");
|
| bool ensureLeadingSlash = isFile || hasAuthority;
|
| if (path == null && pathSegments == null) return isFile ? "/" : "";
|
| @@ -2109,8 +2095,9 @@ class _Uri implements Uri {
|
| if (path != null) {
|
| result = _normalizeOrSubstring(path, start, end, _pathCharOrSlashTable);
|
| } else {
|
| - result = pathSegments.map((s) =>
|
| - _uriEncode(_pathCharTable, s, UTF8, false)).join("/");
|
| + result = pathSegments
|
| + .map((s) => _uriEncode(_pathCharTable, s, UTF8, false))
|
| + .join("/");
|
| }
|
| if (result.isEmpty) {
|
| if (isFile) return "/";
|
| @@ -2133,9 +2120,8 @@ class _Uri implements Uri {
|
| return _removeDotSegments(path);
|
| }
|
|
|
| - static String _makeQuery(
|
| - String query, int start, int end,
|
| - Map<String, dynamic/*String|Iterable<String>*/> queryParameters) {
|
| + static String _makeQuery(String query, int start, int end,
|
| + Map<String, dynamic /*String|Iterable<String>*/ > queryParameters) {
|
| if (query != null) {
|
| if (queryParameters != null) {
|
| throw new ArgumentError('Both query and queryParameters specified');
|
| @@ -2191,14 +2177,14 @@ class _Uri implements Uri {
|
| static String _normalizeEscape(String source, int index, bool lowerCase) {
|
| assert(source.codeUnitAt(index) == _PERCENT);
|
| if (index + 2 >= source.length) {
|
| - return "%"; // Marks the escape as invalid.
|
| + return "%"; // Marks the escape as invalid.
|
| }
|
| int firstDigit = source.codeUnitAt(index + 1);
|
| int secondDigit = source.codeUnitAt(index + 2);
|
| int firstDigitValue = hexDigitValue(firstDigit);
|
| int secondDigitValue = hexDigitValue(secondDigit);
|
| if (firstDigitValue < 0 || secondDigitValue < 0) {
|
| - return "%"; // Marks the escape as invalid.
|
| + return "%"; // Marks the escape as invalid.
|
| }
|
| int value = firstDigitValue * 16 + secondDigitValue;
|
| if (_isUnreservedChar(value)) {
|
| @@ -2217,7 +2203,7 @@ class _Uri implements Uri {
|
| }
|
|
|
| static String _escapeChar(int char) {
|
| - assert(char <= 0x10ffff); // It's a valid unicode code point.
|
| + assert(char <= 0x10ffff); // It's a valid unicode code point.
|
| List<int> codeUnits;
|
| if (char < 0x80) {
|
| // ASCII, a single percent encoded sequence.
|
| @@ -2227,7 +2213,7 @@ class _Uri implements Uri {
|
| codeUnits[2] = _hexDigits.codeUnitAt(char & 0xf);
|
| } else {
|
| // Do UTF-8 encoding of character, then percent encode bytes.
|
| - int flag = 0xc0; // The high-bit markers on the first byte of UTF-8.
|
| + int flag = 0xc0; // The high-bit markers on the first byte of UTF-8.
|
| int encodedBytes = 2;
|
| if (char > 0x7ff) {
|
| flag = 0xe0;
|
| @@ -2245,7 +2231,7 @@ class _Uri implements Uri {
|
| codeUnits[index + 1] = _hexDigits.codeUnitAt(byte >> 4);
|
| codeUnits[index + 2] = _hexDigits.codeUnitAt(byte & 0xf);
|
| index += 3;
|
| - flag = 0x80; // Following bytes have only high bit set.
|
| + flag = 0x80; // Following bytes have only high bit set.
|
| }
|
| }
|
| return new String.fromCharCodes(codeUnits);
|
| @@ -2257,8 +2243,8 @@ class _Uri implements Uri {
|
| * If [_normalize] returns `null` (original content is already normalized),
|
| * this methods returns the substring if [component] from [start] to [end].
|
| */
|
| - static String _normalizeOrSubstring(String component, int start, int end,
|
| - List<int> charTable) {
|
| + static String _normalizeOrSubstring(
|
| + String component, int start, int end, List<int> charTable) {
|
| return _normalize(component, start, end, charTable) ??
|
| component.substring(start, end);
|
| }
|
| @@ -2274,9 +2260,9 @@ class _Uri implements Uri {
|
| *
|
| * Returns `null` if the original content was already normalized.
|
| */
|
| - static String _normalize(String component, int start, int end,
|
| - List<int> charTable,
|
| - {bool escapeDelimiters = false}) {
|
| + static String _normalize(
|
| + String component, int start, int end, List<int> charTable,
|
| + {bool escapeDelimiters = false}) {
|
| StringBuffer buffer;
|
| int sectionStart = start;
|
| int index = start;
|
| @@ -2378,8 +2364,8 @@ class _Uri implements Uri {
|
| baseEnd = newEnd;
|
| backCount--;
|
| }
|
| - return base.replaceRange(baseEnd + 1, null,
|
| - reference.substring(refStart - 3 * backCount));
|
| + return base.replaceRange(
|
| + baseEnd + 1, null, reference.substring(refStart - 3 * backCount));
|
| }
|
|
|
| /// Make a guess at whether a path contains a `..` or `.` segment.
|
| @@ -2400,7 +2386,7 @@ class _Uri implements Uri {
|
| /// and it treats the path as if it is absolute (leading '..' are removed).
|
| static String _removeDotSegments(String path) {
|
| if (!_mayContainDotSegments(path)) return path;
|
| - assert(path.isNotEmpty); // An empty path would not have dot segments.
|
| + assert(path.isNotEmpty); // An empty path would not have dot segments.
|
| List<String> output = [];
|
| bool appendSlash = false;
|
| for (String segment in path.split("/")) {
|
| @@ -2435,12 +2421,12 @@ class _Uri implements Uri {
|
| /// when you resolve it against a base URI with a path with a non-empty
|
| /// final segment.
|
| static String _normalizeRelativePath(String path, bool allowScheme) {
|
| - assert(!path.startsWith('/')); // Only get called for relative paths.
|
| + assert(!path.startsWith('/')); // Only get called for relative paths.
|
| if (!_mayContainDotSegments(path)) {
|
| if (!allowScheme) path = _escapeScheme(path);
|
| return path;
|
| }
|
| - assert(path.isNotEmpty); // An empty path would not have dot segments.
|
| + assert(path.isNotEmpty); // An empty path would not have dot segments.
|
| List<String> output = [];
|
| bool appendSlash = false;
|
| for (String segment in path.split("/")) {
|
| @@ -2511,8 +2497,8 @@ class _Uri implements Uri {
|
| if (reference.hasAuthority) {
|
| targetUserInfo = reference.userInfo;
|
| targetHost = reference.host;
|
| - targetPort = _makePort(reference.hasPort ? reference.port : null,
|
| - targetScheme);
|
| + targetPort =
|
| + _makePort(reference.hasPort ? reference.port : null, targetScheme);
|
| targetPath = _removeDotSegments(reference.path);
|
| if (reference.hasQuery) targetQuery = reference.query;
|
| } else {
|
| @@ -2554,8 +2540,8 @@ class _Uri implements Uri {
|
| // If both base and reference are relative paths,
|
| // allow the merged path to start with "..".
|
| // The RFC only specifies the case where the base has a scheme.
|
| - targetPath = _normalizeRelativePath(mergedPath,
|
| - this.hasScheme || this.hasAuthority);
|
| + targetPath = _normalizeRelativePath(
|
| + mergedPath, this.hasScheme || this.hasAuthority);
|
| }
|
| }
|
| }
|
| @@ -2564,13 +2550,8 @@ class _Uri implements Uri {
|
| }
|
| }
|
| String fragment = reference.hasFragment ? reference.fragment : null;
|
| - return new _Uri._internal(targetScheme,
|
| - targetUserInfo,
|
| - targetHost,
|
| - targetPort,
|
| - targetPath,
|
| - targetQuery,
|
| - fragment);
|
| + return new _Uri._internal(targetScheme, targetUserInfo, targetHost,
|
| + targetPort, targetPath, targetQuery, fragment);
|
| }
|
|
|
| bool get hasScheme => scheme.isNotEmpty;
|
| @@ -2593,7 +2574,7 @@ class _Uri implements Uri {
|
| }
|
| if (scheme != "http" && scheme != "https") {
|
| throw new StateError(
|
| - "Origin is only applicable schemes http and https: $this");
|
| + "Origin is only applicable schemes http and https: $this");
|
| }
|
| if (_host == null || _host == "") {
|
| throw new StateError(
|
| @@ -2708,20 +2689,20 @@ class _Uri implements Uri {
|
| return sb.toString();
|
| }
|
|
|
| - bool operator==(other) {
|
| + bool operator ==(other) {
|
| if (identical(this, other)) return true;
|
| if (other is Uri) {
|
| Uri uri = other;
|
| - return scheme == uri.scheme &&
|
| - hasAuthority == uri.hasAuthority &&
|
| - userInfo == uri.userInfo &&
|
| - host == uri.host &&
|
| - port == uri.port &&
|
| - path == uri.path &&
|
| - hasQuery == uri.hasQuery &&
|
| - query == uri.query &&
|
| - hasFragment == uri.hasFragment &&
|
| - fragment == uri.fragment;
|
| + return scheme == uri.scheme &&
|
| + hasAuthority == uri.hasAuthority &&
|
| + userInfo == uri.userInfo &&
|
| + host == uri.host &&
|
| + port == uri.port &&
|
| + path == uri.path &&
|
| + hasQuery == uri.hasQuery &&
|
| + query == uri.query &&
|
| + hasFragment == uri.hasFragment &&
|
| + fragment == uri.fragment;
|
| }
|
| return false;
|
| }
|
| @@ -2732,8 +2713,7 @@ class _Uri implements Uri {
|
|
|
| static List _createList() => [];
|
|
|
| - static Map _splitQueryStringAll(
|
| - String query, {Encoding encoding: UTF8}) {
|
| + static Map _splitQueryStringAll(String query, {Encoding encoding: UTF8}) {
|
| Map result = {};
|
| int i = 0;
|
| int start = 0;
|
| @@ -2744,7 +2724,7 @@ class _Uri implements Uri {
|
| String value;
|
| if (start == end) return;
|
| if (equalsIndex < 0) {
|
| - key = _uriDecode(query, start, end, encoding, true);
|
| + key = _uriDecode(query, start, end, encoding, true);
|
| value = "";
|
| } else {
|
| key = _uriDecode(query, start, equalsIndex, encoding, true);
|
| @@ -2768,10 +2748,8 @@ class _Uri implements Uri {
|
| return result;
|
| }
|
|
|
| - external static String _uriEncode(List<int> canonicalTable,
|
| - String text,
|
| - Encoding encoding,
|
| - bool spaceToPlus);
|
| + external static String _uriEncode(List<int> canonicalTable, String text,
|
| + Encoding encoding, bool spaceToPlus);
|
|
|
| /**
|
| * Convert a byte (2 character hex sequence) in string [s] starting
|
| @@ -2808,11 +2786,8 @@ class _Uri implements Uri {
|
| * The decoder will create a byte-list of the percent-encoded parts, and then
|
| * decode the byte-list using [encoding]. The default encodings UTF-8.
|
| */
|
| - static String _uriDecode(String text,
|
| - int start,
|
| - int end,
|
| - Encoding encoding,
|
| - bool plusToSpace) {
|
| + static String _uriDecode(
|
| + String text, int start, int end, Encoding encoding, bool plusToSpace) {
|
| assert(0 <= start);
|
| assert(start <= end);
|
| assert(end <= text.length);
|
| @@ -2865,7 +2840,7 @@ class _Uri implements Uri {
|
|
|
| static bool _isUnreservedChar(int char) {
|
| return char < 127 &&
|
| - ((_unreservedTable[char >> 4] & (1 << (char & 0x0f))) != 0);
|
| + ((_unreservedTable[char >> 4] & (1 << (char & 0x0f))) != 0);
|
| }
|
|
|
| // Tables of char-codes organized as a bit vector of 128 bits where
|
| @@ -2874,248 +2849,259 @@ class _Uri implements Uri {
|
|
|
| // The unreserved characters of RFC 3986.
|
| static const _unreservedTable = const [
|
| - // LSB MSB
|
| - // | |
|
| - 0x0000, // 0x00 - 0x0f 0000000000000000
|
| - 0x0000, // 0x10 - 0x1f 0000000000000000
|
| - // -.
|
| - 0x6000, // 0x20 - 0x2f 0000000000000110
|
| - // 0123456789
|
| - 0x03ff, // 0x30 - 0x3f 1111111111000000
|
| - // ABCDEFGHIJKLMNO
|
| - 0xfffe, // 0x40 - 0x4f 0111111111111111
|
| - // PQRSTUVWXYZ _
|
| - 0x87ff, // 0x50 - 0x5f 1111111111100001
|
| - // abcdefghijklmno
|
| - 0xfffe, // 0x60 - 0x6f 0111111111111111
|
| - // pqrstuvwxyz ~
|
| - 0x47ff]; // 0x70 - 0x7f 1111111111100010
|
| + // LSB MSB
|
| + // | |
|
| + 0x0000, // 0x00 - 0x0f 0000000000000000
|
| + 0x0000, // 0x10 - 0x1f 0000000000000000
|
| + // -.
|
| + 0x6000, // 0x20 - 0x2f 0000000000000110
|
| + // 0123456789
|
| + 0x03ff, // 0x30 - 0x3f 1111111111000000
|
| + // ABCDEFGHIJKLMNO
|
| + 0xfffe, // 0x40 - 0x4f 0111111111111111
|
| + // PQRSTUVWXYZ _
|
| + 0x87ff, // 0x50 - 0x5f 1111111111100001
|
| + // abcdefghijklmno
|
| + 0xfffe, // 0x60 - 0x6f 0111111111111111
|
| + // pqrstuvwxyz ~
|
| + 0x47ff, // 0x70 - 0x7f 1111111111100010
|
| + ];
|
|
|
| // The unreserved characters of RFC 2396.
|
| static const _unreserved2396Table = const [
|
| - // LSB MSB
|
| - // | |
|
| - 0x0000, // 0x00 - 0x0f 0000000000000000
|
| - 0x0000, // 0x10 - 0x1f 0000000000000000
|
| - // ! '()* -.
|
| - 0x6782, // 0x20 - 0x2f 0100000111100110
|
| - // 0123456789
|
| - 0x03ff, // 0x30 - 0x3f 1111111111000000
|
| - // ABCDEFGHIJKLMNO
|
| - 0xfffe, // 0x40 - 0x4f 0111111111111111
|
| - // PQRSTUVWXYZ _
|
| - 0x87ff, // 0x50 - 0x5f 1111111111100001
|
| - // abcdefghijklmno
|
| - 0xfffe, // 0x60 - 0x6f 0111111111111111
|
| - // pqrstuvwxyz ~
|
| - 0x47ff]; // 0x70 - 0x7f 1111111111100010
|
| + // LSB MSB
|
| + // | |
|
| + 0x0000, // 0x00 - 0x0f 0000000000000000
|
| + 0x0000, // 0x10 - 0x1f 0000000000000000
|
| + // ! '()* -.
|
| + 0x6782, // 0x20 - 0x2f 0100000111100110
|
| + // 0123456789
|
| + 0x03ff, // 0x30 - 0x3f 1111111111000000
|
| + // ABCDEFGHIJKLMNO
|
| + 0xfffe, // 0x40 - 0x4f 0111111111111111
|
| + // PQRSTUVWXYZ _
|
| + 0x87ff, // 0x50 - 0x5f 1111111111100001
|
| + // abcdefghijklmno
|
| + 0xfffe, // 0x60 - 0x6f 0111111111111111
|
| + // pqrstuvwxyz ~
|
| + 0x47ff, // 0x70 - 0x7f 1111111111100010
|
| + ];
|
|
|
| // Table of reserved characters specified by ECMAScript 5.
|
| static const _encodeFullTable = const [
|
| - // LSB MSB
|
| - // | |
|
| - 0x0000, // 0x00 - 0x0f 0000000000000000
|
| - 0x0000, // 0x10 - 0x1f 0000000000000000
|
| - // ! #$ &'()*+,-./
|
| - 0xffda, // 0x20 - 0x2f 0101101111111111
|
| - // 0123456789:; = ?
|
| - 0xafff, // 0x30 - 0x3f 1111111111110101
|
| - // @ABCDEFGHIJKLMNO
|
| - 0xffff, // 0x40 - 0x4f 1111111111111111
|
| - // PQRSTUVWXYZ _
|
| - 0x87ff, // 0x50 - 0x5f 1111111111100001
|
| - // abcdefghijklmno
|
| - 0xfffe, // 0x60 - 0x6f 0111111111111111
|
| - // pqrstuvwxyz ~
|
| - 0x47ff]; // 0x70 - 0x7f 1111111111100010
|
| + // LSB MSB
|
| + // | |
|
| + 0x0000, // 0x00 - 0x0f 0000000000000000
|
| + 0x0000, // 0x10 - 0x1f 0000000000000000
|
| + // ! #$ &'()*+,-./
|
| + 0xffda, // 0x20 - 0x2f 0101101111111111
|
| + // 0123456789:; = ?
|
| + 0xafff, // 0x30 - 0x3f 1111111111110101
|
| + // @ABCDEFGHIJKLMNO
|
| + 0xffff, // 0x40 - 0x4f 1111111111111111
|
| + // PQRSTUVWXYZ _
|
| + 0x87ff, // 0x50 - 0x5f 1111111111100001
|
| + // abcdefghijklmno
|
| + 0xfffe, // 0x60 - 0x6f 0111111111111111
|
| + // pqrstuvwxyz ~
|
| + 0x47ff, // 0x70 - 0x7f 1111111111100010
|
| + ];
|
|
|
| // Characters allowed in the scheme.
|
| static const _schemeTable = const [
|
| - // LSB MSB
|
| - // | |
|
| - 0x0000, // 0x00 - 0x0f 0000000000000000
|
| - 0x0000, // 0x10 - 0x1f 0000000000000000
|
| - // + -.
|
| - 0x6800, // 0x20 - 0x2f 0000000000010110
|
| - // 0123456789
|
| - 0x03ff, // 0x30 - 0x3f 1111111111000000
|
| - // ABCDEFGHIJKLMNO
|
| - 0xfffe, // 0x40 - 0x4f 0111111111111111
|
| - // PQRSTUVWXYZ
|
| - 0x07ff, // 0x50 - 0x5f 1111111111100001
|
| - // abcdefghijklmno
|
| - 0xfffe, // 0x60 - 0x6f 0111111111111111
|
| - // pqrstuvwxyz
|
| - 0x07ff]; // 0x70 - 0x7f 1111111111100010
|
| + // LSB MSB
|
| + // | |
|
| + 0x0000, // 0x00 - 0x0f 0000000000000000
|
| + 0x0000, // 0x10 - 0x1f 0000000000000000
|
| + // + -.
|
| + 0x6800, // 0x20 - 0x2f 0000000000010110
|
| + // 0123456789
|
| + 0x03ff, // 0x30 - 0x3f 1111111111000000
|
| + // ABCDEFGHIJKLMNO
|
| + 0xfffe, // 0x40 - 0x4f 0111111111111111
|
| + // PQRSTUVWXYZ
|
| + 0x07ff, // 0x50 - 0x5f 1111111111100001
|
| + // abcdefghijklmno
|
| + 0xfffe, // 0x60 - 0x6f 0111111111111111
|
| + // pqrstuvwxyz
|
| + 0x07ff, // 0x70 - 0x7f 1111111111100010
|
| + ];
|
|
|
| // Characters allowed in scheme except for upper case letters.
|
| static const _schemeLowerTable = const [
|
| - // LSB MSB
|
| - // | |
|
| - 0x0000, // 0x00 - 0x0f 0000000000000000
|
| - 0x0000, // 0x10 - 0x1f 0000000000000000
|
| - // + -.
|
| - 0x6800, // 0x20 - 0x2f 0000000000010110
|
| - // 0123456789
|
| - 0x03ff, // 0x30 - 0x3f 1111111111000000
|
| - //
|
| - 0x0000, // 0x40 - 0x4f 0111111111111111
|
| - //
|
| - 0x0000, // 0x50 - 0x5f 1111111111100001
|
| - // abcdefghijklmno
|
| - 0xfffe, // 0x60 - 0x6f 0111111111111111
|
| - // pqrstuvwxyz
|
| - 0x07ff]; // 0x70 - 0x7f 1111111111100010
|
| + // LSB MSB
|
| + // | |
|
| + 0x0000, // 0x00 - 0x0f 0000000000000000
|
| + 0x0000, // 0x10 - 0x1f 0000000000000000
|
| + // + -.
|
| + 0x6800, // 0x20 - 0x2f 0000000000010110
|
| + // 0123456789
|
| + 0x03ff, // 0x30 - 0x3f 1111111111000000
|
| + //
|
| + 0x0000, // 0x40 - 0x4f 0111111111111111
|
| + //
|
| + 0x0000, // 0x50 - 0x5f 1111111111100001
|
| + // abcdefghijklmno
|
| + 0xfffe, // 0x60 - 0x6f 0111111111111111
|
| + // pqrstuvwxyz
|
| + 0x07ff, // 0x70 - 0x7f 1111111111100010
|
| + ];
|
|
|
| // Sub delimiter characters combined with unreserved as of 3986.
|
| // sub-delims = "!" / "$" / "&" / "'" / "(" / ")"
|
| - // / "*" / "+" / "," / ";" / "="
|
| + // / "*" / "+" / "," / ";" / "="
|
| // RFC 3986 section 2.3.
|
| // unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
|
| static const _subDelimitersTable = const [
|
| - // LSB MSB
|
| - // | |
|
| - 0x0000, // 0x00 - 0x0f 0000000000000000
|
| - 0x0000, // 0x10 - 0x1f 0000000000000000
|
| - // ! $ &'()*+,-.
|
| - 0x7fd2, // 0x20 - 0x2f 0100101111111110
|
| - // 0123456789 ; =
|
| - 0x2bff, // 0x30 - 0x3f 1111111111010100
|
| - // ABCDEFGHIJKLMNO
|
| - 0xfffe, // 0x40 - 0x4f 0111111111111111
|
| - // PQRSTUVWXYZ _
|
| - 0x87ff, // 0x50 - 0x5f 1111111111100001
|
| - // abcdefghijklmno
|
| - 0xfffe, // 0x60 - 0x6f 0111111111111111
|
| - // pqrstuvwxyz ~
|
| - 0x47ff]; // 0x70 - 0x7f 1111111111100010
|
| + // LSB MSB
|
| + // | |
|
| + 0x0000, // 0x00 - 0x0f 0000000000000000
|
| + 0x0000, // 0x10 - 0x1f 0000000000000000
|
| + // ! $ &'()*+,-.
|
| + 0x7fd2, // 0x20 - 0x2f 0100101111111110
|
| + // 0123456789 ; =
|
| + 0x2bff, // 0x30 - 0x3f 1111111111010100
|
| + // ABCDEFGHIJKLMNO
|
| + 0xfffe, // 0x40 - 0x4f 0111111111111111
|
| + // PQRSTUVWXYZ _
|
| + 0x87ff, // 0x50 - 0x5f 1111111111100001
|
| + // abcdefghijklmno
|
| + 0xfffe, // 0x60 - 0x6f 0111111111111111
|
| + // pqrstuvwxyz ~
|
| + 0x47ff, // 0x70 - 0x7f 1111111111100010
|
| + ];
|
|
|
| // General delimiter characters, RFC 3986 section 2.2.
|
| // gen-delims = ":" / "/" / "?" / "#" / "[" / "]" / "@"
|
| //
|
| static const _genDelimitersTable = const [
|
| - // LSB MSB
|
| - // | |
|
| - 0x0000, // 0x00 - 0x0f 0000000000000000
|
| - 0x0000, // 0x10 - 0x1f 0000000000000000
|
| - // # /
|
| - 0x8008, // 0x20 - 0x2f 0001000000000001
|
| - // : ?
|
| - 0x8400, // 0x30 - 0x3f 0000000000100001
|
| - // @
|
| - 0x0001, // 0x40 - 0x4f 1000000000000000
|
| - // [ ]
|
| - 0x2800, // 0x50 - 0x5f 0000000000010100
|
| - //
|
| - 0x0000, // 0x60 - 0x6f 0000000000000000
|
| - //
|
| - 0x0000]; // 0x70 - 0x7f 0000000000000000
|
| + // LSB MSB
|
| + // | |
|
| + 0x0000, // 0x00 - 0x0f 0000000000000000
|
| + 0x0000, // 0x10 - 0x1f 0000000000000000
|
| + // # /
|
| + 0x8008, // 0x20 - 0x2f 0001000000000001
|
| + // : ?
|
| + 0x8400, // 0x30 - 0x3f 0000000000100001
|
| + // @
|
| + 0x0001, // 0x40 - 0x4f 1000000000000000
|
| + // [ ]
|
| + 0x2800, // 0x50 - 0x5f 0000000000010100
|
| + //
|
| + 0x0000, // 0x60 - 0x6f 0000000000000000
|
| + //
|
| + 0x0000, // 0x70 - 0x7f 0000000000000000
|
| + ];
|
|
|
| // Characters allowed in the userinfo as of RFC 3986.
|
| // RFC 3986 Apendix A
|
| // userinfo = *( unreserved / pct-encoded / sub-delims / ':')
|
| static const _userinfoTable = const [
|
| - // LSB MSB
|
| - // | |
|
| - 0x0000, // 0x00 - 0x0f 0000000000000000
|
| - 0x0000, // 0x10 - 0x1f 0000000000000000
|
| - // ! $ &'()*+,-.
|
| - 0x7fd2, // 0x20 - 0x2f 0100101111111110
|
| - // 0123456789:; =
|
| - 0x2fff, // 0x30 - 0x3f 1111111111110100
|
| - // ABCDEFGHIJKLMNO
|
| - 0xfffe, // 0x40 - 0x4f 0111111111111111
|
| - // PQRSTUVWXYZ _
|
| - 0x87ff, // 0x50 - 0x5f 1111111111100001
|
| - // abcdefghijklmno
|
| - 0xfffe, // 0x60 - 0x6f 0111111111111111
|
| - // pqrstuvwxyz ~
|
| - 0x47ff]; // 0x70 - 0x7f 1111111111100010
|
| + // LSB MSB
|
| + // | |
|
| + 0x0000, // 0x00 - 0x0f 0000000000000000
|
| + 0x0000, // 0x10 - 0x1f 0000000000000000
|
| + // ! $ &'()*+,-.
|
| + 0x7fd2, // 0x20 - 0x2f 0100101111111110
|
| + // 0123456789:; =
|
| + 0x2fff, // 0x30 - 0x3f 1111111111110100
|
| + // ABCDEFGHIJKLMNO
|
| + 0xfffe, // 0x40 - 0x4f 0111111111111111
|
| + // PQRSTUVWXYZ _
|
| + 0x87ff, // 0x50 - 0x5f 1111111111100001
|
| + // abcdefghijklmno
|
| + 0xfffe, // 0x60 - 0x6f 0111111111111111
|
| + // pqrstuvwxyz ~
|
| + 0x47ff, // 0x70 - 0x7f 1111111111100010
|
| + ];
|
|
|
| // Characters allowed in the reg-name as of RFC 3986.
|
| // RFC 3986 Apendix A
|
| // reg-name = *( unreserved / pct-encoded / sub-delims )
|
| static const _regNameTable = const [
|
| - // LSB MSB
|
| - // | |
|
| - 0x0000, // 0x00 - 0x0f 0000000000000000
|
| - 0x0000, // 0x10 - 0x1f 0000000000000000
|
| - // ! $%&'()*+,-.
|
| - 0x7ff2, // 0x20 - 0x2f 0100111111111110
|
| - // 0123456789 ; =
|
| - 0x2bff, // 0x30 - 0x3f 1111111111010100
|
| - // ABCDEFGHIJKLMNO
|
| - 0xfffe, // 0x40 - 0x4f 0111111111111111
|
| - // PQRSTUVWXYZ _
|
| - 0x87ff, // 0x50 - 0x5f 1111111111100001
|
| - // abcdefghijklmno
|
| - 0xfffe, // 0x60 - 0x6f 0111111111111111
|
| - // pqrstuvwxyz ~
|
| - 0x47ff]; // 0x70 - 0x7f 1111111111100010
|
| + // LSB MSB
|
| + // | |
|
| + 0x0000, // 0x00 - 0x0f 0000000000000000
|
| + 0x0000, // 0x10 - 0x1f 0000000000000000
|
| + // ! $%&'()*+,-.
|
| + 0x7ff2, // 0x20 - 0x2f 0100111111111110
|
| + // 0123456789 ; =
|
| + 0x2bff, // 0x30 - 0x3f 1111111111010100
|
| + // ABCDEFGHIJKLMNO
|
| + 0xfffe, // 0x40 - 0x4f 0111111111111111
|
| + // PQRSTUVWXYZ _
|
| + 0x87ff, // 0x50 - 0x5f 1111111111100001
|
| + // abcdefghijklmno
|
| + 0xfffe, // 0x60 - 0x6f 0111111111111111
|
| + // pqrstuvwxyz ~
|
| + 0x47ff, // 0x70 - 0x7f 1111111111100010
|
| + ];
|
|
|
| // Characters allowed in the path as of RFC 3986.
|
| // RFC 3986 section 3.3.
|
| // pchar = unreserved / pct-encoded / sub-delims / ":" / "@"
|
| static const _pathCharTable = const [
|
| - // LSB MSB
|
| - // | |
|
| - 0x0000, // 0x00 - 0x0f 0000000000000000
|
| - 0x0000, // 0x10 - 0x1f 0000000000000000
|
| - // ! $ &'()*+,-.
|
| - 0x7fd2, // 0x20 - 0x2f 0100101111111110
|
| - // 0123456789:; =
|
| - 0x2fff, // 0x30 - 0x3f 1111111111110100
|
| - // @ABCDEFGHIJKLMNO
|
| - 0xffff, // 0x40 - 0x4f 1111111111111111
|
| - // PQRSTUVWXYZ _
|
| - 0x87ff, // 0x50 - 0x5f 1111111111100001
|
| - // abcdefghijklmno
|
| - 0xfffe, // 0x60 - 0x6f 0111111111111111
|
| - // pqrstuvwxyz ~
|
| - 0x47ff]; // 0x70 - 0x7f 1111111111100010
|
| + // LSB MSB
|
| + // | |
|
| + 0x0000, // 0x00 - 0x0f 0000000000000000
|
| + 0x0000, // 0x10 - 0x1f 0000000000000000
|
| + // ! $ &'()*+,-.
|
| + 0x7fd2, // 0x20 - 0x2f 0100101111111110
|
| + // 0123456789:; =
|
| + 0x2fff, // 0x30 - 0x3f 1111111111110100
|
| + // @ABCDEFGHIJKLMNO
|
| + 0xffff, // 0x40 - 0x4f 1111111111111111
|
| + // PQRSTUVWXYZ _
|
| + 0x87ff, // 0x50 - 0x5f 1111111111100001
|
| + // abcdefghijklmno
|
| + 0xfffe, // 0x60 - 0x6f 0111111111111111
|
| + // pqrstuvwxyz ~
|
| + 0x47ff, // 0x70 - 0x7f 1111111111100010
|
| + ];
|
|
|
| // Characters allowed in the path as of RFC 3986.
|
| // RFC 3986 section 3.3 *and* slash.
|
| static const _pathCharOrSlashTable = const [
|
| - // LSB MSB
|
| - // | |
|
| - 0x0000, // 0x00 - 0x0f 0000000000000000
|
| - 0x0000, // 0x10 - 0x1f 0000000000000000
|
| - // ! $ &'()*+,-./
|
| - 0xffd2, // 0x20 - 0x2f 0100101111111111
|
| - // 0123456789:; =
|
| - 0x2fff, // 0x30 - 0x3f 1111111111110100
|
| - // @ABCDEFGHIJKLMNO
|
| - 0xffff, // 0x40 - 0x4f 1111111111111111
|
| -
|
| - // PQRSTUVWXYZ _
|
| - 0x87ff, // 0x50 - 0x5f 1111111111100001
|
| - // abcdefghijklmno
|
| - 0xfffe, // 0x60 - 0x6f 0111111111111111
|
| - // pqrstuvwxyz ~
|
| - 0x47ff]; // 0x70 - 0x7f 1111111111100010
|
| + // LSB MSB
|
| + // | |
|
| + 0x0000, // 0x00 - 0x0f 0000000000000000
|
| + 0x0000, // 0x10 - 0x1f 0000000000000000
|
| + // ! $ &'()*+,-./
|
| + 0xffd2, // 0x20 - 0x2f 0100101111111111
|
| + // 0123456789:; =
|
| + 0x2fff, // 0x30 - 0x3f 1111111111110100
|
| + // @ABCDEFGHIJKLMNO
|
| + 0xffff, // 0x40 - 0x4f 1111111111111111
|
| +
|
| + // PQRSTUVWXYZ _
|
| + 0x87ff, // 0x50 - 0x5f 1111111111100001
|
| + // abcdefghijklmno
|
| + 0xfffe, // 0x60 - 0x6f 0111111111111111
|
| + // pqrstuvwxyz ~
|
| + 0x47ff, // 0x70 - 0x7f 1111111111100010
|
| + ];
|
|
|
| // Characters allowed in the query as of RFC 3986.
|
| // RFC 3986 section 3.4.
|
| // query = *( pchar / "/" / "?" )
|
| static const _queryCharTable = const [
|
| - // LSB MSB
|
| - // | |
|
| - 0x0000, // 0x00 - 0x0f 0000000000000000
|
| - 0x0000, // 0x10 - 0x1f 0000000000000000
|
| - // ! $ &'()*+,-./
|
| - 0xffd2, // 0x20 - 0x2f 0100101111111111
|
| - // 0123456789:; = ?
|
| - 0xafff, // 0x30 - 0x3f 1111111111110101
|
| - // @ABCDEFGHIJKLMNO
|
| - 0xffff, // 0x40 - 0x4f 1111111111111111
|
| - // PQRSTUVWXYZ _
|
| - 0x87ff, // 0x50 - 0x5f 1111111111100001
|
| - // abcdefghijklmno
|
| - 0xfffe, // 0x60 - 0x6f 0111111111111111
|
| - // pqrstuvwxyz ~
|
| - 0x47ff]; // 0x70 - 0x7f 1111111111100010
|
| -
|
| + // LSB MSB
|
| + // | |
|
| + 0x0000, // 0x00 - 0x0f 0000000000000000
|
| + 0x0000, // 0x10 - 0x1f 0000000000000000
|
| + // ! $ &'()*+,-./
|
| + 0xffd2, // 0x20 - 0x2f 0100101111111111
|
| + // 0123456789:; = ?
|
| + 0xafff, // 0x30 - 0x3f 1111111111110101
|
| + // @ABCDEFGHIJKLMNO
|
| + 0xffff, // 0x40 - 0x4f 1111111111111111
|
| + // PQRSTUVWXYZ _
|
| + 0x87ff, // 0x50 - 0x5f 1111111111100001
|
| + // abcdefghijklmno
|
| + 0xfffe, // 0x60 - 0x6f 0111111111111111
|
| + // pqrstuvwxyz ~
|
| + 0x47ff, // 0x70 - 0x7f 1111111111100010
|
| + ];
|
| }
|
|
|
| // --------------------------------------------------------------------
|
| @@ -3179,10 +3165,10 @@ class UriData {
|
| * be more efficient if the [uri] itself isn't used.
|
| */
|
| factory UriData.fromString(String content,
|
| - {String mimeType,
|
| - Encoding encoding,
|
| - Map<String, String> parameters,
|
| - bool base64: false}) {
|
| + {String mimeType,
|
| + Encoding encoding,
|
| + Map<String, String> parameters,
|
| + bool base64: false}) {
|
| StringBuffer buffer = new StringBuffer();
|
| List<int> indices = [_noScheme];
|
| String charsetName;
|
| @@ -3217,9 +3203,9 @@ class UriData {
|
| * be more efficient if the [uri] itself isn't used.
|
| */
|
| factory UriData.fromBytes(List<int> bytes,
|
| - {mimeType: "application/octet-stream",
|
| - Map<String, String> parameters,
|
| - percentEncoded: false}) {
|
| + {mimeType: "application/octet-stream",
|
| + Map<String, String> parameters,
|
| + percentEncoded: false}) {
|
| StringBuffer buffer = new StringBuffer();
|
| List<int> indices = [_noScheme];
|
| _writeUri(mimeType, null, parameters, buffer, indices);
|
| @@ -3231,9 +3217,9 @@ class UriData {
|
| buffer.write(';base64,');
|
| indices.add(buffer.length - 1);
|
| BASE64.encoder
|
| - .startChunkedConversion(
|
| - new StringConversionSink.fromStringSink(buffer))
|
| - .addSlice(bytes, 0, bytes.length, true);
|
| + .startChunkedConversion(
|
| + new StringConversionSink.fromStringSink(buffer))
|
| + .addSlice(bytes, 0, bytes.length, true);
|
| }
|
|
|
| return new UriData._(buffer.toString(), indices, null);
|
| @@ -3248,16 +3234,15 @@ class UriData {
|
| */
|
| factory UriData.fromUri(Uri uri) {
|
| if (uri.scheme != "data") {
|
| - throw new ArgumentError.value(uri, "uri",
|
| - "Scheme must be 'data'");
|
| + throw new ArgumentError.value(uri, "uri", "Scheme must be 'data'");
|
| }
|
| if (uri.hasAuthority) {
|
| - throw new ArgumentError.value(uri, "uri",
|
| - "Data uri must not have authority");
|
| + throw new ArgumentError.value(
|
| + uri, "uri", "Data uri must not have authority");
|
| }
|
| if (uri.hasFragment) {
|
| - throw new ArgumentError.value(uri, "uri",
|
| - "Data uri must not have a fragment part");
|
| + throw new ArgumentError.value(
|
| + uri, "uri", "Data uri must not have a fragment part");
|
| }
|
| if (!uri.hasQuery) {
|
| return _parse(uri.path, 0, uri);
|
| @@ -3274,33 +3259,28 @@ class UriData {
|
| * Of an [indices] list is passed, separator indices are stored in that
|
| * list.
|
| */
|
| - static void _writeUri(String mimeType,
|
| - String charsetName,
|
| - Map<String, String> parameters,
|
| - StringBuffer buffer, List indices) {
|
| + static void _writeUri(String mimeType, String charsetName,
|
| + Map<String, String> parameters, StringBuffer buffer, List indices) {
|
| if (mimeType == null || mimeType == "text/plain") {
|
| mimeType = "";
|
| }
|
| if (mimeType.isEmpty || identical(mimeType, "application/octet-stream")) {
|
| - buffer.write(mimeType); // Common cases need no escaping.
|
| + buffer.write(mimeType); // Common cases need no escaping.
|
| } else {
|
| int slashIndex = _validateMimeType(mimeType);
|
| if (slashIndex < 0) {
|
| - throw new ArgumentError.value(mimeType, "mimeType",
|
| - "Invalid MIME type");
|
| + throw new ArgumentError.value(
|
| + mimeType, "mimeType", "Invalid MIME type");
|
| }
|
| - buffer.write(_Uri._uriEncode(_tokenCharTable,
|
| - mimeType.substring(0, slashIndex),
|
| - UTF8, false));
|
| + buffer.write(_Uri._uriEncode(
|
| + _tokenCharTable, mimeType.substring(0, slashIndex), UTF8, false));
|
| buffer.write("/");
|
| - buffer.write(_Uri._uriEncode(_tokenCharTable,
|
| - mimeType.substring(slashIndex + 1),
|
| - UTF8, false));
|
| + buffer.write(_Uri._uriEncode(
|
| + _tokenCharTable, mimeType.substring(slashIndex + 1), UTF8, false));
|
| }
|
| if (charsetName != null) {
|
| if (indices != null) {
|
| - indices..add(buffer.length)
|
| - ..add(buffer.length + 8);
|
| + indices..add(buffer.length)..add(buffer.length + 8);
|
| }
|
| buffer.write(";charset=");
|
| buffer.write(_Uri._uriEncode(_tokenCharTable, charsetName, UTF8, false));
|
| @@ -3310,8 +3290,8 @@ class UriData {
|
| throw new ArgumentError.value("", "Parameter names must not be empty");
|
| }
|
| if (value.isEmpty) {
|
| - throw new ArgumentError.value("", "Parameter values must not be empty",
|
| - 'parameters["$key"]');
|
| + throw new ArgumentError.value(
|
| + "", "Parameter values must not be empty", 'parameters["$key"]');
|
| }
|
| if (indices != null) indices.add(buffer.length);
|
| buffer.write(';');
|
| @@ -3402,11 +3382,12 @@ class UriData {
|
| int queryIndex = _text.indexOf('?', colonIndex + 1);
|
| int end = _text.length;
|
| if (queryIndex >= 0) {
|
| - query = _Uri._normalizeOrSubstring(_text, queryIndex + 1, end, _Uri._queryCharTable);
|
| + query = _Uri._normalizeOrSubstring(
|
| + _text, queryIndex + 1, end, _Uri._queryCharTable);
|
| end = queryIndex;
|
| }
|
| - path = _Uri._normalizeOrSubstring(_text, colonIndex + 1, end,
|
| - _Uri._pathCharOrSlashTable);
|
| + path = _Uri._normalizeOrSubstring(
|
| + _text, colonIndex + 1, end, _Uri._pathCharOrSlashTable);
|
| _uriCache = new _DataUri(this, path, query);
|
| return _uriCache;
|
| }
|
| @@ -3451,7 +3432,7 @@ class UriData {
|
| */
|
| String get charset {
|
| int parameterStart = 1;
|
| - int parameterEnd = _separatorIndices.length - 1; // The ',' before data.
|
| + int parameterEnd = _separatorIndices.length - 1; // The ',' before data.
|
| if (isBase64) {
|
| // There is a ";base64" separator, so subtract one for that as well.
|
| parameterEnd -= 1;
|
| @@ -3460,8 +3441,8 @@ class UriData {
|
| var keyStart = _separatorIndices[i] + 1;
|
| var keyEnd = _separatorIndices[i + 1];
|
| if (keyEnd == keyStart + 7 && _text.startsWith("charset", keyStart)) {
|
| - return _Uri._uriDecode(_text, keyEnd + 1, _separatorIndices[i + 2],
|
| - UTF8, false);
|
| + return _Uri._uriDecode(
|
| + _text, keyEnd + 1, _separatorIndices[i + 2], UTF8, false);
|
| }
|
| }
|
| return "US-ASCII";
|
| @@ -3549,7 +3530,7 @@ class UriData {
|
| */
|
| String contentAsString({Encoding encoding}) {
|
| if (encoding == null) {
|
| - var charset = this.charset; // Returns "US-ASCII" if not present.
|
| + var charset = this.charset; // Returns "US-ASCII" if not present.
|
| encoding = Encoding.getByName(charset);
|
| if (encoding == null) {
|
| throw new UnsupportedError("Unknown charset: $charset");
|
| @@ -3585,7 +3566,7 @@ class UriData {
|
| var equals = _separatorIndices[i - 1];
|
| var end = _separatorIndices[i];
|
| String key = _Uri._uriDecode(_text, start, equals, UTF8, false);
|
| - String value = _Uri._uriDecode(_text,equals + 1, end, UTF8, false);
|
| + String value = _Uri._uriDecode(_text, equals + 1, end, UTF8, false);
|
| result[key] = value;
|
| }
|
| return result;
|
| @@ -3596,10 +3577,10 @@ class UriData {
|
| assert((start == 5) == text.startsWith("data:"));
|
|
|
| /// Character codes.
|
| - const int comma = 0x2c;
|
| - const int slash = 0x2f;
|
| + const int comma = 0x2c;
|
| + const int slash = 0x2f;
|
| const int semicolon = 0x3b;
|
| - const int equals = 0x3d;
|
| + const int equals = 0x3d;
|
| List<int> indices = [start - 1];
|
| int slashIndex = -1;
|
| var char;
|
| @@ -3655,7 +3636,7 @@ class UriData {
|
| // (reserved, unreserved, or escape sequences).
|
| // Normalize to this (throws on a fragment separator).
|
| var data = _Uri._normalize(text, i + 1, text.length, _uricTable,
|
| - escapeDelimiters: true);
|
| + escapeDelimiters: true);
|
| if (data != null) {
|
| text = text.replaceRange(i + 1, text.length, data);
|
| }
|
| @@ -3668,9 +3649,8 @@ class UriData {
|
| *
|
| * Encodes into [buffer] instead of creating its own buffer.
|
| */
|
| - static void _uriEncodeBytes(List<int> canonicalTable,
|
| - List<int> bytes,
|
| - StringSink buffer) {
|
| + static void _uriEncodeBytes(
|
| + List<int> canonicalTable, List<int> bytes, StringSink buffer) {
|
| // Encode the string into bytes then generate an ASCII only string
|
| // by percent encoding selected bytes.
|
| int byteOr = 0;
|
| @@ -3707,22 +3687,23 @@ class UriData {
|
| //
|
| // In a data URI, we also need to escape '%' and '#' characters.
|
| static const _tokenCharTable = const [
|
| - // LSB MSB
|
| - // | |
|
| - 0x0000, // 0x00 - 0x0f 00000000 00000000
|
| - 0x0000, // 0x10 - 0x1f 00000000 00000000
|
| - // ! $ &' *+ -.
|
| - 0x6cd2, // 0x20 - 0x2f 01001011 00110110
|
| - // 01234567 89
|
| - 0x03ff, // 0x30 - 0x3f 11111111 11000000
|
| - // ABCDEFG HIJKLMNO
|
| - 0xfffe, // 0x40 - 0x4f 01111111 11111111
|
| - // PQRSTUVW XYZ ^_
|
| - 0xc7ff, // 0x50 - 0x5f 11111111 11100011
|
| - // `abcdefg hijklmno
|
| - 0xffff, // 0x60 - 0x6f 11111111 11111111
|
| - // pqrstuvw xyz{|}~
|
| - 0x7fff]; // 0x70 - 0x7f 11111111 11111110
|
| + // LSB MSB
|
| + // | |
|
| + 0x0000, // 0x00 - 0x0f 00000000 00000000
|
| + 0x0000, // 0x10 - 0x1f 00000000 00000000
|
| + // ! $ &' *+ -.
|
| + 0x6cd2, // 0x20 - 0x2f 01001011 00110110
|
| + // 01234567 89
|
| + 0x03ff, // 0x30 - 0x3f 11111111 11000000
|
| + // ABCDEFG HIJKLMNO
|
| + 0xfffe, // 0x40 - 0x4f 01111111 11111111
|
| + // PQRSTUVW XYZ ^_
|
| + 0xc7ff, // 0x50 - 0x5f 11111111 11100011
|
| + // `abcdefg hijklmno
|
| + 0xffff, // 0x60 - 0x6f 11111111 11111111
|
| + // pqrstuvw xyz{|}~
|
| + 0x7fff, // 0x70 - 0x7f 11111111 11111110
|
| + ];
|
|
|
| // All non-escape RFC-2396 uric characters.
|
| //
|
| @@ -3736,22 +3717,22 @@ class UriData {
|
|
|
| // Characters allowed in base-64 encoding (alphanumeric, '/', '+' and '=').
|
| static const _base64Table = const [
|
| - // LSB MSB
|
| - // | |
|
| - 0x0000, // 0x00 - 0x0f 00000000 00000000
|
| - 0x0000, // 0x10 - 0x1f 00000000 00000000
|
| - // + /
|
| - 0x8800, // 0x20 - 0x2f 00000000 00010001
|
| - // 01234567 89
|
| - 0x03ff, // 0x30 - 0x3f 11111111 11000000
|
| - // ABCDEFG HIJKLMNO
|
| - 0xfffe, // 0x40 - 0x4f 01111111 11111111
|
| - // PQRSTUVW XYZ
|
| - 0x07ff, // 0x50 - 0x5f 11111111 11100000
|
| - // abcdefg hijklmno
|
| - 0xfffe, // 0x60 - 0x6f 01111111 11111111
|
| - // pqrstuvw xyz
|
| - 0x07ff, // 0x70 - 0x7f 11111111 11100000
|
| + // LSB MSB
|
| + // | |
|
| + 0x0000, // 0x00 - 0x0f 00000000 00000000
|
| + 0x0000, // 0x10 - 0x1f 00000000 00000000
|
| + // + /
|
| + 0x8800, // 0x20 - 0x2f 00000000 00010001
|
| + // 01234567 89
|
| + 0x03ff, // 0x30 - 0x3f 11111111 11000000
|
| + // ABCDEFG HIJKLMNO
|
| + 0xfffe, // 0x40 - 0x4f 01111111 11111111
|
| + // PQRSTUVW XYZ
|
| + 0x07ff, // 0x50 - 0x5f 11111111 11100000
|
| + // abcdefg hijklmno
|
| + 0xfffe, // 0x60 - 0x6f 01111111 11111111
|
| + // pqrstuvw xyz
|
| + 0x07ff, // 0x70 - 0x7f 11111111 11100000
|
| ];
|
| }
|
|
|
| @@ -3762,29 +3743,35 @@ class UriData {
|
| // The `0` index is only used internally.
|
|
|
| /// Index of the position of that `:` after a scheme.
|
| -const int _schemeEndIndex = 1;
|
| +const int _schemeEndIndex = 1;
|
| +
|
| /// Index of the position of the character just before the host name.
|
| -const int _hostStartIndex = 2;
|
| +const int _hostStartIndex = 2;
|
| +
|
| /// Index of the position of the `:` before a port value.
|
| -const int _portStartIndex = 3;
|
| +const int _portStartIndex = 3;
|
| +
|
| /// Index of the position of the first character of a path.
|
| -const int _pathStartIndex = 4;
|
| +const int _pathStartIndex = 4;
|
| +
|
| /// Index of the position of the `?` before a query.
|
| -const int _queryStartIndex = 5;
|
| +const int _queryStartIndex = 5;
|
| +
|
| /// Index of the position of the `#` before a fragment.
|
| const int _fragmentStartIndex = 6;
|
| +
|
| /// Index of a position where the URI was determined to be "non-simple".
|
| -const int _notSimpleIndex = 7;
|
| +const int _notSimpleIndex = 7;
|
|
|
| // Initial state for scanner.
|
| -const int _uriStart = 00;
|
| +const int _uriStart = 00;
|
|
|
| // If scanning of a URI terminates in this state or above,
|
| // consider the URI non-simple
|
| const int _nonSimpleEndStates = 14;
|
|
|
| // Initial state for scheme validation.
|
| -const int _schemeStart = 20;
|
| +const int _schemeStart = 20;
|
|
|
| /// Transition tables used to scan a URI to determine its structure.
|
| ///
|
| @@ -3883,54 +3870,55 @@ List<Uint8List> _createTables() {
|
| // TODO(lrn): Use a precomputed table.
|
|
|
| // Total number of states for the scanner.
|
| - const int stateCount = 22;
|
| + const int stateCount = 22;
|
|
|
| // States used to scan a URI from scratch.
|
| - const int schemeOrPath = 01;
|
| - const int authOrPath = 02;
|
| - const int authOrPathSlash = 03;
|
| - const int uinfoOrHost0 = 04;
|
| - const int uinfoOrHost = 05;
|
| - const int uinfoOrPort0 = 06;
|
| - const int uinfoOrPort = 07;
|
| - const int ipv6Host = 08;
|
| - const int relPathSeg = 09;
|
| - const int pathSeg = 10;
|
| - const int path = 11;
|
| - const int query = 12;
|
| - const int fragment = 13;
|
| - const int schemeOrPathDot = 14;
|
| - const int schemeOrPathDot2 = 15;
|
| - const int relPathSegDot = 16;
|
| - const int relPathSegDot2 = 17;
|
| - const int pathSegDot = 18;
|
| - const int pathSegDot2 = 19;
|
| + const int schemeOrPath = 01;
|
| + const int authOrPath = 02;
|
| + const int authOrPathSlash = 03;
|
| + const int uinfoOrHost0 = 04;
|
| + const int uinfoOrHost = 05;
|
| + const int uinfoOrPort0 = 06;
|
| + const int uinfoOrPort = 07;
|
| + const int ipv6Host = 08;
|
| + const int relPathSeg = 09;
|
| + const int pathSeg = 10;
|
| + const int path = 11;
|
| + const int query = 12;
|
| + const int fragment = 13;
|
| + const int schemeOrPathDot = 14;
|
| + const int schemeOrPathDot2 = 15;
|
| + const int relPathSegDot = 16;
|
| + const int relPathSegDot2 = 17;
|
| + const int pathSegDot = 18;
|
| + const int pathSegDot2 = 19;
|
|
|
| // States used to validate a scheme after its end position has been found.
|
| - const int scheme0 = _schemeStart;
|
| - const int scheme = 21;
|
| + const int scheme0 = _schemeStart;
|
| + const int scheme = 21;
|
|
|
| // Constants encoding the write-index for the state transition into the top 5
|
| // bits of a byte.
|
| - const int schemeEnd = _schemeEndIndex << 5;
|
| - const int hostStart = _hostStartIndex << 5;
|
| - const int portStart = _portStartIndex << 5;
|
| - const int pathStart = _pathStartIndex << 5;
|
| - const int queryStart = _queryStartIndex << 5;
|
| - const int fragmentStart = _fragmentStartIndex << 5;
|
| - const int notSimple = _notSimpleIndex << 5;
|
| + const int schemeEnd = _schemeEndIndex << 5;
|
| + const int hostStart = _hostStartIndex << 5;
|
| + const int portStart = _portStartIndex << 5;
|
| + const int pathStart = _pathStartIndex << 5;
|
| + const int queryStart = _queryStartIndex << 5;
|
| + const int fragmentStart = _fragmentStartIndex << 5;
|
| + const int notSimple = _notSimpleIndex << 5;
|
|
|
| /// The `unreserved` characters of RFC 3986.
|
| const unreserved =
|
| - "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-._~" ;
|
| + "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-._~";
|
| +
|
| /// The `sub-delim` characters of RFC 3986.
|
| const subDelims = r"!$&'()*+,;=";
|
| // The `pchar` characters of RFC 3986: characters that may occur in a path,
|
| // excluding escapes.
|
| const pchar = "$unreserved$subDelims";
|
|
|
| - var tables = new List<Uint8List>.generate(stateCount,
|
| - (_) => new Uint8List(96));
|
| + var tables =
|
| + new List<Uint8List>.generate(stateCount, (_) => new Uint8List(96));
|
|
|
| // Helper function which initialize the table for [state] with a default
|
| // transition and returns the table.
|
| @@ -3967,7 +3955,7 @@ List<Uint8List> _createTables() {
|
| b = build(_uriStart, schemeOrPath | notSimple);
|
| setChars(b, pchar, schemeOrPath);
|
| setChars(b, ".", schemeOrPathDot);
|
| - setChars(b, ":", authOrPath | schemeEnd); // Handle later.
|
| + setChars(b, ":", authOrPath | schemeEnd); // Handle later.
|
| setChars(b, "/", authOrPathSlash);
|
| setChars(b, "?", query | queryStart);
|
| setChars(b, "#", fragment | fragmentStart);
|
| @@ -4062,8 +4050,8 @@ List<Uint8List> _createTables() {
|
| b = build(relPathSegDot2, path | notSimple);
|
| setChars(b, pchar, path);
|
| setChars(b, "/", relPathSeg);
|
| - setChars(b, "?", query | queryStart); // This should be non-simple.
|
| - setChars(b, "#", fragment | fragmentStart); // This should be non-simple.
|
| + setChars(b, "?", query | queryStart); // This should be non-simple.
|
| + setChars(b, "#", fragment | fragmentStart); // This should be non-simple.
|
|
|
| b = build(pathSeg, path | notSimple);
|
| setChars(b, pchar, path);
|
| @@ -4146,6 +4134,7 @@ class _SimpleUri implements Uri {
|
| final int _pathStart;
|
| final int _queryStart;
|
| final int _fragmentStart;
|
| +
|
| /// The scheme is often used to distinguish URIs.
|
| /// To make comparisons more efficient, we cache the value, and
|
| /// canonicalize a few known types.
|
| @@ -4173,9 +4162,10 @@ class _SimpleUri implements Uri {
|
| bool get _isHttp => _schemeEnd == 4 && _uri.startsWith("http");
|
| bool get _isHttps => _schemeEnd == 5 && _uri.startsWith("https");
|
| bool get _isPackage => _schemeEnd == 7 && _uri.startsWith("package");
|
| +
|
| /// Like [isScheme] but expects argument to be case normalized.
|
| bool _isScheme(String scheme) =>
|
| - _schemeEnd == scheme.length && _uri.startsWith(scheme);
|
| + _schemeEnd == scheme.length && _uri.startsWith(scheme);
|
|
|
| bool get hasAbsolutePath => _uri.startsWith("/", _pathStart);
|
| bool get hasEmptyPath => _pathStart == _queryStart;
|
| @@ -4204,10 +4194,12 @@ class _SimpleUri implements Uri {
|
| }
|
| return _schemeCache;
|
| }
|
| - String get authority => _hostStart > 0 ?
|
| - _uri.substring(_schemeEnd + 3, _pathStart) : "";
|
| - String get userInfo => (_hostStart > _schemeEnd + 3) ?
|
| - _uri.substring(_schemeEnd + 3, _hostStart - 1) : "";
|
| +
|
| + String get authority =>
|
| + _hostStart > 0 ? _uri.substring(_schemeEnd + 3, _pathStart) : "";
|
| + String get userInfo => (_hostStart > _schemeEnd + 3)
|
| + ? _uri.substring(_schemeEnd + 3, _hostStart - 1)
|
| + : "";
|
| String get host =>
|
| _hostStart > 0 ? _uri.substring(_hostStart, _portStart) : "";
|
| int get port {
|
| @@ -4216,11 +4208,13 @@ class _SimpleUri implements Uri {
|
| if (_isHttps) return 443;
|
| return 0;
|
| }
|
| - String get path =>_uri.substring(_pathStart, _queryStart);
|
| - String get query => (_queryStart < _fragmentStart) ?
|
| - _uri.substring(_queryStart + 1, _fragmentStart) : "";
|
| - String get fragment => (_fragmentStart < _uri.length) ?
|
| - _uri.substring(_fragmentStart + 1) : "";
|
| +
|
| + String get path => _uri.substring(_pathStart, _queryStart);
|
| + String get query => (_queryStart < _fragmentStart)
|
| + ? _uri.substring(_queryStart + 1, _fragmentStart)
|
| + : "";
|
| + String get fragment =>
|
| + (_fragmentStart < _uri.length) ? _uri.substring(_fragmentStart + 1) : "";
|
|
|
| String get origin {
|
| // Check original behavior - W3C spec is wonky!
|
| @@ -4230,7 +4224,7 @@ class _SimpleUri implements Uri {
|
| }
|
| if (!isHttp && !_isHttps) {
|
| throw new StateError(
|
| - "Origin is only applicable schemes http and https: $this");
|
| + "Origin is only applicable to schemes http and https: $this");
|
| }
|
| if (_hostStart == _portStart) {
|
| throw new StateError(
|
| @@ -4241,7 +4235,7 @@ class _SimpleUri implements Uri {
|
| }
|
| // Need to drop anon-empty userInfo.
|
| return _uri.substring(0, _schemeEnd + 3) +
|
| - _uri.substring(_hostStart, _pathStart);
|
| + _uri.substring(_hostStart, _pathStart);
|
| }
|
|
|
| List<String> get pathSegments {
|
| @@ -4263,8 +4257,7 @@ class _SimpleUri implements Uri {
|
|
|
| Map<String, String> get queryParameters {
|
| if (!hasQuery) return const <String, String>{};
|
| - return new UnmodifiableMapView<String, String>(
|
| - Uri.splitQueryString(query));
|
| + return new UnmodifiableMapView<String, String>(Uri.splitQueryString(query));
|
| }
|
|
|
| Map<String, List<String>> get queryParametersAll {
|
| @@ -4280,7 +4273,7 @@ class _SimpleUri implements Uri {
|
| bool _isPort(String port) {
|
| int portDigitStart = _portStart + 1;
|
| return portDigitStart + port.length == _pathStart &&
|
| - _uri.startsWith(port, portDigitStart);
|
| + _uri.startsWith(port, portDigitStart);
|
| }
|
|
|
| Uri normalizePath() => this;
|
| @@ -4288,20 +4281,26 @@ class _SimpleUri implements Uri {
|
| Uri removeFragment() {
|
| if (!hasFragment) return this;
|
| return new _SimpleUri(
|
| - _uri.substring(0, _fragmentStart),
|
| - _schemeEnd, _hostStart, _portStart,
|
| - _pathStart, _queryStart, _fragmentStart, _schemeCache);
|
| + _uri.substring(0, _fragmentStart),
|
| + _schemeEnd,
|
| + _hostStart,
|
| + _portStart,
|
| + _pathStart,
|
| + _queryStart,
|
| + _fragmentStart,
|
| + _schemeCache);
|
| }
|
|
|
| - Uri replace({String scheme,
|
| - String userInfo,
|
| - String host,
|
| - int port,
|
| - String path,
|
| - Iterable<String> pathSegments,
|
| - String query,
|
| - Map<String, dynamic/*String|Iterable<String>*/> queryParameters,
|
| - String fragment}) {
|
| + Uri replace(
|
| + {String scheme,
|
| + String userInfo,
|
| + String host,
|
| + int port,
|
| + String path,
|
| + Iterable<String> pathSegments,
|
| + String query,
|
| + Map<String, dynamic /*String|Iterable<String>*/ > queryParameters,
|
| + String fragment}) {
|
| bool schemeChanged = false;
|
| if (scheme != null) {
|
| scheme = _Uri._makeScheme(scheme, 0, scheme.length);
|
| @@ -4337,7 +4336,7 @@ class _SimpleUri implements Uri {
|
| bool hasAuthority = host != null;
|
| if (path != null || pathSegments != null) {
|
| path = _Uri._makePath(path, 0, _stringOrNullLength(path), pathSegments,
|
| - scheme, hasAuthority);
|
| + scheme, hasAuthority);
|
| } else {
|
| path = _uri.substring(_pathStart, _queryStart);
|
| if ((isFile || (hasAuthority && !path.isEmpty)) &&
|
| @@ -4394,15 +4393,16 @@ class _SimpleUri implements Uri {
|
| if (isSimple) {
|
| var delta = base._schemeEnd + 1;
|
| var newUri = base._uri.substring(0, base._schemeEnd + 1) +
|
| - ref._uri.substring(ref._schemeEnd + 1);
|
| - return new _SimpleUri(newUri,
|
| - base._schemeEnd,
|
| - ref._hostStart + delta,
|
| - ref._portStart + delta,
|
| - ref._pathStart + delta,
|
| - ref._queryStart + delta,
|
| - ref._fragmentStart + delta,
|
| - base._schemeCache);
|
| + ref._uri.substring(ref._schemeEnd + 1);
|
| + return new _SimpleUri(
|
| + newUri,
|
| + base._schemeEnd,
|
| + ref._hostStart + delta,
|
| + ref._portStart + delta,
|
| + ref._pathStart + delta,
|
| + ref._queryStart + delta,
|
| + ref._fragmentStart + delta,
|
| + base._schemeCache);
|
| } else {
|
| // This will require normalization, so use the _Uri implementation.
|
| return _toNonSimple().resolveUri(ref);
|
| @@ -4412,43 +4412,46 @@ class _SimpleUri implements Uri {
|
| if (ref.hasQuery) {
|
| int delta = base._queryStart - ref._queryStart;
|
| var newUri = base._uri.substring(0, base._queryStart) +
|
| - ref._uri.substring(ref._queryStart);
|
| - return new _SimpleUri(newUri,
|
| - base._schemeEnd,
|
| - base._hostStart,
|
| - base._portStart,
|
| - base._pathStart,
|
| - ref._queryStart + delta,
|
| - ref._fragmentStart + delta,
|
| - base._schemeCache);
|
| + ref._uri.substring(ref._queryStart);
|
| + return new _SimpleUri(
|
| + newUri,
|
| + base._schemeEnd,
|
| + base._hostStart,
|
| + base._portStart,
|
| + base._pathStart,
|
| + ref._queryStart + delta,
|
| + ref._fragmentStart + delta,
|
| + base._schemeCache);
|
| }
|
| if (ref.hasFragment) {
|
| int delta = base._fragmentStart - ref._fragmentStart;
|
| var newUri = base._uri.substring(0, base._fragmentStart) +
|
| - ref._uri.substring(ref._fragmentStart);
|
| - return new _SimpleUri(newUri,
|
| - base._schemeEnd,
|
| - base._hostStart,
|
| - base._portStart,
|
| - base._pathStart,
|
| - base._queryStart,
|
| - ref._fragmentStart + delta,
|
| - base._schemeCache);
|
| + ref._uri.substring(ref._fragmentStart);
|
| + return new _SimpleUri(
|
| + newUri,
|
| + base._schemeEnd,
|
| + base._hostStart,
|
| + base._portStart,
|
| + base._pathStart,
|
| + base._queryStart,
|
| + ref._fragmentStart + delta,
|
| + base._schemeCache);
|
| }
|
| return base.removeFragment();
|
| }
|
| if (ref.hasAbsolutePath) {
|
| var delta = base._pathStart - ref._pathStart;
|
| var newUri = base._uri.substring(0, base._pathStart) +
|
| - ref._uri.substring(ref._pathStart);
|
| - return new _SimpleUri(newUri,
|
| - base._schemeEnd,
|
| - base._hostStart,
|
| - base._portStart,
|
| - base._pathStart,
|
| - ref._queryStart + delta,
|
| - ref._fragmentStart + delta,
|
| - base._schemeCache);
|
| + ref._uri.substring(ref._pathStart);
|
| + return new _SimpleUri(
|
| + newUri,
|
| + base._schemeEnd,
|
| + base._hostStart,
|
| + base._portStart,
|
| + base._pathStart,
|
| + ref._queryStart + delta,
|
| + ref._fragmentStart + delta,
|
| + base._schemeCache);
|
| }
|
| if (base.hasEmptyPath && base.hasAuthority) {
|
| // ref has relative non-empty path.
|
| @@ -4459,15 +4462,16 @@ class _SimpleUri implements Uri {
|
| }
|
| var delta = base._pathStart - refStart + 1;
|
| var newUri = "${base._uri.substring(0, base._pathStart)}/"
|
| - "${ref._uri.substring(refStart)}";
|
| - return new _SimpleUri(newUri,
|
| - base._schemeEnd,
|
| - base._hostStart,
|
| - base._portStart,
|
| - base._pathStart,
|
| - ref._queryStart + delta,
|
| - ref._fragmentStart + delta,
|
| - base._schemeCache);
|
| + "${ref._uri.substring(refStart)}";
|
| + return new _SimpleUri(
|
| + newUri,
|
| + base._schemeEnd,
|
| + base._hostStart,
|
| + base._portStart,
|
| + base._pathStart,
|
| + ref._queryStart + delta,
|
| + ref._fragmentStart + delta,
|
| + base._schemeCache);
|
| }
|
| // Merge paths.
|
|
|
| @@ -4492,6 +4496,7 @@ class _SimpleUri implements Uri {
|
| /// The count is decremented when the segment is matched with a
|
| /// segment of the base path, and both are then omitted from the result.
|
| int backCount = 0;
|
| +
|
| /// Count "../" segments and advance `refStart` to after the segments.
|
| while (refStart + 3 <= refEnd && refUri.startsWith("../", refStart)) {
|
| refStart += 3;
|
| @@ -4535,16 +4540,17 @@ class _SimpleUri implements Uri {
|
|
|
| var delta = baseEnd - refStart + insert.length;
|
| var newUri = "${base._uri.substring(0, baseEnd)}$insert"
|
| - "${ref._uri.substring(refStart)}";
|
| -
|
| - return new _SimpleUri(newUri,
|
| - base._schemeEnd,
|
| - base._hostStart,
|
| - base._portStart,
|
| - base._pathStart,
|
| - ref._queryStart + delta,
|
| - ref._fragmentStart + delta,
|
| - base._schemeCache);
|
| + "${ref._uri.substring(refStart)}";
|
| +
|
| + return new _SimpleUri(
|
| + newUri,
|
| + base._schemeEnd,
|
| + base._hostStart,
|
| + base._portStart,
|
| + base._pathStart,
|
| + ref._queryStart + delta,
|
| + ref._fragmentStart + delta,
|
| + base._schemeCache);
|
| }
|
|
|
| String toFilePath({bool windows}) {
|
| @@ -4568,8 +4574,8 @@ class _SimpleUri implements Uri {
|
| if (_hostStart < _portStart) {
|
| // Has authority and non-empty host.
|
| throw new UnsupportedError(
|
| - "Cannot extract a non-Windows file path from a file URI "
|
| - "with an authority");
|
| + "Cannot extract a non-Windows file path from a file URI "
|
| + "with an authority");
|
| }
|
| return this.path;
|
| }
|
| @@ -4581,7 +4587,7 @@ class _SimpleUri implements Uri {
|
|
|
| int get hashCode => _hashCodeCache ??= _uri.hashCode;
|
|
|
| - bool operator==(Object other) {
|
| + bool operator ==(Object other) {
|
| if (identical(this, other)) return true;
|
| if (other is Uri) return _uri == other.toString();
|
| return false;
|
| @@ -4589,14 +4595,13 @@ class _SimpleUri implements Uri {
|
|
|
| Uri _toNonSimple() {
|
| return new _Uri._internal(
|
| - this.scheme,
|
| - this.userInfo,
|
| - this.hasAuthority ? this.host: null,
|
| - this.hasPort ? this.port : null,
|
| - this.path,
|
| - this.hasQuery ? this.query : null,
|
| - this.hasFragment ? this.fragment : null
|
| - );
|
| + this.scheme,
|
| + this.userInfo,
|
| + this.hasAuthority ? this.host : null,
|
| + this.hasPort ? this.port : null,
|
| + this.path,
|
| + this.hasQuery ? this.query : null,
|
| + this.hasFragment ? this.fragment : null);
|
| }
|
|
|
| String toString() => _uri;
|
| @@ -4623,7 +4628,7 @@ class _DataUri extends _Uri {
|
| int _startsWithData(String text, int start) {
|
| // Multiply by 3 to avoid a non-colon character making delta be 0x20.
|
| int delta = (text.codeUnitAt(start + 4) ^ _COLON) * 3;
|
| - delta |= text.codeUnitAt(start) ^ 0x64 /*d*/;
|
| + delta |= text.codeUnitAt(start) ^ 0x64 /*d*/;
|
| delta |= text.codeUnitAt(start + 1) ^ 0x61 /*a*/;
|
| delta |= text.codeUnitAt(start + 2) ^ 0x74 /*t*/;
|
| delta |= text.codeUnitAt(start + 3) ^ 0x61 /*a*/;
|
|
|