public Task <int> SaveProbingLogAsync(ProbingLog log) { if (log.ID != 0) { return(database.UpdateAsync(log)); } return(database.InsertAsync(log)); }
public static string GetRoundtripTimeString(this ProbingLog log) { if (log.RequestFinish == DateTime.MaxValue) { return("--"); } var tspn = log.RequestFinish - log.RequestStart; return($"{Math.Floor(tspn.TotalSeconds)}.{tspn.Milliseconds:0.##}s"); }
public static async Task <ProbingLog> TestService(Service service) { var cts = new CancellationTokenSource(); var log = new ProbingLog { ServiceID = service.ID, ServiceName = service.Name, UsedUri = service.URI, UsedMethod = service.Method, ExpectedResponseCode = service.ExpectedResponseCode, UsedTimeout = service.Timeout, Status = ServiceStatus.Untested }; HttpResponseMessage response = null; log.RequestStart = DateTime.Now; //this is not ideal, but setting timeout in HttpClient causes uncatchable native exception Task.Run(async() => { await Task.Delay(service.Timeout); cts.Cancel(); }); httpClient.DefaultRequestHeaders.CacheControl = new CacheControlHeaderValue { NoCache = true }; var request = new HttpRequestMessage(service.Method.ToHttpMethodObj(), service.GetFullUri()); foreach (var item in service.Headers) { try { request.Headers.Add(item.Key, item.Value); } catch (Exception e) { //don't send invalid headers (parser is for some reason private so we can't check validity at entering } } try { response = await httpClient.SendAsync(request, cts.Token); } catch (HttpRequestException e) { HandleRequestFinish(ref log, ref response); log.Status = ServiceStatus.NetworkError; return(log); } catch (TaskCanceledException e) { log.Status = ServiceStatus.Timeout; return(log); } catch (Exception e) { log.Status = ServiceStatus.Timeout; return(log); } if (response == null) { log.Status = ServiceStatus.NetworkError; return(log); } if (response.StatusCode != service.ExpectedResponseCode) { HandleRequestFinish(ref log, ref response); log.Status = ServiceStatus.ResponseCodeMismatch; return(log); } HandleRequestFinish(ref log, ref response); log.Status = ServiceStatus.AliveAndWell; if (service.BodyMustContain.Any() || service.BodyMustNotContain.Any()) { var body = await response.Content.ReadAsStringAsync(); // idea: use regex if (service.BodyMustContain.Any(s => !body.Contains(s.Value))) { log.Status = ServiceStatus.BodyValidationFail; } if (service.BodyMustNotContain.Any(s => body.Contains(s.Value))) { log.Status = ServiceStatus.BodyValidationFail; } } return(log); }
private static void HandleRequestFinish(ref ProbingLog log, ref HttpResponseMessage response) { log.RequestFinish = DateTime.Now; log.ReceivedResponseCode = response.StatusCode; }
public Task <int> DeleteProbingLogAsync(ProbingLog log) { return(database.DeleteAsync(log)); }