blob: 25ce00678a96a1f5270f34115de619520ed9afcc [file] [log] [blame]
// Copyright (c) 2017, 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.
/// Converts characters to the RFC 2397 for data: URIs
import "dart:convert";
String unreserved = "0123456789" +
"ABCDEFGHIJKLMNOPQRSTUVWXYZ" +
"abcdefghijklmnopqrstuvwxyz" +
"-" + "_" + "." + "!" + "~" + "*" + "'" + "(" + ")";
String reserved = ";" + "/" + "?" + ":" + "@" + "&" + "=" + "+" + r"$" + ",";
String mustNotBeEncoded = unreserved + reserved;
String encodeList(List<int> data) {
String encoded = "";
Iterator i = data.iterator;
while (i.moveNext()) {
int charCode = i.current;
String char = new String.fromCharCode(charCode);
if (mustNotBeEncoded.contains(char)) {
encoded += char;
} else {
encoded += "%" + _normalize(charCode.toRadixString(16));
}
}
return encoded;
}
String encodeString(String data, {Encoding? encoding = null}) {
String encoded = "";
Iterator i = data.codeUnits.iterator;
while (i.moveNext()) {
int charCode = i.current;
String char = new String.fromCharCode(charCode);
if (mustNotBeEncoded.contains(char)) {
encoded += char;
} else {
if (encoding != null) {
List<int> codes = encoding.encode(char);
if (codes.length > 1) {
String ch1 = codes[0].toRadixString(16);
String ch2 = codes[1].toRadixString(16);
encoded += "%" + _normalize(ch1) + "%" + _normalize(ch2);
} else {
encoded += "%" + _normalize(charCode.toRadixString(16));
}
} else {
encoded += "%" + _normalize(charCode.toRadixString(16));
}
}
}
return encoded;
}
String _normalize(String s) => (s.length == 1 ? "0" + s : s).toUpperCase();