diff options
author | vng <viktor.govako@gmail.com> | 2012-10-27 14:43:47 +0400 |
---|---|---|
committer | Alex Zolotarev <alex@maps.me> | 2015-09-23 01:46:19 +0300 |
commit | 67801f0fb8f25656f0960cefab1ad485a710cbf1 (patch) | |
tree | 01dd44508a1e075262f706ebfa92e3da936686a1 /platform/http_request.cpp | |
parent | 4d2d784943e2bb74735e203d5cc3629f68da9735 (diff) |
Fix exception catching in download resume.
Diffstat (limited to 'platform/http_request.cpp')
-rw-r--r-- | platform/http_request.cpp | 40 |
1 files changed, 38 insertions, 2 deletions
diff --git a/platform/http_request.cpp b/platform/http_request.cpp index 6492cd0280..5cbc6158e7 100644 --- a/platform/http_request.cpp +++ b/platform/http_request.cpp @@ -247,11 +247,13 @@ public: CallbackT const & onFinish, CallbackT const & onProgress, int64_t chunkSize, bool doCleanProgressFiles) : HttpRequest(onFinish, onProgress), m_strategy(urls), m_filePath(filePath), - m_writer(new FileWriter(filePath + DOWNLOADING_FILE_EXTENSION, FileWriter::OP_WRITE_EXISTING)), m_goodChunksCount(0), m_doCleanProgressFiles(doCleanProgressFiles) { ASSERT ( !urls.empty(), () ); + // Open file here. Avoid throwing exceptions from constructor's initialization list. + m_writer.reset(new FileWriter(filePath + DOWNLOADING_FILE_EXTENSION, FileWriter::OP_WRITE_EXISTING)); + m_progress.first = m_strategy.LoadOrInitChunks(m_filePath + RESUME_FILE_EXTENSION, fileSize, chunkSize); m_progress.second = fileSize; @@ -310,11 +312,45 @@ HttpRequest * HttpRequest::PostJson(string const & url, string const & postData, return new MemoryHttpRequest(url, postData, onFinish, onProgress); } +namespace +{ + class ErrorHttpRequest : public HttpRequest + { + string m_filePath; + public: + ErrorHttpRequest(string const & filePath) + : HttpRequest(CallbackT(), CallbackT()), m_filePath(filePath) + { + m_status = EFailed; + } + + virtual string const & Data() const { return m_filePath; } + }; +} + HttpRequest * HttpRequest::GetFile(vector<string> const & urls, string const & filePath, int64_t fileSize, CallbackT const & onFinish, CallbackT const & onProgress, int64_t chunkSize, bool doCleanProgressFiles) { - return new FileHttpRequest(urls, filePath, fileSize, onFinish, onProgress, chunkSize, doCleanProgressFiles); + FileHttpRequest * p = 0; + try + { + p = new FileHttpRequest(urls, filePath, fileSize, onFinish, onProgress, chunkSize, doCleanProgressFiles); + } + catch (FileWriter::Exception const & e) + { + // Can't create file for writing. + LOG(LERROR, ("Can't create FileHttpRequest for", filePath, e.what())); + + delete p; + p = 0; + + // Mark the end of download with error. + ErrorHttpRequest error(filePath); + onFinish(error); + } + + return p; } } // namespace downloader |