예제 #1
0
        private async Task <TransmissionResponse> SendRequestAsync(TransmissionRequest request)
        {
            TransmissionResponse result = new TransmissionResponse();

            request.Tag = ++CurrentTag;

            try
            {
                byte[] byteArray = Encoding.UTF8.GetBytes(request.ToJson());

                //Prepare http web request
                HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(Host);

                webRequest.ContentType = "application/json-rpc";
                webRequest.Headers["X-Transmission-Session-Id"] = SessionID;
                webRequest.Method = "POST";

                if (_needAuthorization)
                {
                    webRequest.Headers["Authorization"] = _authorization;
                }

                using (Stream dataStream = await webRequest.GetRequestStreamAsync())
                {
                    dataStream.Write(byteArray, 0, byteArray.Length);
                }

                //Send request and prepare response
                using (var webResponse = await webRequest.GetResponseAsync())
                {
                    using (Stream responseStream = webResponse.GetResponseStream())
                    {
                        var reader         = new StreamReader(responseStream, Encoding.UTF8);
                        var responseString = reader.ReadToEnd();
                        result = JsonConvert.DeserializeObject <TransmissionResponse>(responseString);

                        if (result.Result != "success")
                        {
                            throw new Exception(result.Result);
                        }
                    }
                }
            }
            catch (WebException ex)
            {
                if (((HttpWebResponse)ex.Response).StatusCode == HttpStatusCode.Conflict)
                {
                    if (ex.Response.Headers.Count > 0)
                    {
                        //If session id expiried, try get session id and send request
                        SessionID = ex.Response.Headers["X-Transmission-Session-Id"];

                        if (SessionID == null)
                        {
                            throw new Exception("Session ID Error");
                        }

                        result = await SendRequestAsync(request);
                    }
                }
                else
                {
                    throw ex;
                }
            }

            return(result);
        }
예제 #2
0
        private async Task <TransmissionResponse> SendRequestAsync(TransmissionRequest request, CancellationToken token)
        {
            var result = new TransmissionResponse();

            request.Tag = ++CurrentTag;
            var counter   = 0;
            var byteArray = Encoding.UTF8.GetBytes(request.ToJson());

            //Prepare http web request
            if (!CheckURLValid(Url))
            {
                throw new WebException("Host error", WebExceptionStatus.NameResolutionFailure);
            }


            while (counter < NumberOfAttempts)
            {
                try
                {
                    var webRequest = (HttpWebRequest)WebRequest.Create(Url);
                    webRequest.ContentType = "application/json-rpc";
                    webRequest.Method      = "POST";
                    if (_needAuthorization)
                    {
                        webRequest.Headers["Authorization"] = _authorization;
                    }

                    webRequest.Headers["X-Transmission-Session-Id"] = SessionId;

                    await using (var dataStream = await webRequest.GetRequestStreamAsync())
                    {
                        await dataStream.WriteAsync(byteArray, 0, byteArray.Length, token);
                    }

                    //Send request and prepare response
                    using var webResponse = await webRequest.GetResponseAsync(token);

                    await using var responseStream = await webResponse.GetResponseStream(token);

                    if (responseStream == null)
                    {
                        result.CustomException = new Exception("Stream resonse is null");
                        Log.Error(result.WebException);
                        return(result);
                    }

                    var reader         = new StreamReader(responseStream, Encoding.UTF8);
                    var responseString = await reader.ReadToEndAsync(token);

                    result = JsonConvert.DeserializeObject <TransmissionResponse>(responseString);

                    if (result.Result != "success")
                    {
                        throw new Exception(result.Result);
                    }
                    break;
                }
                catch (TaskCanceledException)
                {
                    result.Result = "canceled";
                    return(result);
                }
            }