/// <summary> /// Raises the <see cref="RequestFailed"/> event. Note, sender is null. /// </summary> /// <param name="inUri"></param> internal static void onRequestFailed(Uri inUri, HttpWebResponse inResponse, TMDbStatusResponse inStatusResponse) { // Written, 24.11.2019 Console.WriteLine("Request failed: {0} Code {1}.", inStatusResponse.status_message, inStatusResponse.status_code); RequestFailed?.Invoke(null, new RequestFailedEventArgs(inUri, inResponse, inStatusResponse)); }
/// <summary> /// Sends a request to the provided url, and returns a <see cref="HttpWebResponse"/>. /// </summary> /// <param name="inUri">The url to request from.</param> /// <param name="inData">The data to pass.</param> public static async Task <HttpWebResponse> sendRequestAsync(Uri inUri, byte[] inData = null) { // Written, 05.06.2018 HttpWebRequest request = WebRequest.Create(inUri) as HttpWebRequest; HttpWebResponse response = null; TMDbStatusResponse statusResponse = null; onRequestSending(inUri); try { if (inData != null) { request.AllowWriteStreamBuffering = true; request.Method = "POST"; request.ContentType = "application/json"; request.ContentLength = inData.Length; using (Stream post = request.GetRequestStream()) { post.Write(inData, 0, inData.Length); post.Close(); } } response = await request.GetResponseAsync() as HttpWebResponse; onRequestSent(inUri, response); return(response); } catch (WebException ex) { bool successfulPing = false; try { Ping ping = new Ping(); PingReply reply = await ping.SendPingAsync(inUri.Host, 2000); successfulPing = (reply.Status == IPStatus.Success || reply.Status == IPStatus.TimedOut); Console.WriteLine("REPLY: {0}", reply.Status); } catch (PingException pingEx) { statusResponse = new TMDbStatusResponse() { status_message = String.Format("Check internet connection. Error ({0})", pingEx.GetType().Name), status_code = 401 }; } if (successfulPing) { response = ex.Response as HttpWebResponse; statusResponse = (await toJObject(response)).ToObject <TMDbStatusResponse>(); HttpStatusCode statusCode = response.StatusCode; bool isInt = Int32.TryParse(statusCode.ToString(), out int code); if (isInt && code == TMDb_Codes["Request Limit Exceeded"]) // Too many requests error code { delay = Int32.Parse(response.Headers.Get("Retry-After")); if (delay > 0) { await onDelay(); } return(await sendRequestAsync(inUri)); } } onRequestFailed(inUri, response, statusResponse); if (statusResponse is null) { throw; } else { throw new Exception(String.Format("{0}: Code {1}", statusResponse.status_message, statusResponse.status_code)); } } }
/// <summary> /// Initializes a new instance. /// </summary> /// <param name="inUri">url</param> /// <param name="inResponse">response</param> /// <param name="inStatusResponse">tmdb response</param> public RequestFailedEventArgs(Uri inUri, HttpWebResponse inResponse, TMDbStatusResponse inStatusResponse) : base(inUri, inResponse) { // Written, 25.11.2019 this.statusResponse = inStatusResponse; }