import 'dart:async'; import 'dart:io'; import 'plugin_models.dart'; import 'plugin_package.dart'; class PluginInstaller { const PluginInstaller(); static const _timeout = Duration(seconds: 20); static const _maxBytes = 5 * 1024 * 1024; Future preview(List bytes) => PluginPackage.preview(bytes); Future download(Uri uri) async { if (uri.scheme != 'https') { throw const FormatException('Плагин можно загрузить только по HTTPS'); } final client = HttpClient()..connectionTimeout = _timeout; try { final request = await client.getUrl(uri); request.headers.set( HttpHeaders.userAgentHeader, 'QlyraPluginInstaller/1', ); final response = await request.close().timeout(_timeout); if (response.statusCode != HttpStatus.ok) { await response.drain(); throw HttpException('HTTP ${response.statusCode}', uri: uri); } final bytes = []; await for (final chunk in response.timeout(_timeout)) { bytes.addAll(chunk); if (bytes.length > _maxBytes) { throw const FormatException('.kinet слишком большой'); } } return await preview(bytes); } finally { client.close(force: true); } } }