using NLog; using NzbDrone.Common.Http; using NzbDrone.Core.Configuration; using System; using System.Linq; using System.Net; using NzbDrone.Common.Cloud; namespace NzbDrone.Core.HealthCheck.Checks { public class ProxyCheck : HealthCheckBase { private readonly Logger _logger; private readonly IConfigService _configService; private readonly IHttpClient _client; private readonly IHttpRequestBuilderFactory _cloudRequestBuilder; public ProxyCheck(ILidarrCloudRequestBuilder cloudRequestBuilder, IConfigService configService, IHttpClient client, Logger logger) { _configService = configService; _client = client; _logger = logger; _cloudRequestBuilder = cloudRequestBuilder.Services; } public override HealthCheck Check() { if (_configService.ProxyEnabled) { var addresses = Dns.GetHostAddresses(_configService.ProxyHostname); if (!addresses.Any()) { return new HealthCheck(GetType(), HealthCheckResult.Error, string.Format("Failed to resolve the IP Address for the Configured Proxy Host {0}", _configService.ProxyHostname)); } var request = _cloudRequestBuilder.Create() .Resource("/ping") .Build(); try { var response = _client.Execute(request); // We only care about 400 responses, other error codes can be ignored if (response.StatusCode == HttpStatusCode.BadRequest) { _logger.Error("Proxy Health Check failed: {0}", response.StatusCode); return new HealthCheck(GetType(), HealthCheckResult.Error, $"Failed to test proxy. StatusCode: {response.StatusCode}"); } } catch (Exception ex) { _logger.Error(ex, "Proxy Health Check failed"); return new HealthCheck(GetType(), HealthCheckResult.Error, $"Failed to test proxy: {request.Url}"); } } return new HealthCheck(GetType()); } } }