Skip to content

[tool]: Proposal to show specific error message when invalid environment variables are set for HTTP validation #98328

@royarg02

Description

@royarg02

The doctor HTTP validation can be configured through environment variables by providing a custom timeout FLUTTER_DOCTOR_HOST_TIMEOUT or hosts PUB_HOSTED_URL and FLUTTER_STORAGE_BASE_URL. However, setting any of them to a invalid value crashes the doctor validation.

Steps to Reproduce

Run these commands:

$ FLUTTER_STORAGE_BASE_URL='::Not valid URI::' flutter doctor -v
$ PUB_HOSTED_URL='' flutter doctor -v
$ FLUTTER_DOCTOR_HOST_TIMEOUT='deadbeef' flutter doctor -v

Expected results:
The doctor flow completes normally, displaying errors when appropriate.

Actual results:
Tool crashes, listed below:

Invalid URI
[☠] HTTP Host Availability (the doctor check crashed)
    ✗ Due to an error, the doctor check did not complete. If the error message below is not helpful, please let us know about this issue at https://github.com/flutter/flutter/issues.
    ✗ FormatException: Invalid empty scheme (at character 1)
      ::Not valid URI::
      ^

    • #0      _Uri._fail (dart:core/uri.dart:1754:5)
      #1      new _Uri.notSimple (dart:core/uri.dart:1587:9)
      #2      Uri.parse (dart:core/uri.dart:1123:17)
      #3      HttpHostValidator._checkHostAvailability (package:flutter_tools/src/http_host_validator.dart:62:67)
      #4      MappedListIterable.elementAt (dart:_internal/iterable.dart:413:31)
      #5      ListIterator.moveNext (dart:_internal/iterable.dart:342:26)
      #6      Future.wait (dart:async/future.dart:471:26)
      #7      HttpHostValidator.validate (package:flutter_tools/src/http_host_validator.dart:88:19)
      #8      asyncGuard.<anonymous closure> (package:flutter_tools/src/base/async_guard.dart:111:32)
      #9      asyncGuard.<anonymous closure> (package:flutter_tools/src/base/async_guard.dart:109:18)
      #10     _rootRun (dart:async/zone.dart:1426:13)
      #11     _CustomZone.run (dart:async/zone.dart:1328:19)
      #12     _runZoned (dart:async/zone.dart:1861:10)
      #13     runZonedGuarded (dart:async/zone.dart:1849:12)
      #14     runZoned (dart:async/zone.dart:1780:12)
      #15     asyncGuard (package:flutter_tools/src/base/async_guard.dart:109:3)
      #16     Doctor.startValidatorTasks (package:flutter_tools/src/doctor.dart:206:9)
      #17     Doctor.diagnose (package:flutter_tools/src/doctor.dart:316:72)
      #18     DoctorCommand.runCommand (package:flutter_tools/src/commands/doctor.dart:50:48)
      #19     FlutterCommand.verifyThenRunCommand (package:flutter_tools/src/runner/flutter_command.dart:1324:12)
      <asynchronous suspension>
      #20     FlutterCommand.run.<anonymous closure> (package:flutter_tools/src/runner/flutter_command.dart:1165:27)
      <asynchronous suspension>
      #21     AppContext.run.<anonymous closure> (package:flutter_tools/src/base/context.dart:150:19)
      <asynchronous suspension>
      #22     CommandRunner.runCommand (package:args/command_runner.dart:209:13)
      <asynchronous suspension>
      #23     FlutterCommandRunner.runCommand.<anonymous closure> (package:flutter_tools/src/runner/flutter_command_runner.dart:281:9)
      <asynchronous suspension>
      #24     AppContext.run.<anonymous closure> (package:flutter_tools/src/base/context.dart:150:19)
      <asynchronous suspension>
      #25     FlutterCommandRunner.runCommand (package:flutter_tools/src/runner/flutter_command_runner.dart:229:5)
      <asynchronous suspension>
      #26     run.<anonymous closure>.<anonymous closure> (package:flutter_tools/runner.dart:62:9)
      <asynchronous suspension>
      #27     AppContext.run.<anonymous closure> (package:flutter_tools/src/base/context.dart:150:19)
      <asynchronous suspension>
      #28     main (package:flutter_tools/executable.dart:94:3)
      <asynchronous suspension>

Invalid host
[☠] HTTP Host Availability (the doctor check crashed)
    ✗ Due to an error, the doctor check did not complete. If the error message below is not helpful, please let us know about this issue at https://github.com/flutter/flutter/issues.
    ✗ Invalid argument(s): No host specified in URI 
    • #0      _HttpClient._openUrl (dart:_http/http_impl.dart:2667:9)
      #1      _HttpClient.headUrl (dart:_http/http_impl.dart:2595:49)
      #2      HttpHostValidator._checkHostAvailability (package:flutter_tools/src/http_host_validator.dart:62:55)
      #3      MappedListIterable.elementAt (dart:_internal/iterable.dart:413:31)
      #4      ListIterator.moveNext (dart:_internal/iterable.dart:342:26)
      #5      Future.wait (dart:async/future.dart:471:26)
      #6      HttpHostValidator.validate (package:flutter_tools/src/http_host_validator.dart:88:19)
      #7      asyncGuard.<anonymous closure> (package:flutter_tools/src/base/async_guard.dart:111:32)
      #8      asyncGuard.<anonymous closure> (package:flutter_tools/src/base/async_guard.dart:109:18)
      #9      _rootRun (dart:async/zone.dart:1426:13)
      #10     _CustomZone.run (dart:async/zone.dart:1328:19)
      #11     _runZoned (dart:async/zone.dart:1861:10)
      #12     runZonedGuarded (dart:async/zone.dart:1849:12)
      #13     runZoned (dart:async/zone.dart:1780:12)
      #14     asyncGuard (package:flutter_tools/src/base/async_guard.dart:109:3)
      #15     Doctor.startValidatorTasks (package:flutter_tools/src/doctor.dart:206:9)
      #16     Doctor.diagnose (package:flutter_tools/src/doctor.dart:316:72)
      #17     DoctorCommand.runCommand (package:flutter_tools/src/commands/doctor.dart:50:48)
      #18     FlutterCommand.verifyThenRunCommand (package:flutter_tools/src/runner/flutter_command.dart:1324:12)
      <asynchronous suspension>
      #19     FlutterCommand.run.<anonymous closure> (package:flutter_tools/src/runner/flutter_command.dart:1165:27)
      <asynchronous suspension>
      #20     AppContext.run.<anonymous closure> (package:flutter_tools/src/base/context.dart:150:19)
      <asynchronous suspension>
      #21     CommandRunner.runCommand (package:args/command_runner.dart:209:13)
      <asynchronous suspension>
      #22     FlutterCommandRunner.runCommand.<anonymous closure> (package:flutter_tools/src/runner/flutter_command_runner.dart:281:9)
      <asynchronous suspension>
      #23     AppContext.run.<anonymous closure> (package:flutter_tools/src/base/context.dart:150:19)
      <asynchronous suspension>
      #24     FlutterCommandRunner.runCommand (package:flutter_tools/src/runner/flutter_command_runner.dart:229:5)
      <asynchronous suspension>
      #25     run.<anonymous closure>.<anonymous closure> (package:flutter_tools/runner.dart:62:9)
      <asynchronous suspension>
      #26     AppContext.run.<anonymous closure> (package:flutter_tools/src/base/context.dart:150:19)
      <asynchronous suspension>
      #27     main (package:flutter_tools/executable.dart:94:3)
      <asynchronous suspension>
Invalid timeout duration
[☠] HTTP Host Availability (the doctor check crashed)
    ✗ Due to an error, the doctor check did not complete. If the error message below is not helpful, please let us know about this issue at https://github.com/flutter/flutter/issues.
    ✗ FormatException: Invalid radix-10 number (at character 1)
      deadbeef
      ^

    • #0      int._handleFormatError (dart:core-patch/integers_patch.dart:131:5)
      #1      int._parseRadix (dart:core-patch/integers_patch.dart:142:16)
      #2      int._parse (dart:core-patch/integers_patch.dart:103:12)
      #3      int.parse (dart:core-patch/integers_patch.dart:65:12)
      #4      HttpHostValidator._checkHostAvailability (package:flutter_tools/src/http_host_validator.dart:61:11)
      #5      MappedListIterable.elementAt (dart:_internal/iterable.dart:413:31)
      #6      ListIterator.moveNext (dart:_internal/iterable.dart:342:26)
      #7      Future.wait (dart:async/future.dart:471:26)
      #8      HttpHostValidator.validate (package:flutter_tools/src/http_host_validator.dart:88:19)
      #9      asyncGuard.<anonymous closure> (package:flutter_tools/src/base/async_guard.dart:111:32)
      #10     asyncGuard.<anonymous closure> (package:flutter_tools/src/base/async_guard.dart:109:18)
      #11     _rootRun (dart:async/zone.dart:1426:13)
      #12     _CustomZone.run (dart:async/zone.dart:1328:19)
      #13     _runZoned (dart:async/zone.dart:1861:10)
      #14     runZonedGuarded (dart:async/zone.dart:1849:12)
      #15     runZoned (dart:async/zone.dart:1780:12)
      #16     asyncGuard (package:flutter_tools/src/base/async_guard.dart:109:3)
      #17     Doctor.startValidatorTasks (package:flutter_tools/src/doctor.dart:206:9)
      #18     Doctor.diagnose (package:flutter_tools/src/doctor.dart:316:72)
      #19     DoctorCommand.runCommand (package:flutter_tools/src/commands/doctor.dart:50:48)
      #20     FlutterCommand.verifyThenRunCommand (package:flutter_tools/src/runner/flutter_command.dart:1324:12)
      <asynchronous suspension>
      #21     FlutterCommand.run.<anonymous closure> (package:flutter_tools/src/runner/flutter_command.dart:1165:27)
      <asynchronous suspension>
      #22     AppContext.run.<anonymous closure> (package:flutter_tools/src/base/context.dart:150:19)
      <asynchronous suspension>
      #23     CommandRunner.runCommand (package:args/command_runner.dart:209:13)
      <asynchronous suspension>
      #24     FlutterCommandRunner.runCommand.<anonymous closure> (package:flutter_tools/src/runner/flutter_command_runner.dart:281:9)
      <asynchronous suspension>
      #25     AppContext.run.<anonymous closure> (package:flutter_tools/src/base/context.dart:150:19)
      <asynchronous suspension>
      #26     FlutterCommandRunner.runCommand (package:flutter_tools/src/runner/flutter_command_runner.dart:229:5)
      <asynchronous suspension>
      #27     run.<anonymous closure>.<anonymous closure> (package:flutter_tools/runner.dart:62:9)
      <asynchronous suspension>
      #28     AppContext.run.<anonymous closure> (package:flutter_tools/src/base/context.dart:150:19)
      <asynchronous suspension>
      #29     main (package:flutter_tools/executable.dart:94:3)
      <asynchronous suspension>

flutter doctor -v
[✓] Flutter (Channel master, 2.11.0-0.0.pre.521, on Artix Linux 5.16.7-artix1-1, locale en_IN.UTF-8)
    • Flutter version 2.11.0-0.0.pre.521 at /home/rarg/.local/src/flutter_sdk_master
    • Upstream repository https://github.com/flutter/flutter.git
    • Framework revision 81b9c35274 (18 hours ago), 2022-02-11 09:30:51 -0800
    • Engine revision bed591d394
    • Dart version 2.17.0 (build 2.17.0-87.0.dev)
    • DevTools version 2.10.0

[✓] Android toolchain - develop for Android devices (Android SDK version 29.0.2)
    • Android SDK at /opt/android-sdk
    • Platform android-31, build-tools 29.0.2
    • ANDROID_HOME = /opt/android-sdk
    • ANDROID_SDK_ROOT = /opt/android-sdk
    • Java binary at: /usr/bin/java
    • Java version OpenJDK Runtime Environment (build 11.0.13+8)
    • All Android licenses accepted.

[✓] Chrome - develop for the web
    • CHROME_EXECUTABLE = /usr/bin/chromium

[✓] Linux toolchain - develop for Linux desktop
    • clang version 13.0.1
    • cmake version 3.22.2
    • ninja version 1.10.2
    • pkg-config version 1.8.0

[!] Android Studio (not installed)
    • Android Studio not found; download from https://developer.android.com/studio/index.html
      (or visit https://flutter.dev/docs/get-started/install/linux#android-setup for detailed instructions).

[✓] Connected device (2 available)
    • Linux (desktop) • linux  • linux-x64      • Artix Linux 5.16.7-artix1-1
    • Chrome (web)    • chrome • web-javascript • Chromium 98.0.4758.80 Artix Linux

[✓] HTTP Host Availability
    • All required HTTP hosts are available

! Doctor found issues in 1 category.

Metadata

Metadata

Assignees

No one assigned

    Labels

    c: proposalA detailed proposal for a change to Flutterr: fixedIssue is closed as already fixed in a newer versiont: flutter doctorProblem related to the "flutter doctor" tooltoolAffects the "flutter" command-line tool. See also t: labels.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions