aboutsummaryrefslogtreecommitdiff
path: root/src/DownloadUtils.cpp
diff options
context:
space:
mode:
authordec05eba <dec05eba@protonmail.com>2021-08-25 18:48:34 +0200
committerdec05eba <dec05eba@protonmail.com>2021-08-25 18:48:34 +0200
commit0a26a319b241978ee317bbe768eb61c4eb7a39d9 (patch)
treebfa56141b5140c1f25c81925d5fc616012bd22a3 /src/DownloadUtils.cpp
parent48da6508416dd80c68c9213a242a2542af2574fe (diff)
Faster mangakatana search on exact match
Diffstat (limited to 'src/DownloadUtils.cpp')
-rw-r--r--src/DownloadUtils.cpp40
1 files changed, 24 insertions, 16 deletions
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<std::string> *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<CommandArg> &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<CommandArg> &additional_args, bool use_browser_useragent, bool fail_on_error, bool cloudflare_bypass, std::vector<std::string> *headers, int download_limit) {
result.clear();
sf::Clock timer;
std::vector<const char*> 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;