public async Task <WebCallResponse> Execute(string qString, string exBody = null, HttpMethod exVerb = null) { int retries = 0; var wcr = new WebCallRequest { FullUri = GetUri(BaseUri, Stem, qString), Verb = exVerb ?? Verb, Body = exBody, AllHeaders = new NameValueCollection(headers) }; var f = await ActualCall(wcr); while ((f.Status != HttpStatusCode.OK) && (f.Status != HttpStatusCode.NotFound)) { retries++; if (retries >= RetryCount) { break; } f = await ActualCall(wcr); } return(f); }
protected virtual async Task <WebCallResponse> ActualCall(WebCallRequest wcr) { var result = new WebCallResponse(); var request = (HttpWebRequest)WebRequest.Create(wcr.FullUri); request.Method = wcr.Verb.Method; if (!string.IsNullOrWhiteSpace(Host)) { request.Host = Host; } request.Headers.Add(wcr.AllHeaders); //Invalid SSL Certificate support. if (AcceptAllCerts) { ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyErrors) => { return(true); }; } else if (NameCheckSSLCallback != null) { ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyErrors) => { return(cert.Issuer.ToLower().Contains(namneCheckStringValue)); }; } try { b.Verbose.Log(wcr.DiagnosticSummary()); if (!string.IsNullOrEmpty(wcr.Body)) { var encoding = new UTF8Encoding(); var byteArray = encoding.GetBytes(wcr.Body); request.ContentLength = byteArray.Length; request.ContentType = @"application/json"; using (Stream dataStream = request.GetRequestStream()) { dataStream.Write(byteArray, 0, byteArray.Length); } } else { request.ContentLength = 0; } var req = request.GetResponseAsync(); Stream responseStream = null; try { try { var response = await req.ConfigureAwait(false); responseStream = response.GetResponseStream(); using (StreamReader reader = new StreamReader(responseStream, Encoding.UTF8)) { responseStream = null; result.ResponseText = await reader.ReadToEndAsync().ConfigureAwait(false); // TODO : Dont log what could be a massive string out b.Log.Summarise(); b.Verbose.Log(result.ResponseText); } result.Status = HttpStatusCode.OK; result.Exception = null; } catch (WebException wx) { result.Exception = wx; if (wx.Status == WebExceptionStatus.ProtocolError) { if (wx.Response is HttpWebResponse r) { result.Status = r.StatusCode; } } } finally { responseStream?.Dispose(); } } finally { req?.Dispose(); } } catch (Exception ex) { b.Error.Dump(ex, $"httpActualCAll Failed {wcr.FullUri}"); throw; } return(result); }