Skip to content

Commit 3b20fb3

Browse files
author
Emmanuel Garcia
authored
Retry builds when SSL exceptions are thrown (flutter#105078)
1 parent 70c52ce commit 3b20fb3

File tree

2 files changed

+91
-0
lines changed

2 files changed

+91
-0
lines changed

packages/flutter_tools/lib/src/android/gradle_errors.dart

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ final List<GradleHandledError> gradleErrors = <GradleHandledError>[
8080
minCompileSdkVersionHandler,
8181
jvm11RequiredHandler,
8282
outdatedGradleHandler,
83+
sslExceptionHandler,
8384
];
8485

8586
const String _boxTitle = 'Flutter Fix';
@@ -599,3 +600,25 @@ final GradleHandledError jvm11RequiredHandler = GradleHandledError(
599600
},
600601
eventLabel: 'java11-required',
601602
);
603+
604+
/// Handles SSL exceptions: https://github.com/flutter/flutter/issues/104628
605+
@visibleForTesting
606+
final GradleHandledError sslExceptionHandler = GradleHandledError(
607+
test: _lineMatcher(const <String>[
608+
'javax.net.ssl.SSLException: Tag mismatch!',
609+
'javax.crypto.AEADBadTagException: Tag mismatch!',
610+
]),
611+
handler: ({
612+
required String line,
613+
required FlutterProject project,
614+
required bool usesAndroidX,
615+
required bool multidexEnabled,
616+
}) async {
617+
globals.printError(
618+
'${globals.logger.terminal.warningMark} '
619+
'Gradle threw an error while downloading artifacts from the network.'
620+
);
621+
return GradleBuildStatus.retry;
622+
},
623+
eventLabel: 'ssl-exception-tag-mismatch',
624+
);

packages/flutter_tools/test/general.shard/android/gradle_errors_test.dart

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ void main() {
3737
minCompileSdkVersionHandler,
3838
jvm11RequiredHandler,
3939
outdatedGradleHandler,
40+
sslExceptionHandler,
4041
])
4142
);
4243
});
@@ -1054,6 +1055,73 @@ A problem occurred evaluating project ':flutter'.
10541055
});
10551056
});
10561057

1058+
group('SSLException', () {
1059+
testWithoutContext('pattern', () {
1060+
expect(
1061+
sslExceptionHandler.test(r'''
1062+
Exception in thread "main" javax.net.ssl.SSLException: Tag mismatch!
1063+
at java.base/sun.security.ssl.Alert.createSSLException(Alert.java:129)
1064+
at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:321)
1065+
at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:264)
1066+
at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:259)
1067+
at java.base/sun.security.ssl.SSLTransport.decode(SSLTransport.java:129)
1068+
at java.base/sun.security.ssl.SSLSocketImpl.decode(SSLSocketImpl.java:1155)
1069+
at java.base/sun.security.ssl.SSLSocketImpl.readApplicationRecord(SSLSocketImpl.java:1125)
1070+
at java.base/sun.security.ssl.SSLSocketImpl$AppInputStream.read(SSLSocketImpl.java:823)
1071+
at java.base/java.io.BufferedInputStream.read1(BufferedInputStream.java:290)
1072+
at java.base/java.io.BufferedInputStream.read(BufferedInputStream.java:351)
1073+
at java.base/sun.net.www.MeteredStream.read(MeteredStream.java:134)
1074+
at java.base/java.io.FilterInputStream.read(FilterInputStream.java:133)
1075+
at java.base/sun.net.www.protocol.http.HttpURLConnection$HttpInputStream.read(HttpURLConnection.java:3444)
1076+
at java.base/sun.net.www.protocol.http.HttpURLConnection$HttpInputStream.read(HttpURLConnection.java:3437)
1077+
at org.gradle.wrapper.Download.downloadInternal(Download.java:62)
1078+
at org.gradle.wrapper.Download.download(Download.java:44)
1079+
at org.gradle.wrapper.Install$1.call(Install.java:61)
1080+
at org.gradle.wrapper.Install$1.call(Install.java:48)
1081+
at org.gradle.wrapper.ExclusiveFileAccessManager.access(ExclusiveFileAccessManager.java:65)
1082+
at org.gradle.wrapper.Install.createDist(Install.java:48)
1083+
at org.gradle.wrapper.WrapperExecutor.execute(WrapperExecutor.java:128)
1084+
at org.gradle.wrapper.GradleWrapperMain.main(GradleWrapperMain.java:61)'''
1085+
),
1086+
isTrue,
1087+
);
1088+
1089+
expect(
1090+
sslExceptionHandler.test(r'''
1091+
Caused by: javax.crypto.AEADBadTagException: Tag mismatch!
1092+
at java.base/com.sun.crypto.provider.GaloisCounterMode.decryptFinal(GaloisCounterMode.java:580)
1093+
at java.base/com.sun.crypto.provider.CipherCore.finalNoPadding(CipherCore.java:1049)
1094+
at java.base/com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:985)
1095+
at java.base/com.sun.crypto.provider.AESCipher.engineDoFinal(AESCipher.java:491)
1096+
at java.base/javax.crypto.CipherSpi.bufferCrypt(CipherSpi.java:779)
1097+
at java.base/javax.crypto.CipherSpi.engineDoFinal(CipherSpi.java:730)
1098+
at java.base/javax.crypto.Cipher.doFinal(Cipher.java:2497)
1099+
at java.base/sun.security.ssl.SSLCipher$T12GcmReadCipherGenerator$GcmReadCipher.decrypt(SSLCipher.java:1613)
1100+
at java.base/sun.security.ssl.SSLSocketInputRecord.decodeInputRecord(SSLSocketInputRecord.java:262)
1101+
at java.base/sun.security.ssl.SSLSocketInputRecord.decode(SSLSocketInputRecord.java:190)
1102+
at java.base/sun.security.ssl.SSLTransport.decode(SSLTransport.java:108)'''
1103+
),
1104+
isTrue,
1105+
);
1106+
});
1107+
1108+
testUsingContext('suggestion', () async {
1109+
final GradleBuildStatus status = await sslExceptionHandler.handler();
1110+
1111+
expect(status, GradleBuildStatus.retry);
1112+
expect(testLogger.errorText,
1113+
contains(
1114+
'Gradle threw an error while downloading artifacts from the network.'
1115+
)
1116+
);
1117+
}, overrides: <Type, Generator>{
1118+
GradleUtils: () => FakeGradleUtils(),
1119+
Platform: () => fakePlatform('android'),
1120+
FileSystem: () => MemoryFileSystem.test(),
1121+
ProcessManager: () => FakeProcessManager.empty(),
1122+
});
1123+
});
1124+
10571125
}
10581126

10591127
bool formatTestErrorMessage(String errorMessage, GradleHandledError error) {

0 commit comments

Comments
 (0)