public async Task <WebFetchResponse> FetchAsync(string url, WebFetchOptions options = null)
        {
            try
            {
                var response = new WebFetchResponse();
                var(serviceMd, parsedPath) = await WebFetchHelper(url);

                var path = CreateFinalPath(parsedPath);
                var file = await TryDifferentPaths(serviceMd, path);

                var fileData = await ReadContentFromFile(serviceMd, file, options);

                response.Data     = fileData.Item1.ToArray();
                response.MimeType = file.MimeType;
                response.Headers.Add("Content-Type", file.MimeType);
                if (options == null)
                {
                    return(response);
                }

                response.Headers.Add("Content-Range", $"bytes {fileData.Item2}-{fileData.Item3}/{fileData.Item4}");
                response.Headers.Add("Content-Length", $"{fileData.Item4}");
                return(response);
            }
            catch (WebFetchException ex)
            {
                Logger.Error(ex);
                throw;
            }
            catch (Exception ex)
            {
                Logger.Error(ex);
                throw;
            }
        }
        public async Task <WebFetchResponse> FetchAsync(string url, WebFetchOptions options = null)
        {
            try
            {
                var response = new WebFetchResponse();
                var fetchUrl = url.Replace("https://", "safe://");
                var data     = await _session.Fetch.FetchAsync(fetchUrl);

                if (data is FilesContainer filesContainer)
                {
                    ulong nrsContainerVersion = filesContainer.ResolvedFrom.Version;
                    if (filesContainer.FilesMap.Files != null && filesContainer.FilesMap.Files.Count > 0)
                    {
                        var indexFileInfo = filesContainer
                                            .FilesMap
                                            .Files
                                            .FirstOrDefault(
                            file => file.FileName == $"/{_default_page}" ||
                            file.FileName == $"{_default_page}");

                        if (!indexFileInfo.Equals(default(FileInfo)))
                        {
                            var indexFileLink = indexFileInfo
                                                .FileMetaData
                                                .FirstOrDefault(meta => meta.MetaDataKey == "link").MetaDataValue;

                            if (!string.IsNullOrEmpty(indexFileLink))
                            {
                                var fetchResponse = await FetchAsync(indexFileLink);

                                fetchResponse.CurrentNrsVersion = nrsContainerVersion;
                                fetchResponse.LatestNrsVersion  = await GetLatestVersionAsync(fetchUrl);

                                return(fetchResponse);
                            }
                        }
                    }
                }
                else if (data is PublishedImmutableData fetchedData)
                {
                    response.LatestNrsVersion = await GetLatestVersionAsync(fetchUrl);

                    response.CurrentNrsVersion = fetchedData.ResolvedFrom.Version;
                    response.Data     = fetchedData.Data;
                    response.MimeType = fetchedData.MediaType;
                    response.Headers.Add("Content-Type", fetchedData.MediaType);
                    return(response);
                }

                throw new WebFetchException(
                          WebFetchConstants.NoSuchPublicName,
                          WebFetchConstants.NoSuchPublicNameMessage);
            }
            catch (WebFetchException ex)
            {
                Logger.Error(ex);
                throw;
            }
            catch (Exception ex)
            {
                Logger.Error(ex);
                throw;
            }
        }
示例#3
0
        public async Task <WebFetchResponse> FetchAsync(string url, WebFetchOptions options = null)
        {
            try
            {
                var response = new WebFetchResponse();
                var fetchUrl = url.Replace("https://", "safe://");
                var data     = await App
                               .AppSession
                               .Fetch
                               .FetchAsync(fetchUrl);

                if (data is FilesContainer filesContainer)
                {
                    if (filesContainer.FilesMap.Files != null && filesContainer.FilesMap.Files.Count > 0)
                    {
                        var indexFileInfo = filesContainer
                                            .FilesMap
                                            .Files
                                            .FirstOrDefault(
                            file => file.FileName == $"/{_defaultPage}" ||
                            file.FileName == $"{_defaultPage}");

                        if (!indexFileInfo.Equals(default(FileInfo)))
                        {
                            var indexFileLink = indexFileInfo
                                                .FileMetaData
                                                .FirstOrDefault(meta => meta.MetaDataKey == "link")
                                                .MetaDataValue;

                            if (!string.IsNullOrEmpty(indexFileLink))
                            {
                                var fetchResponse = await FetchAsync(indexFileLink);

                                fetchResponse.CurrentNrsVersion = await GetVersion(fetchUrl);

                                fetchResponse.LatestNrsVersion = await GetVersion(fetchUrl, true);

                                fetchResponse.FetchDataType = typeof(FilesContainer);
                                return(fetchResponse);
                            }
                        }
                        else
                        {
                            var content = await CreateFilesContainerPageAsync(filesContainer.FilesMap.Files);

                            response.CurrentNrsVersion = await GetVersion(fetchUrl);

                            response.LatestNrsVersion = await GetVersion(fetchUrl, true);

                            response.FetchDataType = typeof(FilesContainer);
                            response.Data          = content.ToUtfBytes();
                            response.MimeType      = "text/html";
                            response.Headers.Add("Content-Type", "text/html");
                            return(response);
                        }
                    }
                }
                else if (data is PublicImmutableData fetchedData)
                {
                    response.Data          = fetchedData.Data;
                    response.MimeType      = fetchedData.MediaType;
                    response.FetchDataType = typeof(PublicImmutableData);
                    response.Headers.Add("Content-Type", fetchedData.MediaType);

                    if (options != null)
                    {
                        response.Headers.Add("Content-Range", $"bytes 0-{response.Data.Length - 1}/{response.Data.Length}");
                        response.Headers.Add("Content-Length", $"{response.Data.Length}");
                    }

                    return(response);
                }
                else if (data is SafeDataFetchFailed fetchFailed)
                {
                    throw new WebFetchException(
                              WebFetchConstants.NoSuchData,
                              WebFetchConstants.NoSuchDataMessage);
                }

                throw new WebFetchException(
                          WebFetchConstants.NoSuchPublicName,
                          WebFetchConstants.NoSuchPublicNameMessage);
            }
            catch (WebFetchException ex)
            {
                Logger.Error(ex);
                throw;
            }
            catch (Exception ex)
            {
                Logger.Error(ex);
                throw;
            }
        }