/// <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));
                }
            }
        }
Esempio n. 3
0
        /// <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;
        }