Add support to range requests in AssetFileSource (#3404)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
This commit is contained in:
tdcosta100
2025-05-13 14:45:04 -03:00
committed by GitHub
parent 9ddd0a3f0e
commit 307470439a
2 changed files with 25 additions and 5 deletions

View File

@@ -26,8 +26,8 @@ public:
resourceOptions(resourceOptions_.clone()),
clientOptions(clientOptions_.clone()) {}
void request(const std::string& url, const ActorRef<FileSourceRequest>& req) {
if (!acceptsURL(url)) {
void request(const Resource& resource, const ActorRef<FileSourceRequest>& req) {
if (!acceptsURL(resource.url)) {
Response response;
response.error = std::make_unique<Response::Error>(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<char>::length(util::ASSET_PROTOCOL)));
requestLocalFile(path, req);
mbgl::util::percentDecode(
resource.url.substr(std::char_traits<char>::length(util::ASSET_PROTOCOL)));
requestLocalFile(path, req, resource.dataRange);
}
void setResourceOptions(ResourceOptions options) {
@@ -80,7 +81,7 @@ AssetFileSource::~AssetFileSource() = default;
std::unique_ptr<AsyncRequest> AssetFileSource::request(const Resource& resource, Callback callback) {
auto req = std::make_unique<FileSourceRequest>(std::move(callback));
impl->actor().invoke(&Impl::request, resource.url, req->actor());
impl->actor().invoke(&Impl::request, resource, req->actor());
return req;
}

View File

@@ -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<uint64_t, uint64_t>(4, 12);
std::unique_ptr<AsyncRequest> 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