aboutsummaryrefslogtreecommitdiff
path: root/src/DownloadUtils.cpp
diff options
context:
space:
mode:
authordec05eba <dec05eba@protonmail.com>2021-05-11 16:04:02 +0200
committerdec05eba <dec05eba@protonmail.com>2021-05-11 16:04:52 +0200
commitd1920de838b17847b2e8a1520af0d82e670d5558 (patch)
tree520220da38f258f788a42ee0b13fac74d980acbc /src/DownloadUtils.cpp
parent2be5a938f906fa1ec95b424a0efd5fab3a1acdc7 (diff)
Parse content disposition better (when it contains encoding)
Diffstat (limited to 'src/DownloadUtils.cpp')
-rw-r--r--src/DownloadUtils.cpp27
1 files changed, 17 insertions, 10 deletions
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;
}
}