blob: 86bd89e9eb1fb9260456fcc78ca5922aa5998cf5 [file] [edit]
// Copyright (c) 2020, 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.
/// Utility methods requiring dart:io and used by more than one library in the
/// package.
library;
import 'dart:io';
import 'dart:typed_data';
Future<Uint8List?> defaultLoader(Uri uri) async {
if (uri.isScheme('file')) {
var file = File.fromUri(uri);
try {
return await file.readAsBytes();
} catch (_) {
return null;
}
}
if (uri.isScheme('http') || uri.isScheme('https')) {
return _httpGet(uri);
}
throw UnsupportedError('Default URI unsupported scheme: $uri');
}
Future<Uint8List?> _httpGet(Uri uri) async {
assert(uri.isScheme('http') || uri.isScheme('https'));
var client = HttpClient();
var request = await client.getUrl(uri);
var response = await request.close();
if (response.statusCode != HttpStatus.ok) {
return null;
}
var splitContent = await response.toList();
var totalLength = 0;
if (splitContent.length == 1) {
var part = splitContent[0];
if (part is Uint8List) {
return part;
}
}
for (var list in splitContent) {
totalLength += list.length;
}
var result = Uint8List(totalLength);
var offset = 0;
for (var contentPart in splitContent as Iterable<Uint8List>) {
result.setRange(offset, offset + contentPart.length, contentPart);
offset += contentPart.length;
}
return result;
}
/// Join path parts with the [Platform.pathSeparator].
///
/// If a part ends with a path separator, then no extra separator is
/// inserted.
String pathJoin(String part1, String part2, [String? part3]) {
var separator = Platform.pathSeparator;
var separator1 = part1.endsWith(separator) ? '' : separator;
if (part3 == null) {
return '$part1$separator1$part2';
}
var separator2 = part2.endsWith(separator) ? '' : separator;
return '$part1$separator1$part2$separator2$part3';
}