Add mirror overrides to doctor output (#56928)

diff --git a/packages/flutter_tools/lib/src/base/user_messages.dart b/packages/flutter_tools/lib/src/base/user_messages.dart
index a1a3163..a5dc91b 100644
--- a/packages/flutter_tools/lib/src/base/user_messages.dart
+++ b/packages/flutter_tools/lib/src/base/user_messages.dart
@@ -22,6 +22,8 @@
       'Framework revision $revision ($age), $date';
   String engineRevision(String revision) => 'Engine revision $revision';
   String dartRevision(String revision) => 'Dart version $revision';
+  String pubMirrorURL(String url) => 'Pub download mirror $url';
+  String flutterMirrorURL(String url) => 'Flutter download mirror $url';
   String get flutterBinariesDoNotRun =>
       'Downloaded executables cannot execute on host.\n'
       'See https://github.com/flutter/flutter/issues/6207 for more information';
diff --git a/packages/flutter_tools/lib/src/doctor.dart b/packages/flutter_tools/lib/src/doctor.dart
index bad0a9d..c883bab 100644
--- a/packages/flutter_tools/lib/src/doctor.dart
+++ b/packages/flutter_tools/lib/src/doctor.dart
@@ -642,6 +642,12 @@
       )));
       messages.add(ValidationMessage(userMessages.engineRevision(version.engineRevisionShort)));
       messages.add(ValidationMessage(userMessages.dartRevision(version.dartSdkVersion)));
+      if (globals.platform.environment.containsKey('PUB_HOSTED_URL')) {
+        messages.add(ValidationMessage(userMessages.pubMirrorURL(globals.platform.environment['PUB_HOSTED_URL'])));
+      }
+      if (globals.platform.environment.containsKey('FLUTTER_STORAGE_BASE_URL')) {
+        messages.add(ValidationMessage(userMessages.flutterMirrorURL(globals.platform.environment['FLUTTER_STORAGE_BASE_URL'])));
+      }
     } on VersionCheckError catch (e) {
       messages.add(ValidationMessage.error(e.message));
       valid = ValidationType.partial;
diff --git a/packages/flutter_tools/test/commands.shard/hermetic/doctor_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/doctor_test.dart
index 308043c..1d1eb0d 100644
--- a/packages/flutter_tools/test/commands.shard/hermetic/doctor_test.dart
+++ b/packages/flutter_tools/test/commands.shard/hermetic/doctor_test.dart
@@ -35,6 +35,7 @@
 
 final Generator _kNoColorOutputPlatform = () => FakePlatform(
   localeName: 'en_US.UTF-8',
+  environment: <String, String>{},
   stdoutSupportsAnsi: false,
 );
 
@@ -588,6 +589,24 @@
       Platform: _kNoColorOutputPlatform,
       FlutterVersion: () => mockFlutterVersion,
     });
+
+    testUsingContext('shows mirrors', () async {
+      (globals.platform as FakePlatform).environment = <String, String>{
+        'PUB_HOSTED_URL': 'https://example.com/pub',
+        'FLUTTER_STORAGE_BASE_URL': 'https://example.com/flutter',
+      };
+
+      expect(await FlutterValidatorDoctor(logger).diagnose(verbose: true), isTrue);
+      expect(logger.statusText, contains('Pub download mirror https://example.com/pub'));
+      expect(logger.statusText, contains('Flutter download mirror https://example.com/flutter'));
+    }, overrides: <Type, Generator>{
+      Artifacts: () => mockArtifacts,
+      FileSystem: () => memoryFileSystem,
+      OutputPreferences: () => OutputPreferences(wrapText: false),
+      ProcessManager: () => mockProcessManager,
+      Platform: _kNoColorOutputPlatform,
+      FlutterVersion: () => mockFlutterVersion,
+    });
   });
 
   testUsingContext('validate non-verbose output wrapping', () async {