blob: e03e38c4eb1f3274bd99911965b8a0dc47615e79 [file] [log] [blame]
// 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', ' ');
}
}