attemptFix method

Future<ProxyFixResult> attemptFix()

Attempts to fix common proxy issues

Implementation

Future<ProxyFixResult> attemptFix() async {
  final result = ProxyFixResult();

  try {
    // Step 1: Clear any cached proxies that might be invalid
    result.steps.add('Clearing cached proxies');

    // Step 2: Try to fetch new proxies with relaxed constraints
    result.steps.add('Fetching new proxies with relaxed constraints');
    try {
      final proxies = await _proxyManager.fetchProxies(
        options: ProxyFilterOptions(
          count: 50, // Get more proxies
          onlyHttps: false, // Don't restrict to HTTPS
        ),
      );

      result.steps.add('Fetched ${proxies.length} proxies');
      result.proxyCount = proxies.length;

      if (proxies.isEmpty) {
        result.steps.add('No proxies fetched, trying alternative sources');

        // Try with a different source configuration
        // This would require modifying the proxy manager's source config
        // which isn't directly accessible here
      }
    } catch (e) {
      result.steps.add('Error fetching proxies: $e');
    }

    // Step 3: Validate proxies with increased timeout
    result.steps.add('Validating proxies with increased timeout');
    try {
      final validatedProxies = await _proxyManager.fetchValidatedProxies(
        options: ProxyFilterOptions(
          count: 10,
          onlyHttps: false, // Don't restrict to HTTPS
        ),
        onProgress: (completed, total) {
          result.steps.add('Validated $completed of $total proxies');
        },
      );

      result.steps.add(
        'Successfully validated ${validatedProxies.length} proxies',
      );
      result.validatedProxyCount = validatedProxies.length;
    } catch (e) {
      result.steps.add('Error validating proxies: $e');
    }

    // Step 4: Test if we can get a proxy now
    try {
      final proxy = _proxyManager.getNextProxy(validated: true);
      result.steps.add(
        'Successfully retrieved a proxy: ${proxy.ip}:${proxy.port}',
      );
      result.fixSuccessful = true;
    } catch (e) {
      result.steps.add('Still unable to get a proxy: $e');

      // Step 5: Last resort - try with unvalidated proxies
      try {
        final proxy = _proxyManager.getNextProxy(validated: false);
        result.steps.add(
          'Retrieved an unvalidated proxy: ${proxy.ip}:${proxy.port}',
        );
        result.steps.add(
          'WARNING: Using unvalidated proxies may cause issues',
        );
        result.fixSuccessful = true;
        result.usesUnvalidatedProxies = true;
      } catch (e) {
        result.steps.add('Unable to get any proxy, even unvalidated: $e');
        result.fixSuccessful = false;
      }
    }
  } catch (e) {
    result.steps.add('Error during fix attempt: $e');
    result.fixSuccessful = false;
  }

  return result;
}