You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
62 lines
2.0 KiB
62 lines
2.0 KiB
#include "selfdrive/ui/replay/filereader.h"
|
|
|
|
#include <sys/stat.h>
|
|
|
|
#include <cassert>
|
|
#include <cmath>
|
|
#include <fstream>
|
|
#include <iostream>
|
|
#include <sstream>
|
|
|
|
#include "selfdrive/common/util.h"
|
|
#include "selfdrive/ui/replay/util.h"
|
|
|
|
std::string cacheFilePath(const std::string &url) {
|
|
static std::string cache_path = [] {
|
|
const std::string comma_cache = util::getenv("COMMA_CACHE", "/tmp/comma_download_cache/");
|
|
util::create_directories(comma_cache, 0755);
|
|
return comma_cache.back() == '/' ? comma_cache : comma_cache + "/";
|
|
}();
|
|
|
|
return cache_path + sha256(getUrlWithoutQuery(url));
|
|
}
|
|
|
|
std::string FileReader::read(const std::string &file, std::atomic<bool> *abort) {
|
|
const bool is_remote = file.find("https://") == 0;
|
|
const std::string local_file = is_remote ? cacheFilePath(file) : file;
|
|
std::string result;
|
|
|
|
if ((!is_remote || cache_to_local_) && util::file_exists(local_file)) {
|
|
result = util::read_file(local_file);
|
|
} else if (is_remote) {
|
|
result = download(file, abort);
|
|
if (cache_to_local_ && !result.empty()) {
|
|
std::ofstream fs(local_file, fs.binary | fs.out);
|
|
fs.write(result.data(), result.size());
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
|
|
std::string FileReader::download(const std::string &url, std::atomic<bool> *abort) {
|
|
std::string result;
|
|
size_t remote_file_size = 0;
|
|
for (int i = 0; i <= max_retries_ && !(abort && *abort); ++i) {
|
|
if (i > 0) {
|
|
std::cout << "download failed, retrying" << i << std::endl;
|
|
}
|
|
if (remote_file_size <= 0) {
|
|
remote_file_size = getRemoteFileSize(url);
|
|
}
|
|
if (remote_file_size > 0 && !(abort && *abort)) {
|
|
std::ostringstream oss;
|
|
result.resize(remote_file_size);
|
|
oss.rdbuf()->pubsetbuf(result.data(), result.size());
|
|
int chunks = chunk_size_ > 0 ? std::max(1, (int)std::nearbyint(remote_file_size / (float)chunk_size_)) : 1;
|
|
if (httpMultiPartDownload(url, oss, chunks, remote_file_size, abort)) {
|
|
return result;
|
|
}
|
|
}
|
|
}
|
|
return {};
|
|
}
|
|
|