From 0a26a319b241978ee317bbe768eb61c4eb7a39d9 Mon Sep 17 00:00:00 2001 From: dec05eba Date: Wed, 25 Aug 2021 18:48:34 +0200 Subject: Faster mangakatana search on exact match --- src/DownloadUtils.cpp | 40 ++++++++++++++++++++++++---------------- 1 file changed, 24 insertions(+), 16 deletions(-) (limited to 'src/DownloadUtils.cpp') diff --git a/src/DownloadUtils.cpp b/src/DownloadUtils.cpp index 5f0c547..a56a56e 100644 --- a/src/DownloadUtils.cpp +++ b/src/DownloadUtils.cpp @@ -12,10 +12,10 @@ namespace QuickMedia { struct DownloadUserdata { - std::string *header = nullptr; + std::vector *headers = nullptr; std::string *body = nullptr; int64_t download_limit = 1024 * 1024 * 100; // 100mb - bool header_finished = false; + bool headers_finished = false; int64_t total_downloaded_size = 0; }; @@ -37,19 +37,27 @@ namespace QuickMedia { static int accumulate_string_with_header(char *data, int size, void *userdata) { DownloadUserdata *download_userdata = (DownloadUserdata*)userdata; - if(download_userdata->header_finished) { + if(download_userdata->headers_finished) { download_userdata->body->append(data, size); } else { - download_userdata->header->append(data, size); + if(download_userdata->headers->empty()) + download_userdata->headers->push_back(""); + + std::string *current_header = &download_userdata->headers->back(); + current_header->append(data, size); + bool end_of_header_found = false; - size_t end_of_headers_index = download_userdata->header->find("\r\n\r\n"); + size_t end_of_headers_index = current_header->find("\r\n\r\n"); if(end_of_headers_index != std::string::npos) { while(true) { - const bool is_redirect = http_is_redirect(download_userdata->header->c_str(), end_of_headers_index); + const bool is_redirect = http_is_redirect(current_header->c_str(), end_of_headers_index); end_of_headers_index += 4; - if(is_redirect && download_userdata->header->size() - end_of_headers_index > 0) { - download_userdata->header->erase(download_userdata->header->begin(), download_userdata->header->begin() + end_of_headers_index); - end_of_headers_index = download_userdata->header->find("\r\n\r\n"); + if(is_redirect) { + std::string header_after_this_header = current_header->substr(end_of_headers_index); + current_header->erase(current_header->begin() + end_of_headers_index, current_header->end()); + download_userdata->headers->push_back(std::move(header_after_this_header)); + current_header = &download_userdata->headers->back(); + end_of_headers_index = current_header->find("\r\n\r\n"); if(end_of_headers_index == std::string::npos) break; } else { @@ -60,9 +68,9 @@ namespace QuickMedia { } if(end_of_header_found) { - download_userdata->body->append(download_userdata->header->begin() + end_of_headers_index, download_userdata->header->end()); - download_userdata->header->erase(download_userdata->header->begin() + end_of_headers_index, download_userdata->header->end()); - download_userdata->header_finished = true; + download_userdata->body->append(current_header->begin() + end_of_headers_index, current_header->end()); + current_header->erase(current_header->begin() + end_of_headers_index, current_header->end()); + download_userdata->headers_finished = true; } } @@ -185,7 +193,7 @@ namespace QuickMedia { } // TODO: Add timeout - DownloadResult download_to_string(const std::string &url, std::string &result, const std::vector &additional_args, bool use_browser_useragent, bool fail_on_error, bool cloudflare_bypass, std::string *header, int download_limit) { + DownloadResult download_to_string(const std::string &url, std::string &result, const std::vector &additional_args, bool use_browser_useragent, bool fail_on_error, bool cloudflare_bypass, std::vector *headers, int download_limit) { result.clear(); sf::Clock timer; std::vector args; @@ -203,7 +211,7 @@ namespace QuickMedia { } if(cloudflare_bypass) args.insert(args.end(), { "--tls-max", "1.1", "-A", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; FSL 7.0.6" }); - if(header) + if(headers) args.push_back("-i"); args.push_back("--"); args.push_back(url.c_str()); @@ -218,10 +226,10 @@ namespace QuickMedia { } DownloadUserdata download_userdata; - download_userdata.header = header; + download_userdata.headers = headers; download_userdata.body = &result; download_userdata.download_limit = download_limit; - download_userdata.header_finished = !header; + download_userdata.headers_finished = !headers; if(exec_program(args.data(), accumulate_string_with_header, &download_userdata) != 0) return DownloadResult::NET_ERR; -- cgit v1.2.3