Mercurial > hg > orthanc
annotate Core/HttpServer/FilesystemHttpSender.cpp @ 1523:c388502a066d
testing FilesystemHttpSender
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Tue, 11 Aug 2015 16:09:00 +0200 |
parents | f938f7779bcb |
children | f9b0169eb6bb |
rev | line source |
---|---|
208 | 1 /** |
2 * Orthanc - A Lightweight, RESTful DICOM Store | |
1288
6e7e5ed91c2d
upgrade to year 2015
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1123
diff
changeset
|
3 * Copyright (C) 2012-2015 Sebastien Jodogne, Medical Physics |
6e7e5ed91c2d
upgrade to year 2015
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1123
diff
changeset
|
4 * Department, University Hospital of Liege, Belgium |
208 | 5 * |
6 * This program is free software: you can redistribute it and/or | |
7 * modify it under the terms of the GNU General Public License as | |
8 * published by the Free Software Foundation, either version 3 of the | |
9 * License, or (at your option) any later version. | |
10 * | |
11 * In addition, as a special exception, the copyright holders of this | |
12 * program give permission to link the code of its release with the | |
13 * OpenSSL project's "OpenSSL" library (or with modified versions of it | |
14 * that use the same license as the "OpenSSL" library), and distribute | |
15 * the linked executables. You must obey the GNU General Public License | |
16 * in all respects for all of the code used other than "OpenSSL". If you | |
17 * modify file(s) with this exception, you may extend this exception to | |
18 * your version of the file(s), but you are not obligated to do so. If | |
19 * you do not wish to do so, delete this exception statement from your | |
20 * version. If you delete this exception statement from all source files | |
21 * in the program, then also delete it here. | |
22 * | |
23 * This program is distributed in the hope that it will be useful, but | |
24 * WITHOUT ANY WARRANTY; without even the implied warranty of | |
25 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
26 * General Public License for more details. | |
27 * | |
28 * You should have received a copy of the GNU General Public License | |
29 * along with this program. If not, see <http://www.gnu.org/licenses/>. | |
30 **/ | |
31 | |
824
a811bdf8b8eb
precompiled headers
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
689
diff
changeset
|
32 #include "../PrecompiledHeaders.h" |
208 | 33 #include "FilesystemHttpSender.h" |
34 | |
35 #include "../Toolbox.h" | |
1522 | 36 #include "../OrthancException.h" |
37 #include "../Compression/ZlibCompressor.h" | |
208 | 38 |
39 #include <stdio.h> | |
40 | |
1519
8bd0d897763f
refactoring: IHttpStreamAnswer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1288
diff
changeset
|
41 |
8bd0d897763f
refactoring: IHttpStreamAnswer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1288
diff
changeset
|
42 static const size_t CHUNK_SIZE = 64 * 1024; // Use 64KB chunks |
8bd0d897763f
refactoring: IHttpStreamAnswer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1288
diff
changeset
|
43 |
208 | 44 namespace Orthanc |
45 { | |
1522 | 46 void FilesystemHttpSender::Initialize(const boost::filesystem::path& path) |
208 | 47 { |
1522 | 48 sourceCompression_ = CompressionType_None; |
49 targetCompression_ = HttpCompression_None; | |
50 | |
51 SetContentFilename(path.filename().string()); | |
52 file_.open(path.string().c_str(), std::ifstream::binary); | |
53 | |
54 if (!file_.is_open()) | |
55 { | |
56 throw OrthancException(ErrorCode_InexistentFile); | |
57 } | |
208 | 58 |
1519
8bd0d897763f
refactoring: IHttpStreamAnswer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1288
diff
changeset
|
59 file_.seekg(0, file_.end); |
8bd0d897763f
refactoring: IHttpStreamAnswer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1288
diff
changeset
|
60 size_ = file_.tellg(); |
8bd0d897763f
refactoring: IHttpStreamAnswer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1288
diff
changeset
|
61 file_.seekg(0, file_.beg); |
217 | 62 } |
63 | |
1522 | 64 |
1523
c388502a066d
testing FilesystemHttpSender
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1522
diff
changeset
|
65 HttpCompression FilesystemHttpSender::SetupHttpCompression(bool gzipAllowed, |
c388502a066d
testing FilesystemHttpSender
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1522
diff
changeset
|
66 bool deflateAllowed) |
217 | 67 { |
1522 | 68 switch (sourceCompression_) |
69 { | |
70 case CompressionType_None: | |
71 { | |
72 return HttpCompression_None; | |
73 } | |
74 | |
75 case CompressionType_ZlibWithSize: | |
76 { | |
77 if (size_ == 0) | |
78 { | |
79 return HttpCompression_None; | |
80 } | |
81 | |
82 if (size_ < sizeof(uint64_t)) | |
83 { | |
84 throw OrthancException(ErrorCode_CorruptedFile); | |
85 } | |
208 | 86 |
1522 | 87 if (deflateAllowed) |
88 { | |
1523
c388502a066d
testing FilesystemHttpSender
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1522
diff
changeset
|
89 file_.seekg(sizeof(uint64_t), file_.beg); |
c388502a066d
testing FilesystemHttpSender
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1522
diff
changeset
|
90 size_ -= sizeof(uint64_t); |
1522 | 91 return HttpCompression_Deflate; |
92 } | |
93 else | |
94 { | |
95 uncompressed_.reset(new BufferHttpSender); | |
96 | |
97 // TODO Stream-based uncompression | |
98 assert(size_ != 0); | |
99 std::string compressed; | |
100 compressed.resize(size_); | |
101 | |
102 file_.read(&compressed[0], size_); | |
103 if ((file_.flags() & std::istream::failbit) || | |
1523
c388502a066d
testing FilesystemHttpSender
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1522
diff
changeset
|
104 !(file_.flags() & std::istream::eofbit) || |
c388502a066d
testing FilesystemHttpSender
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1522
diff
changeset
|
105 file_.gcount() < 0 || |
c388502a066d
testing FilesystemHttpSender
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1522
diff
changeset
|
106 static_cast<uint64_t>(file_.gcount()) != size_) |
1522 | 107 { |
108 throw OrthancException(ErrorCode_CorruptedFile); | |
109 } | |
110 | |
111 ZlibCompressor compressor; | |
112 IBufferCompressor::Uncompress(uncompressed_->GetBuffer(), compressor, compressed); | |
1523
c388502a066d
testing FilesystemHttpSender
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1522
diff
changeset
|
113 |
1522 | 114 return HttpCompression_None; |
115 } | |
116 | |
117 break; | |
118 } | |
119 | |
120 default: | |
121 throw OrthancException(ErrorCode_NotImplemented); | |
122 } | |
1519
8bd0d897763f
refactoring: IHttpStreamAnswer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1288
diff
changeset
|
123 } |
8bd0d897763f
refactoring: IHttpStreamAnswer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1288
diff
changeset
|
124 |
8bd0d897763f
refactoring: IHttpStreamAnswer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1288
diff
changeset
|
125 |
1523
c388502a066d
testing FilesystemHttpSender
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1522
diff
changeset
|
126 uint64_t FilesystemHttpSender::GetContentLength() |
c388502a066d
testing FilesystemHttpSender
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1522
diff
changeset
|
127 { |
c388502a066d
testing FilesystemHttpSender
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1522
diff
changeset
|
128 if (uncompressed_.get() != NULL) |
c388502a066d
testing FilesystemHttpSender
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1522
diff
changeset
|
129 { |
c388502a066d
testing FilesystemHttpSender
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1522
diff
changeset
|
130 return uncompressed_->GetContentLength(); |
c388502a066d
testing FilesystemHttpSender
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1522
diff
changeset
|
131 } |
c388502a066d
testing FilesystemHttpSender
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1522
diff
changeset
|
132 else |
c388502a066d
testing FilesystemHttpSender
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1522
diff
changeset
|
133 { |
c388502a066d
testing FilesystemHttpSender
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1522
diff
changeset
|
134 return size_; |
c388502a066d
testing FilesystemHttpSender
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1522
diff
changeset
|
135 } |
c388502a066d
testing FilesystemHttpSender
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1522
diff
changeset
|
136 } |
c388502a066d
testing FilesystemHttpSender
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1522
diff
changeset
|
137 |
c388502a066d
testing FilesystemHttpSender
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1522
diff
changeset
|
138 |
1519
8bd0d897763f
refactoring: IHttpStreamAnswer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1288
diff
changeset
|
139 bool FilesystemHttpSender::ReadNextChunk() |
8bd0d897763f
refactoring: IHttpStreamAnswer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1288
diff
changeset
|
140 { |
1522 | 141 if (uncompressed_.get() != NULL) |
142 { | |
143 return uncompressed_->ReadNextChunk(); | |
144 } | |
145 else | |
146 { | |
147 if (chunk_.size() == 0) | |
148 { | |
149 chunk_.resize(CHUNK_SIZE); | |
150 } | |
151 | |
152 file_.read(&chunk_[0], chunk_.size()); | |
153 | |
154 if (file_.flags() & std::istream::failbit) | |
155 { | |
156 throw OrthancException(ErrorCode_CorruptedFile); | |
157 } | |
158 | |
159 chunkSize_ = file_.gcount(); | |
160 | |
161 return chunkSize_ > 0; | |
162 } | |
163 } | |
1519
8bd0d897763f
refactoring: IHttpStreamAnswer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1288
diff
changeset
|
164 |
8bd0d897763f
refactoring: IHttpStreamAnswer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1288
diff
changeset
|
165 |
1522 | 166 const char* FilesystemHttpSender::GetChunkContent() |
167 { | |
168 if (uncompressed_.get() != NULL) | |
169 { | |
170 return uncompressed_->GetChunkContent(); | |
171 } | |
172 else | |
173 { | |
174 return chunk_.c_str(); | |
175 } | |
176 } | |
177 | |
178 | |
179 size_t FilesystemHttpSender::GetChunkSize() | |
180 { | |
181 if (uncompressed_.get() != NULL) | |
182 { | |
183 return uncompressed_->GetChunkSize(); | |
184 } | |
185 else | |
186 { | |
187 return chunkSize_; | |
188 } | |
208 | 189 } |
190 } |