コード例 #1
0
        private DiskStationResponse <T> ProcessRequest <T>(HttpRequestBuilder requestBuilder,
                                                           string operation,
                                                           DiskStationApi api,
                                                           DownloadStationSettings settings)
            where T : new()
        {
            var          request = requestBuilder.Build();
            HttpResponse response;

            try
            {
                response = _httpClient.Execute(request);
            }
            catch (HttpException ex)
            {
                throw new DownloadClientException("Unable to connect to Diskstation, please check your settings", ex);
            }
            catch (WebException ex)
            {
                if (ex.Status == WebExceptionStatus.TrustFailure)
                {
                    throw new DownloadClientUnavailableException("Unable to connect to Diskstation, certificate validation failed.", ex);
                }

                throw new DownloadClientUnavailableException("Unable to connect to Diskstation, please check your settings", ex);
            }

            _logger.Debug("Trying to {0}", operation);

            if (response.StatusCode == HttpStatusCode.OK)
            {
                var responseContent = Json.Deserialize <DiskStationResponse <T> >(response.Content);

                if (responseContent.Success)
                {
                    return(responseContent);
                }
                else
                {
                    var msg = $"Failed to {operation}. Reason: {responseContent.Error.GetMessage(api)}";
                    _logger.Error(msg);

                    if (responseContent.Error.SessionError)
                    {
                        _sessionCache.Remove(GenerateSessionCacheKey(settings));

                        if (responseContent.Error.Code == 105)
                        {
                            throw new DownloadClientAuthenticationException(msg);
                        }
                    }

                    throw new DownloadClientException(msg);
                }
            }
            else
            {
                throw new HttpException(request, response);
            }
        }
コード例 #2
0
        private DiskStationApiInfo GetApiInfo(DiskStationApi api, DownloadStationSettings settings)
        {
            if (api == DiskStationApi.Info)
            {
                return(_apiInfo);
            }

            var key  = GenerateInfoCacheKey(settings, api);
            var info = _infoCache.Find(key);

            if (info == null)
            {
                UpdateApiInfo(settings);
                info = _infoCache.Find(key);

                if (info == null)
                {
                    if (api == DiskStationApi.DownloadStation2Task)
                    {
                        _logger.Warn("Info of {0} not found on {1}:{2}", api, settings.Host, settings.Port);
                    }
                    else
                    {
                        throw new DownloadClientException("Info of {0} not found on {1}:{2}", api, settings.Host, settings.Port);
                    }
                }
            }

            return(info);
        }
コード例 #3
0
 protected DiskStationResponse <object> ProcessRequest(DiskStationApi api,
                                                       Dictionary <string, object> arguments,
                                                       DownloadStationSettings settings,
                                                       string operation,
                                                       HttpMethod method = HttpMethod.GET)
 {
     return(ProcessRequest <object>(api, arguments, settings, operation, method));
 }
コード例 #4
0
        protected DiskStationResponse <T> ProcessRequest <T>(DiskStationApi api,
                                                             Dictionary <string, object> arguments,
                                                             DownloadStationSettings settings,
                                                             string operation,
                                                             HttpMethod method = HttpMethod.GET,
                                                             int retries       = 0) where T : new()
        {
            if (retries == 5)
            {
                throw new DownloadClientException("Try to process request to {0} with {1} more than 5 times", api, arguments.ToJson().ToString());
            }

            if (!_authenticated && api != DiskStationApi.Info && api != DiskStationApi.DSMInfo)
            {
                AuthenticateClient(settings);
            }

            var request  = BuildRequest(settings, api, arguments, method);
            var response = _httpClient.Execute(request);

            _logger.Debug("Trying to {0}", operation);

            if (response.StatusCode == HttpStatusCode.OK)
            {
                var responseContent = Json.Deserialize <DiskStationResponse <T> >(response.Content);

                if (responseContent.Success)
                {
                    return(responseContent);
                }
                else
                {
                    var msg = $"Failed to {operation}. Reason: {responseContent.Error.GetMessage(api)}";
                    _logger.Error(msg);

                    if (responseContent.Error.SessionError)
                    {
                        _authenticated = false;

                        if (responseContent.Error.Code == 105)
                        {
                            throw new DownloadClientAuthenticationException(msg);
                        }

                        return(ProcessRequest <T>(api, arguments, settings, operation, method, ++retries));
                    }

                    throw new DownloadClientException(msg);
                }
            }
            else
            {
                throw new HttpException(request, response);
            }
        }
コード例 #5
0
 public DiskStationProxyBase(DiskStationApi apiType,
                             string apiName,
                             IHttpClient httpClient,
                             ICacheManager cacheManager,
                             Logger logger)
 {
     _httpClient   = httpClient;
     _logger       = logger;
     _infoCache    = cacheManager.GetCache <DiskStationApiInfo>(typeof(DiskStationProxyBase), "apiInfo");
     _sessionCache = cacheManager.GetCache <string>(typeof(DiskStationProxyBase), "sessions");
     _apiType      = apiType;
     _apiName      = apiName;
 }
コード例 #6
0
        private HttpRequest BuildRequest(DownloadStationSettings settings, DiskStationApi api, Dictionary <string, object> arguments, HttpMethod method)
        {
            if (!Resources.ContainsKey(api))
            {
                GetApiVersion(settings, api);
            }

            var requestBuilder = new HttpRequestBuilder(settings.UseSsl, settings.Host, settings.Port).Resource($"webapi/{Resources[api]}");

            requestBuilder.Method             = method;
            requestBuilder.LogResponseContent = true;
            requestBuilder.SuppressHttpError  = true;
            requestBuilder.AllowAutoRedirect  = false;

            if (requestBuilder.Method == HttpMethod.POST)
            {
                if (api == DiskStationApi.DownloadStationTask && arguments.ContainsKey("file"))
                {
                    requestBuilder.Headers.ContentType = "multipart/form-data";

                    foreach (var arg in arguments)
                    {
                        if (arg.Key == "file")
                        {
                            Dictionary <string, object> file = (Dictionary <string, object>)arg.Value;
                            requestBuilder.AddFormUpload(arg.Key, file["name"].ToString(), (byte[])file["data"]);
                        }
                        else
                        {
                            requestBuilder.AddFormParameter(arg.Key, arg.Value);
                        }
                    }
                }
                else
                {
                    requestBuilder.Headers.ContentType = "application/json";
                }
            }
            else
            {
                foreach (var arg in arguments)
                {
                    requestBuilder.AddQueryParam(arg.Key, arg.Value);
                }
            }

            return(requestBuilder.Build());
        }
コード例 #7
0
        public string GetMessage(DiskStationApi api)
        {
            if (api == DiskStationApi.Auth && AuthMessages.ContainsKey(Code))
            {
                return(AuthMessages[Code]);
            }
            if (api == DiskStationApi.DownloadStationTask && DownloadStationTaskMessages.ContainsKey(Code))
            {
                return(DownloadStationTaskMessages[Code]);
            }
            if (api == DiskStationApi.FileStationList && FileStationMessages.ContainsKey(Code))
            {
                return(FileStationMessages[Code]);
            }

            return(CommonMessages[Code]);
        }
コード例 #8
0
        protected IEnumerable <int> GetApiVersion(DownloadStationSettings settings, DiskStationApi api)
        {
            var arguments = new Dictionary <string, object>
            {
                { "api", "SYNO.API.Info" },
                { "version", "1" },
                { "method", "query" },
                { "query", "SYNO.API.Auth, SYNO.DownloadStation.Info, SYNO.DownloadStation.Task, SYNO.FileStation.List, SYNO.DSM.Info" },
            };

            var infoResponse = ProcessRequest <DiskStationApiInfoResponse>(DiskStationApi.Info, arguments, settings, "Get api version");

            //TODO: Refactor this into more elegant code
            var infoResponeDSAuth   = infoResponse.Data["SYNO.API.Auth"];
            var infoResponeDSInfo   = infoResponse.Data["SYNO.DownloadStation.Info"];
            var infoResponeDSTask   = infoResponse.Data["SYNO.DownloadStation.Task"];
            var infoResponseFSList  = infoResponse.Data["SYNO.FileStation.List"];
            var infoResponseDSMInfo = infoResponse.Data["SYNO.DSM.Info"];

            Resources[DiskStationApi.Auth] = infoResponeDSAuth.Path;
            Resources[DiskStationApi.DownloadStationInfo] = infoResponeDSInfo.Path;
            Resources[DiskStationApi.DownloadStationTask] = infoResponeDSTask.Path;
            Resources[DiskStationApi.FileStationList]     = infoResponseFSList.Path;
            Resources[DiskStationApi.DSMInfo]             = infoResponseDSMInfo.Path;

            switch (api)
            {
            case DiskStationApi.Auth:
                return(Enumerable.Range(infoResponeDSAuth.MinVersion, infoResponeDSAuth.MaxVersion - infoResponeDSAuth.MinVersion + 1));

            case DiskStationApi.DownloadStationInfo:
                return(Enumerable.Range(infoResponeDSInfo.MinVersion, infoResponeDSInfo.MaxVersion - infoResponeDSInfo.MinVersion + 1));

            case DiskStationApi.DownloadStationTask:
                return(Enumerable.Range(infoResponeDSTask.MinVersion, infoResponeDSTask.MaxVersion - infoResponeDSTask.MinVersion + 1));

            case DiskStationApi.FileStationList:
                return(Enumerable.Range(infoResponseFSList.MinVersion, infoResponseFSList.MaxVersion - infoResponseFSList.MinVersion + 1));

            case DiskStationApi.DSMInfo:
                return(Enumerable.Range(infoResponseDSMInfo.MinVersion, infoResponseDSMInfo.MaxVersion - infoResponseDSMInfo.MinVersion + 1));

            default:
                throw new DownloadClientException("Api not implemented");
            }
        }
コード例 #9
0
        private DiskStationResponse <T> ProcessRequest <T>(HttpRequestBuilder requestBuilder,
                                                           string operation,
                                                           DiskStationApi api,
                                                           DownloadStationSettings settings) where T : new()
        {
            var request  = requestBuilder.Build();
            var response = _httpClient.Execute(request);

            _logger.Debug("Trying to {0}", operation);

            if (response.StatusCode == HttpStatusCode.OK)
            {
                var responseContent = Json.Deserialize <DiskStationResponse <T> >(response.Content);

                if (responseContent.Success)
                {
                    return(responseContent);
                }
                else
                {
                    var msg = $"Failed to {operation}. Reason: {responseContent.Error.GetMessage(api)}";
                    _logger.Error(msg);

                    if (responseContent.Error.SessionError)
                    {
                        _sessionCache.Remove(GenerateSessionCacheKey(settings));

                        if (responseContent.Error.Code == 105)
                        {
                            throw new DownloadClientAuthenticationException(msg);
                        }
                    }

                    throw new DownloadClientException(msg);
                }
            }
            else
            {
                throw new HttpException(request, response);
            }
        }
コード例 #10
0
 private string GenerateInfoCacheKey(DownloadStationSettings settings, DiskStationApi api)
 {
     return($"{settings.Host}:{settings.Port}->{api}");
 }