745f112ef6
Opt an initial batch of files under samples, samples-dev, utils, and runtime/tools/dartfuzz out of null safety in preparation for switching the flag on by default. Change-Id: Icdfd52a5a969e678a7205903332f73fe3841c223 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/166960 Reviewed-by: Daco Harkes <dacoharkes@google.com> Commit-Queue: Leaf Petersen <leafp@google.com>
82 lines
2.6 KiB
Dart
82 lines
2.6 KiB
Dart
// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
|
|
// for details. All rights reserved. Use of this source code is governed by a
|
|
// BSD-style license that can be found in the LICENSE file.
|
|
|
|
// @dart = 2.9
|
|
|
|
part of utilslib;
|
|
|
|
/**
|
|
* A parsed URI, inspired by:
|
|
* https://github.com/google/closure-library/blob/master/closure/goog/uri/uri.js
|
|
*/
|
|
class SwarmUri {
|
|
/**
|
|
* Parses a URL query string into a map. Because you can have multiple values
|
|
* for the same parameter name, each parameter name maps to a list of
|
|
* values. For example, '?a=b&c=d&a=e' would be parsed as
|
|
* [{'a':['b','e'],'c':['d']}].
|
|
*/
|
|
// TODO(jmesserly): consolidate with Uri.parse(...)
|
|
static Map<String, List<String>> parseQuery(String queryString) {
|
|
final queryParams = new Map<String, List<String>>();
|
|
if (queryString.startsWith('?')) {
|
|
final params = queryString.substring(1, queryString.length).split('&');
|
|
for (final param in params) {
|
|
List<String> parts = param.split('=');
|
|
if (parts.length == 2) {
|
|
// TODO(hiltonc) the name and value should be URL decoded.
|
|
String name = parts[0];
|
|
String value = parts[1];
|
|
|
|
// Create a list of values for this name if not yet done.
|
|
List values = queryParams[name];
|
|
if (values == null) {
|
|
values = new List();
|
|
queryParams[name] = values;
|
|
}
|
|
|
|
values.add(value);
|
|
}
|
|
}
|
|
}
|
|
return queryParams;
|
|
}
|
|
|
|
/**
|
|
* Percent-encodes a string for use as a query parameter in a URI.
|
|
*/
|
|
// TODO(rnystrom): Get rid of this when the real encodeURIComponent()
|
|
// function is available within Dart.
|
|
static String encodeComponent(String component) {
|
|
if (component == null) return component;
|
|
|
|
// TODO(terry): Added b/5096547 to track replace should by default behave
|
|
// like replaceAll to avoid a problematic usage pattern.
|
|
return component
|
|
.replaceAll(':', '%3A')
|
|
.replaceAll('/', '%2F')
|
|
.replaceAll('?', '%3F')
|
|
.replaceAll('=', '%3D')
|
|
.replaceAll('&', '%26')
|
|
.replaceAll(' ', '%20');
|
|
}
|
|
|
|
/**
|
|
* Decodes a string used a query parameter by replacing percent-encoded
|
|
* sequences with their original characters.
|
|
*/
|
|
// TODO(jmesserly): replace this with a better implementation
|
|
static String decodeComponent(String component) {
|
|
if (component == null) return component;
|
|
|
|
return component
|
|
.replaceAll('%3A', ':')
|
|
.replaceAll('%2F', '/')
|
|
.replaceAll('%3F', '?')
|
|
.replaceAll('%3D', '=')
|
|
.replaceAll('%26', '&')
|
|
.replaceAll('%20', ' ');
|
|
}
|
|
}
|