From d1920de838b17847b2e8a1520af0d82e670d5558 Mon Sep 17 00:00:00 2001 From: dec05eba Date: Tue, 11 May 2021 16:04:02 +0200 Subject: Parse content disposition better (when it contains encoding) --- src/DownloadUtils.cpp | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) (limited to 'src/DownloadUtils.cpp') diff --git a/src/DownloadUtils.cpp b/src/DownloadUtils.cpp index a054454..5b5246a 100644 --- a/src/DownloadUtils.cpp +++ b/src/DownloadUtils.cpp @@ -73,7 +73,21 @@ namespace QuickMedia { fprintf(stderr, "Download duration for %s: %d ms\n", url.c_str(), timer.getElapsedTime().asMilliseconds()); std::string content_disposition = header_extract_value(header, "content-disposition"); - if(content_disposition.empty()) { + size_t filename_start = content_disposition.find("filename="); + if(filename_start == std::string::npos) { + // TODO: after filename*= the encoding type will follow. We need to support other formats than utf-8 as well + filename_start = content_disposition.find("filename*="); + if(filename_start != std::string::npos) { + filename_start += 10; + filename_start = content_disposition.find("''", filename_start); + if(filename_start != std::string::npos) + filename_start += 2; + } + } else { + filename_start += 9; + } + + if(filename_start == std::string::npos) { size_t filename_start = url.rfind('/'); if(filename_start == std::string::npos) { result = ""; @@ -90,16 +104,9 @@ namespace QuickMedia { } } - result = url.substr(filename_start, filename_end - filename_start); + result = url_param_decode(url.substr(filename_start, filename_end - filename_start)); return DownloadResult::OK; } else { - size_t filename_start = content_disposition.find("filename="); - if(filename_start == std::string::npos) { - result = ""; - return DownloadResult::OK; - } - - filename_start += 9; for(size_t i = filename_start; i < content_disposition.size(); ++i) { char c = content_disposition[i]; if(c != '"' && c != ' ') { @@ -117,7 +124,7 @@ namespace QuickMedia { } } - result = content_disposition.substr(filename_start, filename_end - filename_start); + result = url_param_decode(content_disposition.substr(filename_start, filename_end - filename_start)); return DownloadResult::OK; } } -- cgit v1.2.3