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:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user