diff --git a/src/lms/ui/admin/ScannerController.cpp b/src/lms/ui/admin/ScannerController.cpp index 71495776..f0a45a5e 100644 --- a/src/lms/ui/admin/ScannerController.cpp +++ b/src/lms/ui/admin/ScannerController.cpp @@ -19,9 +19,8 @@ #include "ScannerController.hpp" -#include - #include +#include #include #include #include @@ -29,6 +28,7 @@ #include #include "core/Service.hpp" +#include "core/String.hpp" #include "database/Session.hpp" #include "database/Track.hpp" #include "services/scanner/IScannerService.hpp" @@ -48,15 +48,13 @@ namespace lms::ui class ReportResource : public Wt::WResource { public: - ReportResource() - { - suggestFileName("report.txt"); - } - - ~ReportResource() + ReportResource() = default; + ~ReportResource() override { beingDeleted(); } + ReportResource(const ReportResource&) = delete; + ReportResource& operator=(const ReportResource&) = delete; void setScanStats(const scanner::ScanStats& stats) { @@ -66,11 +64,19 @@ namespace lms::ui *_stats = stats; } - void handleRequest(const Wt::Http::Request&, Wt::Http::Response& response) + void handleRequest(const Wt::Http::Request&, Wt::Http::Response& response) override { if (!_stats) return; + auto encodeHttpHeaderField = [](const std::string& fieldName, const std::string& fieldValue) { + // This implements RFC 5987 + return fieldName + "*=UTF-8''" + Wt::Utils::urlEncode(fieldValue); + }; + + const std::string cdp{ encodeHttpHeaderField("filename", "LMS_scan_report_" + core::stringUtils::toISO8601String(_stats->startTime) + ".txt") }; + response.addHeader("Content-Disposition", "attachment; " + cdp); + response.out() << Wt::WString::tr("Lms.Admin.ScannerController.errors-header").arg(_stats->errors.size()).toUTF8() << std::endl; for (const auto& error : _stats->errors)