// Copyright 2019 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. import 'dart:async'; import 'base/platform.dart'; import 'doctor.dart'; class ProxyValidator extends DoctorValidator { ProxyValidator() : super('Proxy Configuration'); static bool get shouldShow => _getEnv('HTTP_PROXY').isNotEmpty; final String _httpProxy = _getEnv('HTTP_PROXY'); final String _noProxy = _getEnv('NO_PROXY'); /// Gets a trimmed, non-null environment variable. If the variable is not set /// an empty string will be returned. Checks for the lowercase version of the /// environment variable first, then uppercase to match Dart's HTTP implementation. static String _getEnv(String key) => platform.environment[key.toLowerCase()]?.trim() ?? platform.environment[key.toUpperCase()]?.trim() ?? ''; @override Future<ValidationResult> validate() async { final List<ValidationMessage> messages = <ValidationMessage>[]; if (_httpProxy.isNotEmpty) { messages.add(ValidationMessage('HTTP_PROXY is set')); if (_noProxy.isEmpty) { messages.add(ValidationMessage.hint('NO_PROXY is not set')); } else { messages.add(ValidationMessage('NO_PROXY is $_noProxy')); for (String host in const <String>['127.0.0.1', 'localhost']) { final ValidationMessage msg = _noProxy.contains(host) ? ValidationMessage('NO_PROXY contains $host') : ValidationMessage.hint('NO_PROXY does not contain $host'); messages.add(msg); } } } final bool hasIssues = messages.any((ValidationMessage msg) => msg.isHint || msg.isHint); return ValidationResult( hasIssues ? ValidationType.partial : ValidationType.installed, messages, ); } }