diff --git a/src/Stars.Services/Store/StacStoreService.cs b/src/Stars.Services/Store/StacStoreService.cs index 52ae6e81..c376de0b 100644 --- a/src/Stars.Services/Store/StacStoreService.cs +++ b/src/Stars.Services/Store/StacStoreService.cs @@ -152,7 +152,7 @@ public async Task StoreItemNodeAtDestinationAsync(StacItemNode sta public async Task StoreCollectionNodeAtDestinationAsync(StacCollectionNode stacCollectionNode, IDestination destination, CancellationToken ct) { - PrepareStacCatalogueForDestination(stacCollectionNode, destination); + PrepareStacCollectionForDestination(stacCollectionNode, destination); return await _stacRouter.RouteAsync(await StoreResourceAtDestinationAsync(stacCollectionNode, destination, ct), ct) as StacCollectionNode; } @@ -305,6 +305,16 @@ private void PrepareStacCatalogueForDestination(StacCatalogNode stacCatalogNode, PrepareStacNodeForDestination(stacCatalogNode, destination); } + private void PrepareStacCollectionForDestination(StacCollectionNode stacCollectionNode, IDestination destination) + { + PrepareStacNodeForDestination(stacCollectionNode, destination); + if (storeOptions.AbsoluteAssetsUrl) + MakeAssetUriAbsolute(stacCollectionNode, destination); + else + MakeAssetUriRelative(stacCollectionNode, destination); + } + + public void PrepareStacItemForDestination(StacItemNode stacItemNode, IDestination destination) { PrepareStacNodeForDestination(stacItemNode, destination); @@ -327,6 +337,16 @@ private void MakeAssetUriAbsolute(StacItemNode stacItemNode, IDestination destin } } + private void MakeAssetUriAbsolute(StacCollectionNode stacCollectionNode, IDestination destination) + { + MakeAssetUriRelative(stacCollectionNode, destination); + foreach (var asset in stacCollectionNode.StacCollection.Assets) + { + if (asset.Value.Uri.IsAbsoluteUri) continue; + asset.Value.Uri = new Uri(MapToFrontUri(destination.Uri), asset.Value.Uri); + } + } + private void MakeAssetUriRelative(StacItemNode stacItemNode, IDestination destination) { foreach (var asset in stacItemNode.StacItem.Assets) @@ -356,6 +376,35 @@ private void MakeAssetUriRelative(StacItemNode stacItemNode, IDestination destin } } + private void MakeAssetUriRelative(StacCollectionNode stacCollectionNode, IDestination destination) + { + foreach (var asset in stacCollectionNode.StacCollection.Assets) + { + if (!asset.Value.Uri.IsAbsoluteUri) continue; + // 0. make sure the uri is not outside of the root catalog + var relativeUri = RootCatalogDestination.Uri.MakeRelativeUri(asset.Value.Uri); + if (relativeUri.IsAbsoluteUri || relativeUri.ToString().StartsWith("../")) + continue; + // 1. Check the asset uri can be relative to destination itself + relativeUri = destination.Uri.MakeRelativeUri(asset.Value.Uri); + if (!relativeUri.IsAbsoluteUri) + { + asset.Value.Uri = relativeUri; + continue; + } + // 1. Check the asset uri can be relative to root catalog + relativeUri = RootCatalogDestination.Uri.MakeRelativeUri(asset.Value.Uri); + if (relativeUri.IsAbsoluteUri) continue; + Uri absoluteUri = new Uri(RootCatalogNode.Uri, relativeUri); + relativeUri = stacCollectionNode.Uri.MakeRelativeUri(asset.Value.Uri); + if (!relativeUri.IsAbsoluteUri) + { + asset.Value.Uri = relativeUri; + continue; + } + } + } + public async Task GetAssetsInFolderAsync(string relPath, CancellationToken ct) { return await resourceServiceProvider.GetAssetsInFolderAsync(new GenericResource(new Uri(RootCatalogDestination.Uri, relPath)), ct);