From 307470439ab37c1c352fa8b8982a9e0a214dfb83 Mon Sep 17 00:00:00 2001 From: tdcosta100 Date: Tue, 13 May 2025 14:45:04 -0300 Subject: [PATCH] Add support to range requests in AssetFileSource (#3404) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .../src/mbgl/storage/asset_file_source.cpp | 11 ++++++----- test/storage/asset_file_source.test.cpp | 19 +++++++++++++++++++ 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/platform/default/src/mbgl/storage/asset_file_source.cpp b/platform/default/src/mbgl/storage/asset_file_source.cpp index a43c0be96..1451880aa 100644 --- a/platform/default/src/mbgl/storage/asset_file_source.cpp +++ b/platform/default/src/mbgl/storage/asset_file_source.cpp @@ -26,8 +26,8 @@ public: resourceOptions(resourceOptions_.clone()), clientOptions(clientOptions_.clone()) {} - void request(const std::string& url, const ActorRef& req) { - if (!acceptsURL(url)) { + void request(const Resource& resource, const ActorRef& req) { + if (!acceptsURL(resource.url)) { Response response; response.error = std::make_unique(Response::Error::Reason::Other, "Invalid asset URL"); req.invoke(&FileSourceRequest::setResponse, response); @@ -36,8 +36,9 @@ public: // Cut off the protocol and prefix with path. const auto path = root + "/" + - mbgl::util::percentDecode(url.substr(std::char_traits::length(util::ASSET_PROTOCOL))); - requestLocalFile(path, req); + mbgl::util::percentDecode( + resource.url.substr(std::char_traits::length(util::ASSET_PROTOCOL))); + requestLocalFile(path, req, resource.dataRange); } void setResourceOptions(ResourceOptions options) { @@ -80,7 +81,7 @@ AssetFileSource::~AssetFileSource() = default; std::unique_ptr AssetFileSource::request(const Resource& resource, Callback callback) { auto req = std::make_unique(std::move(callback)); - impl->actor().invoke(&Impl::request, resource.url, req->actor()); + impl->actor().invoke(&Impl::request, resource, req->actor()); return req; } diff --git a/test/storage/asset_file_source.test.cpp b/test/storage/asset_file_source.test.cpp index efe9d36fa..a7985e924 100644 --- a/test/storage/asset_file_source.test.cpp +++ b/test/storage/asset_file_source.test.cpp @@ -182,4 +182,23 @@ TEST(AssetFileSource, URLEncoding) { loop.run(); } + +TEST(AssetFileSource, RangeRequest) { + util::RunLoop loop; + + AssetFileSource fs(ResourceOptions::Default().withAssetPath("test/fixtures/storage/assets"), ClientOptions()); + + Resource resource(Resource::Unknown, "asset://nonempty"); + resource.dataRange = std::make_pair(4, 12); + + std::unique_ptr req = fs.request(resource, [&](Response res) { + req.reset(); + EXPECT_EQ(nullptr, res.error); + ASSERT_TRUE(res.data.get()); + EXPECT_EQ("ent is he", *res.data); + loop.stop(); + }); + + loop.run(); +} #endif