annotate OrthancFramework/Sources/HttpServer/FilesystemHttpSender.cpp @ 5049:8c9a1cce076e

CPP Wrapper: new helpers
author Alain Mazy <am@osimis.io>
date Wed, 29 Jun 2022 15:32:44 +0200
parents 43e613a7756b
children 0ea402b4d901
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
208
de640de989b8 HttpFileSender
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1 /**
de640de989b8 HttpFileSender
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2 * Orthanc - A Lightweight, RESTful DICOM Store
1900
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1525
diff changeset
3 * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics
1288
6e7e5ed91c2d upgrade to year 2015
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1123
diff changeset
4 * Department, University Hospital of Liege, Belgium
4870
43e613a7756b upgrade to year 2022
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
5 * Copyright (C) 2017-2022 Osimis S.A., Belgium
43e613a7756b upgrade to year 2022
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4831
diff changeset
6 * Copyright (C) 2021-2022 Sebastien Jodogne, ICTEAM UCLouvain, Belgium
208
de640de989b8 HttpFileSender
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
7 *
de640de989b8 HttpFileSender
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
8 * This program is free software: you can redistribute it and/or
4119
bf7b9edf6b81 re-licensing the OrthancFramework to LGPL, in order to license Stone of Orthanc under LGPL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4044
diff changeset
9 * modify it under the terms of the GNU Lesser General Public License
bf7b9edf6b81 re-licensing the OrthancFramework to LGPL, in order to license Stone of Orthanc under LGPL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4044
diff changeset
10 * as published by the Free Software Foundation, either version 3 of
bf7b9edf6b81 re-licensing the OrthancFramework to LGPL, in order to license Stone of Orthanc under LGPL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4044
diff changeset
11 * the License, or (at your option) any later version.
208
de640de989b8 HttpFileSender
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
12 *
de640de989b8 HttpFileSender
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
13 * This program is distributed in the hope that it will be useful, but
de640de989b8 HttpFileSender
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
14 * WITHOUT ANY WARRANTY; without even the implied warranty of
de640de989b8 HttpFileSender
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
4119
bf7b9edf6b81 re-licensing the OrthancFramework to LGPL, in order to license Stone of Orthanc under LGPL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4044
diff changeset
16 * Lesser General Public License for more details.
208
de640de989b8 HttpFileSender
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
17 *
4119
bf7b9edf6b81 re-licensing the OrthancFramework to LGPL, in order to license Stone of Orthanc under LGPL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4044
diff changeset
18 * You should have received a copy of the GNU Lesser General Public
bf7b9edf6b81 re-licensing the OrthancFramework to LGPL, in order to license Stone of Orthanc under LGPL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4044
diff changeset
19 * License along with this program. If not, see
bf7b9edf6b81 re-licensing the OrthancFramework to LGPL, in order to license Stone of Orthanc under LGPL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4044
diff changeset
20 * <http://www.gnu.org/licenses/>.
208
de640de989b8 HttpFileSender
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
21 **/
de640de989b8 HttpFileSender
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
22
824
a811bdf8b8eb precompiled headers
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 689
diff changeset
23 #include "../PrecompiledHeaders.h"
208
de640de989b8 HttpFileSender
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
24 #include "FilesystemHttpSender.h"
de640de989b8 HttpFileSender
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
25
1522
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1519
diff changeset
26 #include "../OrthancException.h"
1519
8bd0d897763f refactoring: IHttpStreamAnswer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1288
diff changeset
27
8bd0d897763f refactoring: IHttpStreamAnswer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1288
diff changeset
28 static const size_t CHUNK_SIZE = 64 * 1024; // Use 64KB chunks
8bd0d897763f refactoring: IHttpStreamAnswer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1288
diff changeset
29
208
de640de989b8 HttpFileSender
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
30 namespace Orthanc
de640de989b8 HttpFileSender
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
31 {
1522
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1519
diff changeset
32 void FilesystemHttpSender::Initialize(const boost::filesystem::path& path)
208
de640de989b8 HttpFileSender
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
33 {
1522
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1519
diff changeset
34 SetContentFilename(path.filename().string());
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1519
diff changeset
35 file_.open(path.string().c_str(), std::ifstream::binary);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1519
diff changeset
36
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1519
diff changeset
37 if (!file_.is_open())
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1519
diff changeset
38 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1519
diff changeset
39 throw OrthancException(ErrorCode_InexistentFile);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1519
diff changeset
40 }
208
de640de989b8 HttpFileSender
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
41
1519
8bd0d897763f refactoring: IHttpStreamAnswer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1288
diff changeset
42 file_.seekg(0, file_.end);
8bd0d897763f refactoring: IHttpStreamAnswer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1288
diff changeset
43 size_ = file_.tellg();
8bd0d897763f refactoring: IHttpStreamAnswer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1288
diff changeset
44 file_.seekg(0, file_.beg);
217
1ac3aacd10a5 simplifications
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 208
diff changeset
45 }
1ac3aacd10a5 simplifications
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 208
diff changeset
46
4298
db3932f9660d abi continued
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4119
diff changeset
47 FilesystemHttpSender::FilesystemHttpSender(const std::string& path)
db3932f9660d abi continued
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4119
diff changeset
48 {
db3932f9660d abi continued
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4119
diff changeset
49 Initialize(path);
db3932f9660d abi continued
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4119
diff changeset
50 }
db3932f9660d abi continued
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4119
diff changeset
51
db3932f9660d abi continued
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4119
diff changeset
52 FilesystemHttpSender::FilesystemHttpSender(const boost::filesystem::path& path)
db3932f9660d abi continued
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4119
diff changeset
53 {
db3932f9660d abi continued
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4119
diff changeset
54 Initialize(path);
db3932f9660d abi continued
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4119
diff changeset
55 }
db3932f9660d abi continued
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4119
diff changeset
56
db3932f9660d abi continued
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4119
diff changeset
57 FilesystemHttpSender::FilesystemHttpSender(const std::string& path,
db3932f9660d abi continued
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4119
diff changeset
58 MimeType contentType)
db3932f9660d abi continued
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4119
diff changeset
59 {
db3932f9660d abi continued
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4119
diff changeset
60 SetContentType(contentType);
db3932f9660d abi continued
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4119
diff changeset
61 Initialize(path);
db3932f9660d abi continued
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4119
diff changeset
62 }
db3932f9660d abi continued
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4119
diff changeset
63
db3932f9660d abi continued
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4119
diff changeset
64 FilesystemHttpSender::FilesystemHttpSender(const FilesystemStorage& storage,
db3932f9660d abi continued
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4119
diff changeset
65 const std::string& uuid)
db3932f9660d abi continued
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4119
diff changeset
66 {
db3932f9660d abi continued
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4119
diff changeset
67 Initialize(storage.GetPath(uuid));
db3932f9660d abi continued
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4119
diff changeset
68 }
db3932f9660d abi continued
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4119
diff changeset
69
db3932f9660d abi continued
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4119
diff changeset
70 uint64_t FilesystemHttpSender::GetContentLength()
db3932f9660d abi continued
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4119
diff changeset
71 {
db3932f9660d abi continued
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4119
diff changeset
72 return size_;
db3932f9660d abi continued
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4119
diff changeset
73 }
db3932f9660d abi continued
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4119
diff changeset
74
1522
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1519
diff changeset
75
1519
8bd0d897763f refactoring: IHttpStreamAnswer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1288
diff changeset
76 bool FilesystemHttpSender::ReadNextChunk()
8bd0d897763f refactoring: IHttpStreamAnswer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1288
diff changeset
77 {
1525
f9b0169eb6bb testing
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1523
diff changeset
78 if (chunk_.size() == 0)
1522
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1519
diff changeset
79 {
1525
f9b0169eb6bb testing
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1523
diff changeset
80 chunk_.resize(CHUNK_SIZE);
1522
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1519
diff changeset
81 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1519
diff changeset
82
1525
f9b0169eb6bb testing
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1523
diff changeset
83 file_.read(&chunk_[0], chunk_.size());
1519
8bd0d897763f refactoring: IHttpStreamAnswer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1288
diff changeset
84
1525
f9b0169eb6bb testing
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1523
diff changeset
85 if ((file_.flags() & std::istream::failbit) ||
f9b0169eb6bb testing
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1523
diff changeset
86 file_.gcount() < 0)
1522
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1519
diff changeset
87 {
1525
f9b0169eb6bb testing
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1523
diff changeset
88 throw OrthancException(ErrorCode_CorruptedFile);
1522
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1519
diff changeset
89 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1519
diff changeset
90
2332
9ccd7f926c5b fix warnings in visual studio
jodogne
parents: 2244
diff changeset
91 chunkSize_ = static_cast<size_t>(file_.gcount());
1525
f9b0169eb6bb testing
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1523
diff changeset
92
f9b0169eb6bb testing
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 1523
diff changeset
93 return chunkSize_ > 0;
208
de640de989b8 HttpFileSender
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
94 }
4298
db3932f9660d abi continued
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4119
diff changeset
95
db3932f9660d abi continued
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4119
diff changeset
96 const char *FilesystemHttpSender::GetChunkContent()
db3932f9660d abi continued
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4119
diff changeset
97 {
db3932f9660d abi continued
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4119
diff changeset
98 return chunk_.c_str();
db3932f9660d abi continued
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4119
diff changeset
99 }
db3932f9660d abi continued
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4119
diff changeset
100
db3932f9660d abi continued
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4119
diff changeset
101 size_t FilesystemHttpSender::GetChunkSize()
db3932f9660d abi continued
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4119
diff changeset
102 {
db3932f9660d abi continued
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4119
diff changeset
103 return chunkSize_;
db3932f9660d abi continued
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4119
diff changeset
104 }
208
de640de989b8 HttpFileSender
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
105 }