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); } }
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); }
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)); }
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); } }
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; }
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()); }
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]); }
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"); } }
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); } }
private string GenerateInfoCacheKey(DownloadStationSettings settings, DiskStationApi api) { return($"{settings.Host}:{settings.Port}->{api}"); }