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; } }
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; } }