Mercurial > hg > orthanc
annotate Core/HttpServer/FilesystemHttpSender.cpp @ 1522:f938f7779bcb
fixes
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Tue, 11 Aug 2015 15:37:42 +0200 |
parents | 8bd0d897763f |
children | c388502a066d |
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 |
65 HttpCompression FilesystemHttpSender::GetHttpCompression(bool gzipAllowed, | |
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 { | |
89 file_.seekg(sizeof(uint64_t), file_.end); | |
90 return HttpCompression_Deflate; | |
91 } | |
92 else | |
93 { | |
94 uncompressed_.reset(new BufferHttpSender); | |
95 | |
96 // TODO Stream-based uncompression | |
97 assert(size_ != 0); | |
98 std::string compressed; | |
99 compressed.resize(size_); | |
100 | |
101 file_.read(&compressed[0], size_); | |
102 if ((file_.flags() & std::istream::failbit) || | |
103 !(file_.flags() & std::istream::eofbit)) | |
104 { | |
105 throw OrthancException(ErrorCode_CorruptedFile); | |
106 } | |
107 | |
108 ZlibCompressor compressor; | |
109 IBufferCompressor::Uncompress(uncompressed_->GetBuffer(), compressor, compressed); | |
110 return HttpCompression_None; | |
111 } | |
112 | |
113 break; | |
114 } | |
115 | |
116 default: | |
117 throw OrthancException(ErrorCode_NotImplemented); | |
118 } | |
1519
8bd0d897763f
refactoring: IHttpStreamAnswer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1288
diff
changeset
|
119 } |
8bd0d897763f
refactoring: IHttpStreamAnswer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1288
diff
changeset
|
120 |
8bd0d897763f
refactoring: IHttpStreamAnswer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1288
diff
changeset
|
121 |
8bd0d897763f
refactoring: IHttpStreamAnswer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1288
diff
changeset
|
122 bool FilesystemHttpSender::ReadNextChunk() |
8bd0d897763f
refactoring: IHttpStreamAnswer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1288
diff
changeset
|
123 { |
1522 | 124 if (uncompressed_.get() != NULL) |
125 { | |
126 return uncompressed_->ReadNextChunk(); | |
127 } | |
128 else | |
129 { | |
130 if (chunk_.size() == 0) | |
131 { | |
132 chunk_.resize(CHUNK_SIZE); | |
133 } | |
134 | |
135 file_.read(&chunk_[0], chunk_.size()); | |
136 | |
137 if (file_.flags() & std::istream::failbit) | |
138 { | |
139 throw OrthancException(ErrorCode_CorruptedFile); | |
140 } | |
141 | |
142 chunkSize_ = file_.gcount(); | |
143 | |
144 return chunkSize_ > 0; | |
145 } | |
146 } | |
1519
8bd0d897763f
refactoring: IHttpStreamAnswer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1288
diff
changeset
|
147 |
8bd0d897763f
refactoring: IHttpStreamAnswer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1288
diff
changeset
|
148 |
1522 | 149 const char* FilesystemHttpSender::GetChunkContent() |
150 { | |
151 if (uncompressed_.get() != NULL) | |
152 { | |
153 return uncompressed_->GetChunkContent(); | |
154 } | |
155 else | |
156 { | |
157 return chunk_.c_str(); | |
158 } | |
159 } | |
160 | |
161 | |
162 size_t FilesystemHttpSender::GetChunkSize() | |
163 { | |
164 if (uncompressed_.get() != NULL) | |
165 { | |
166 return uncompressed_->GetChunkSize(); | |
167 } | |
168 else | |
169 { | |
170 return chunkSize_; | |
171 } | |
208 | 172 } |
173 } |