Line data Source code
1 : import 'dart:async'; 2 : 3 : import 'dart:convert'; 4 : 5 : /// A regular expression that matches strings that are composed entirely of 6 : /// ASCII-compatible characters. 7 3 : final RegExp _asciiOnly = RegExp(r'^[\x00-\x7F]+$'); 8 : 9 : /// Returns whether [string] is composed entirely of ASCII-compatible 10 : /// characters. 11 3 : bool isPlainAscii(String string) => _asciiOnly.hasMatch(string); 12 : 13 : /// Pipes all data and errors from [stream] into [sink]. Completes [Future] once 14 : /// [stream] is done. Unlike [store], [sink] remains open after [stream] is 15 : /// done. 16 1 : Future writeStreamToSink(Stream stream, EventSink sink) { 17 1 : var completer = Completer(); 18 2 : stream.listen(sink.add, 19 3 : onError: sink.addError, onDone: () => completer.complete()); 20 1 : return completer.future; 21 : } 22 : 23 : /// Returns the [Encoding] that corresponds to [charset]. Returns [fallback] if 24 : /// [charset] is null or if no [Encoding] was found that corresponds to 25 : /// [charset]. 26 1 : Encoding encodingForCharset(String charset, [Encoding fallback = latin1]) { 27 : if (charset == null) return fallback; 28 0 : var encoding = Encoding.getByName(charset); 29 : return encoding ?? fallback; 30 : } 31 : 32 : typedef DioEncodeHandler = Function(String key, Object value); 33 : 34 6 : String encodeMap(data, DioEncodeHandler handler, {bool encode = true}) { 35 6 : var urlData = StringBuffer(''); 36 : var first = true; 37 : var leftBracket = encode ? '%5B' : '['; 38 : var rightBracket = encode ? '%5D' : ']'; 39 1 : var encodeComponent = encode ? Uri.encodeQueryComponent : (e) => e; 40 6 : void urlEncode(dynamic sub, String path) { 41 6 : if (sub is List) { 42 6 : for (var i = 0; i < sub.length; i++) { 43 4 : urlEncode(sub[i], 44 10 : '$path$leftBracket${(sub[i] is Map || sub[i] is List) ? i : ''}$rightBracket'); 45 : } 46 6 : } else if (sub is Map) { 47 9 : sub.forEach((k, v) { 48 3 : if (path == '') { 49 9 : urlEncode(v, '${encodeComponent(k)}'); 50 : } else { 51 3 : urlEncode(v, '$path$leftBracket${encodeComponent(k)}$rightBracket'); 52 : } 53 : }); 54 : } else { 55 3 : var str = handler(path, sub); 56 4 : var isNotEmpty = str != null && str.trim().isNotEmpty; 57 : if (!first && isNotEmpty) { 58 2 : urlData.write('&'); 59 : } 60 : first = false; 61 : if (isNotEmpty) { 62 2 : urlData.write(str); 63 : } 64 : } 65 : } 66 : 67 6 : urlEncode(data, ''); 68 6 : return urlData.toString(); 69 : }