Unverified Commit 4ce2a7aa authored by Jonah Williams's avatar Jonah Williams Committed by GitHub

[flutter_tools] do not use IOSink for writing cache responses (#67231)

Any File-derived IOSink may throw un-handleable async exceptions into the zone, see dart-lang/sdk#43663 . Instead, just write to a file with an append mode.
parent fdd1bf29
......@@ -1598,10 +1598,11 @@ class ArtifactUpdater {
);
try {
_ensureExists(tempFile.parent);
final IOSink ioSink = tempFile.openWrite();
await _download(url, ioSink);
await ioSink.flush();
await ioSink.close();
if (tempFile.existsSync()) {
tempFile.deleteSync();
}
await _download(url, tempFile);
if (!tempFile.existsSync()) {
throw Exception('Did not find downloaded file ${tempFile.path}');
}
......@@ -1656,13 +1657,15 @@ class ArtifactUpdater {
}
/// Download bytes from [url], throwing non-200 responses as an exception.
Future<void> _download(Uri url, IOSink ioSink) async {
Future<void> _download(Uri url, File file) async {
final HttpClientRequest request = await _httpClient.getUrl(url);
final HttpClientResponse response = await request.close();
if (response.statusCode != HttpStatus.ok) {
throw Exception(response.statusCode);
}
await response.forEach(ioSink.add);
await response.forEach((List<int> chunk) {
file.writeAsBytesSync(chunk, mode: FileMode.append);
});
}
/// Create a temporary file and invoke [onTemporaryFile] with the file as
......
......@@ -18,7 +18,7 @@ import 'package:mockito/mockito.dart';
import '../src/common.dart';
import '../src/mocks.dart';
final Platform testPlatform = FakePlatform(environment: <String, String>{});
final Platform testPlatform = FakePlatform(environment: const <String, String>{});
void main() {
testWithoutContext('ArtifactUpdater can download a zip archive', () async {
......@@ -367,6 +367,7 @@ class MockHttpClientResponse extends Mock implements HttpClientResponse {
@override
Future<void> forEach(void Function(List<int> element) action) async {
action(<int>[0]);
return;
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment