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.
		
		
		
		
		
			
		
			
				
					
					
						
							49 lines
						
					
					
						
							1.4 KiB
						
					
					
				
			
		
		
	
	
							49 lines
						
					
					
						
							1.4 KiB
						
					
					
				| #include "tools/replay/filereader.h"
 | |
| 
 | |
| #include <fstream>
 | |
| 
 | |
| #include "common/util.h"
 | |
| #include "system/hardware/hw.h"
 | |
| #include "tools/replay/util.h"
 | |
| 
 | |
| std::string cacheFilePath(const std::string &url) {
 | |
|   static std::string cache_path = [] {
 | |
|     const std::string comma_cache = Path::download_cache_root();
 | |
|     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, std::ios::binary | std::ios::out);
 | |
|       fs.write(result.data(), result.size());
 | |
|     }
 | |
|   }
 | |
|   return result;
 | |
| }
 | |
| 
 | |
| std::string FileReader::download(const std::string &url, std::atomic<bool> *abort) {
 | |
|   for (int i = 0; i <= max_retries_ && !(abort && *abort); ++i) {
 | |
|     if (i > 0) {
 | |
|       rWarning("download failed, retrying %d", i);
 | |
|       util::sleep_for(3000);
 | |
|     }
 | |
| 
 | |
|     std::string result = httpGet(url, chunk_size_, abort);
 | |
|     if (!result.empty()) {
 | |
|       return result;
 | |
|     }
 | |
|   }
 | |
|   return {};
 | |
| }
 | |
| 
 |