Unverified Commit 1561b658 authored by Christopher Fujino's avatar Christopher Fujino Committed by GitHub

add gradle error handler for when the remote ssl host terminates handshake process (#125270)

Will fix transient network failures as in: https://github.com/flutter/flutter/issues/125108#issuecomment-1516519929
parent d93ffc10
...@@ -205,6 +205,7 @@ class AndroidGradleBuilder implements AndroidBuilder { ...@@ -205,6 +205,7 @@ class AndroidGradleBuilder implements AndroidBuilder {
isBuildingBundle: false, isBuildingBundle: false,
localGradleErrors: gradleErrors, localGradleErrors: gradleErrors,
configOnly: configOnly, configOnly: configOnly,
maxRetries: 1,
); );
} }
...@@ -227,6 +228,7 @@ class AndroidGradleBuilder implements AndroidBuilder { ...@@ -227,6 +228,7 @@ class AndroidGradleBuilder implements AndroidBuilder {
validateDeferredComponents: validateDeferredComponents, validateDeferredComponents: validateDeferredComponents,
deferredComponentsEnabled: deferredComponentsEnabled, deferredComponentsEnabled: deferredComponentsEnabled,
configOnly: configOnly, configOnly: configOnly,
maxRetries: 1,
); );
} }
......
...@@ -84,6 +84,7 @@ final List<GradleHandledError> gradleErrors = <GradleHandledError>[ ...@@ -84,6 +84,7 @@ final List<GradleHandledError> gradleErrors = <GradleHandledError>[
sslExceptionHandler, sslExceptionHandler,
zipExceptionHandler, zipExceptionHandler,
incompatibleJavaAndGradleVersionsHandler, incompatibleJavaAndGradleVersionsHandler,
remoteTerminatedHandshakeHandler,
]; ];
const String _boxTitle = 'Flutter Fix'; const String _boxTitle = 'Flutter Fix';
...@@ -700,3 +701,22 @@ final GradleHandledError incompatibleJavaAndGradleVersionsHandler = GradleHandle ...@@ -700,3 +701,22 @@ final GradleHandledError incompatibleJavaAndGradleVersionsHandler = GradleHandle
}, },
eventLabel: 'incompatible-java-gradle-version', eventLabel: 'incompatible-java-gradle-version',
); );
@visibleForTesting
final GradleHandledError remoteTerminatedHandshakeHandler = GradleHandledError(
test: (String line) => line.contains('Remote host terminated the handshake'),
handler: ({
required String line,
required FlutterProject project,
required bool usesAndroidX,
required bool multidexEnabled,
}) async {
globals.printError(
'${globals.logger.terminal.warningMark} '
'Gradle threw an error while downloading artifacts from the network.'
);
return GradleBuildStatus.retry;
},
eventLabel: 'remote-terminated-handshake',
);
...@@ -49,6 +49,7 @@ void main() { ...@@ -49,6 +49,7 @@ void main() {
sslExceptionHandler, sslExceptionHandler,
zipExceptionHandler, zipExceptionHandler,
incompatibleJavaAndGradleVersionsHandler, incompatibleJavaAndGradleVersionsHandler,
remoteTerminatedHandshakeHandler,
]) ])
); );
}); });
...@@ -88,6 +89,50 @@ at org.gradle.wrapper.GradleWrapperMain.main(GradleWrapperMain.java:61)'''; ...@@ -88,6 +89,50 @@ at org.gradle.wrapper.GradleWrapperMain.main(GradleWrapperMain.java:61)''';
ProcessManager: () => processManager, ProcessManager: () => processManager,
}); });
testUsingContext('retries if remote host terminated ssl handshake', () async {
const String errorMessage = r'''
Exception in thread "main" javax.net.ssl.SSLHandshakeException: Remote host terminated the handshake
at java.base/sun.security.ssl.SSLSocketImpl.handleEOF(SSLSocketImpl.java:1696)
at java.base/sun.security.ssl.SSLSocketImpl.decode(SSLSocketImpl.java:1514)
at java.base/sun.security.ssl.SSLSocketImpl.readHandshakeRecord(SSLSocketImpl.java:1416)
at java.base/sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:456)
at java.base/sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:427)
at java.base/sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:572)
at java.base/sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:197)
at java.base/sun.net.www.protocol.http.HttpURLConnection.followRedirect0(HttpURLConnection.java:2783)
at java.base/sun.net.www.protocol.http.HttpURLConnection.followRedirect(HttpURLConnection.java:2695)
at java.base/sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1854)
at java.base/sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1520)
at java.base/sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:250)
at org.gradle.wrapper.Download.downloadInternal(Download.java:58)
at org.gradle.wrapper.Download.download(Download.java:44)
at org.gradle.wrapper.Install$1.call(Install.java:61)
at org.gradle.wrapper.Install$1.call(Install.java:48)
at org.gradle.wrapper.ExclusiveFileAccessManager.access(ExclusiveFileAccessManager.java:65)
at org.gradle.wrapper.Install.createDist(Install.java:48)
at org.gradle.wrapper.WrapperExecutor.execute(WrapperExecutor.java:128)
at org.gradle.wrapper.GradleWrapperMain.main(GradleWrapperMain.java:61)
Caused by: java.io.EOFException: SSL peer shut down incorrectly
at java.base/sun.security.ssl.SSLSocketInputRecord.read(SSLSocketInputRecord.java:483)
at java.base/sun.security.ssl.SSLSocketInputRecord.readHeader(SSLSocketInputRecord.java:472)
at java.base/sun.security.ssl.SSLSocketInputRecord.decode(SSLSocketInputRecord.java:160)
at java.base/sun.security.ssl.SSLTransport.decode(SSLTransport.java:111)
at java.base/sun.security.ssl.SSLSocketImpl.decode(SSLSocketImpl.java:1506)''';
expect(formatTestErrorMessage(errorMessage, remoteTerminatedHandshakeHandler), isTrue);
expect(await remoteTerminatedHandshakeHandler.handler(
line: '',
multidexEnabled: true,
project: FakeFlutterProject(),
usesAndroidX: true,
), equals(GradleBuildStatus.retry));
expect(testLogger.errorText,
contains(
'Gradle threw an error while downloading artifacts from the network.'
)
);
});
testUsingContext('retries if gradle fails downloading with proxy error', () async { testUsingContext('retries if gradle fails downloading with proxy error', () async {
const String errorMessage = r''' const String errorMessage = r'''
Exception in thread "main" java.io.IOException: Unable to tunnel through proxy. Proxy returns "HTTP/1.1 400 Bad Request" Exception in thread "main" java.io.IOException: Unable to tunnel through proxy. Proxy returns "HTTP/1.1 400 Bad Request"
......
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