Mercurial > hg > orthanc
annotate OrthancFramework/Sources/HttpServer/HttpServer.cpp @ 4226:7bd5eab3ba25
prototyping IWebDavBucket
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Sun, 04 Oct 2020 13:23:53 +0200 |
parents | 2d5209153b32 |
children | 7fff7e683d65 |
rev | line source |
---|---|
0 | 1 /** |
59 | 2 * Orthanc - A Lightweight, RESTful DICOM Store |
1900 | 3 * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics |
1288
6e7e5ed91c2d
upgrade to year 2015
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1213
diff
changeset
|
4 * Department, University Hospital of Liege, Belgium |
3640
94f4a18a79cc
upgrade to year 2020
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3537
diff
changeset
|
5 * Copyright (C) 2017-2020 Osimis S.A., Belgium |
0 | 6 * |
7 * 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
|
8 * 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
|
9 * 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
|
10 * the License, or (at your option) any later version. |
136 | 11 * |
0 | 12 * This program is distributed in the hope that it will be useful, but |
13 * WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 * 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
|
15 * Lesser General Public License for more details. |
0 | 16 * |
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
|
17 * 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
|
18 * 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
|
19 * <http://www.gnu.org/licenses/>. |
0 | 20 **/ |
21 | |
22 | |
23 // http://en.highscore.de/cpp/boost/stringhandling.html | |
24 | |
824
a811bdf8b8eb
precompiled headers
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
809
diff
changeset
|
25 #include "../PrecompiledHeaders.h" |
3138
ab46e537f92e
renamed class MongooseServer as HttpServer, CivetWeb made default HTTP server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3137
diff
changeset
|
26 #include "HttpServer.h" |
0 | 27 |
3357
c0aa5f1cf2f5
new class: FileBuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3356
diff
changeset
|
28 #include "../ChunkedBuffer.h" |
c0aa5f1cf2f5
new class: FileBuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3356
diff
changeset
|
29 #include "../FileBuffer.h" |
1486
f967bdf8534e
refactoring to Logging.h
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1446
diff
changeset
|
30 #include "../Logging.h" |
2895 | 31 #include "../OrthancException.h" |
3357
c0aa5f1cf2f5
new class: FileBuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3356
diff
changeset
|
32 #include "../TemporaryFile.h" |
1486
f967bdf8534e
refactoring to Logging.h
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1446
diff
changeset
|
33 #include "HttpToolbox.h" |
2377
32bea64e070b
Experimental support of actively maintained Civetweb to replace Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2268
diff
changeset
|
34 |
4226
7bd5eab3ba25
prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4201
diff
changeset
|
35 #if ORTHANC_ENABLE_PUGIXML == 1 |
7bd5eab3ba25
prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4201
diff
changeset
|
36 # include "IWebDavBucket.h" |
7bd5eab3ba25
prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4201
diff
changeset
|
37 #endif |
7bd5eab3ba25
prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4201
diff
changeset
|
38 |
2377
32bea64e070b
Experimental support of actively maintained Civetweb to replace Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2268
diff
changeset
|
39 #if ORTHANC_ENABLE_MONGOOSE == 1 |
3069 | 40 # include <mongoose.h> |
2377
32bea64e070b
Experimental support of actively maintained Civetweb to replace Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2268
diff
changeset
|
41 |
32bea64e070b
Experimental support of actively maintained Civetweb to replace Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2268
diff
changeset
|
42 #elif ORTHANC_ENABLE_CIVETWEB == 1 |
3069 | 43 # include <civetweb.h> |
2377
32bea64e070b
Experimental support of actively maintained Civetweb to replace Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2268
diff
changeset
|
44 # define MONGOOSE_USE_CALLBACKS 1 |
3178
6d558598d713
Fix build with unpatched versions of Civetweb (missing "mg_disable_keep_alive()")
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3154
diff
changeset
|
45 # if !defined(CIVETWEB_HAS_DISABLE_KEEP_ALIVE) |
6d558598d713
Fix build with unpatched versions of Civetweb (missing "mg_disable_keep_alive()")
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3154
diff
changeset
|
46 # error Macro CIVETWEB_HAS_DISABLE_KEEP_ALIVE must be defined |
6d558598d713
Fix build with unpatched versions of Civetweb (missing "mg_disable_keep_alive()")
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3154
diff
changeset
|
47 # endif |
2377
32bea64e070b
Experimental support of actively maintained Civetweb to replace Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2268
diff
changeset
|
48 |
32bea64e070b
Experimental support of actively maintained Civetweb to replace Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2268
diff
changeset
|
49 #else |
32bea64e070b
Experimental support of actively maintained Civetweb to replace Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2268
diff
changeset
|
50 # error "Either Mongoose or Civetweb must be enabled to compile this file" |
32bea64e070b
Experimental support of actively maintained Civetweb to replace Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2268
diff
changeset
|
51 #endif |
1486
f967bdf8534e
refactoring to Logging.h
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1446
diff
changeset
|
52 |
0 | 53 #include <algorithm> |
54 #include <string.h> | |
55 #include <boost/lexical_cast.hpp> | |
56 #include <boost/algorithm/string.hpp> | |
3672
ea8c1c0e81eb
Fix issue #65 (Logging improvements)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3640
diff
changeset
|
57 #include <boost/filesystem.hpp> |
0 | 58 #include <iostream> |
59 #include <string.h> | |
60 #include <stdio.h> | |
61 #include <boost/thread.hpp> | |
62 | |
2137
595cf22b3e7e
safety checks of macros
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2136
diff
changeset
|
63 #if !defined(ORTHANC_ENABLE_SSL) |
595cf22b3e7e
safety checks of macros
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2136
diff
changeset
|
64 # error The macro ORTHANC_ENABLE_SSL must be defined |
595cf22b3e7e
safety checks of macros
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2136
diff
changeset
|
65 #endif |
595cf22b3e7e
safety checks of macros
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2136
diff
changeset
|
66 |
2136
dd609a99d39a
uniformization of the macro naming
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2134
diff
changeset
|
67 #if ORTHANC_ENABLE_SSL == 1 |
3801
9fe1d64a748c
upgrade to civetweb 1.12, error reporting if OpenSSL failure
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3712
diff
changeset
|
68 # include <openssl/opensslv.h> |
9fe1d64a748c
upgrade to civetweb 1.12, error reporting if OpenSSL failure
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3712
diff
changeset
|
69 # include <openssl/err.h> |
748
de9763f63510
upgrade to openssl-1.0.1g because of heartbeat exploit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
689
diff
changeset
|
70 #endif |
0 | 71 |
59 | 72 #define ORTHANC_REALM "Orthanc Secure Area" |
25
dd1489098265
basic http authentication
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
24
diff
changeset
|
73 |
dd1489098265
basic http authentication
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
24
diff
changeset
|
74 |
59 | 75 namespace Orthanc |
0 | 76 { |
3395
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
77 static const char MULTIPART_FORM[] = "multipart/form-data; boundary="; |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
78 static unsigned int MULTIPART_FORM_LENGTH = sizeof(MULTIPART_FORM) / sizeof(char) - 1; |
0 | 79 |
80 | |
81 namespace | |
82 { | |
83 // Anonymous namespace to avoid clashes between compilation modules | |
911 | 84 class MongooseOutputStream : public IHttpOutputStream |
0 | 85 { |
86 private: | |
87 struct mg_connection* connection_; | |
88 | |
911 | 89 public: |
4201 | 90 explicit MongooseOutputStream(struct mg_connection* connection) : |
91 connection_(connection) | |
911 | 92 { |
93 } | |
94 | |
909 | 95 virtual void Send(bool isHeader, const void* buffer, size_t length) |
0 | 96 { |
217 | 97 if (length > 0) |
98 { | |
1430
ad94a3583b07
Plugins can send answers as multipart messages
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1363
diff
changeset
|
99 int status = mg_write(connection_, buffer, length); |
ad94a3583b07
Plugins can send answers as multipart messages
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1363
diff
changeset
|
100 if (status != static_cast<int>(length)) |
ad94a3583b07
Plugins can send answers as multipart messages
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1363
diff
changeset
|
101 { |
ad94a3583b07
Plugins can send answers as multipart messages
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1363
diff
changeset
|
102 // status == 0 when the connection has been closed, -1 on error |
ad94a3583b07
Plugins can send answers as multipart messages
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1363
diff
changeset
|
103 throw OrthancException(ErrorCode_NetworkProtocol); |
ad94a3583b07
Plugins can send answers as multipart messages
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1363
diff
changeset
|
104 } |
217 | 105 } |
0 | 106 } |
908
e078ea944089
refactoring HttpOutput
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
901
diff
changeset
|
107 |
911 | 108 virtual void OnHttpStatusReceived(HttpStatus status) |
908
e078ea944089
refactoring HttpOutput
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
901
diff
changeset
|
109 { |
911 | 110 // Ignore this |
908
e078ea944089
refactoring HttpOutput
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
901
diff
changeset
|
111 } |
3154
6e8822be2f08
Fix compatibility with DICOMweb plugin (allow multipart answers over HTTP Keep-Alive)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3145
diff
changeset
|
112 |
6e8822be2f08
Fix compatibility with DICOMweb plugin (allow multipart answers over HTTP Keep-Alive)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3145
diff
changeset
|
113 virtual void DisableKeepAlive() |
6e8822be2f08
Fix compatibility with DICOMweb plugin (allow multipart answers over HTTP Keep-Alive)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3145
diff
changeset
|
114 { |
6e8822be2f08
Fix compatibility with DICOMweb plugin (allow multipart answers over HTTP Keep-Alive)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3145
diff
changeset
|
115 #if ORTHANC_ENABLE_MONGOOSE == 1 |
6e8822be2f08
Fix compatibility with DICOMweb plugin (allow multipart answers over HTTP Keep-Alive)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3145
diff
changeset
|
116 throw OrthancException(ErrorCode_NotImplemented, |
6e8822be2f08
Fix compatibility with DICOMweb plugin (allow multipart answers over HTTP Keep-Alive)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3145
diff
changeset
|
117 "Only available if using CivetWeb"); |
3178
6d558598d713
Fix build with unpatched versions of Civetweb (missing "mg_disable_keep_alive()")
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3154
diff
changeset
|
118 |
3154
6e8822be2f08
Fix compatibility with DICOMweb plugin (allow multipart answers over HTTP Keep-Alive)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3145
diff
changeset
|
119 #elif ORTHANC_ENABLE_CIVETWEB == 1 |
3178
6d558598d713
Fix build with unpatched versions of Civetweb (missing "mg_disable_keep_alive()")
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3154
diff
changeset
|
120 # if CIVETWEB_HAS_DISABLE_KEEP_ALIVE == 1 |
3154
6e8822be2f08
Fix compatibility with DICOMweb plugin (allow multipart answers over HTTP Keep-Alive)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3145
diff
changeset
|
121 mg_disable_keep_alive(connection_); |
3178
6d558598d713
Fix build with unpatched versions of Civetweb (missing "mg_disable_keep_alive()")
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3154
diff
changeset
|
122 # else |
6d558598d713
Fix build with unpatched versions of Civetweb (missing "mg_disable_keep_alive()")
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3154
diff
changeset
|
123 # warning The function "mg_disable_keep_alive()" is not available, DICOMweb might run slowly |
6d558598d713
Fix build with unpatched versions of Civetweb (missing "mg_disable_keep_alive()")
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3154
diff
changeset
|
124 throw OrthancException(ErrorCode_NotImplemented, |
6d558598d713
Fix build with unpatched versions of Civetweb (missing "mg_disable_keep_alive()")
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3154
diff
changeset
|
125 "Only available if using a patched version of CivetWeb"); |
6d558598d713
Fix build with unpatched versions of Civetweb (missing "mg_disable_keep_alive()")
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3154
diff
changeset
|
126 # endif |
6d558598d713
Fix build with unpatched versions of Civetweb (missing "mg_disable_keep_alive()")
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3154
diff
changeset
|
127 |
6d558598d713
Fix build with unpatched versions of Civetweb (missing "mg_disable_keep_alive()")
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3154
diff
changeset
|
128 #else |
6d558598d713
Fix build with unpatched versions of Civetweb (missing "mg_disable_keep_alive()")
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3154
diff
changeset
|
129 # error Please support your embedded Web server here |
3154
6e8822be2f08
Fix compatibility with DICOMweb plugin (allow multipart answers over HTTP Keep-Alive)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3145
diff
changeset
|
130 #endif |
6e8822be2f08
Fix compatibility with DICOMweb plugin (allow multipart answers over HTTP Keep-Alive)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3145
diff
changeset
|
131 } |
0 | 132 }; |
133 | |
134 | |
135 enum PostDataStatus | |
136 { | |
137 PostDataStatus_Success, | |
138 PostDataStatus_NoLength, | |
139 PostDataStatus_Pending, | |
140 PostDataStatus_Failure | |
141 }; | |
142 } | |
143 | |
144 | |
145 // TODO Move this to external file | |
146 | |
147 | |
148 class ChunkedFile : public ChunkedBuffer | |
149 { | |
150 private: | |
151 std::string filename_; | |
152 | |
153 public: | |
4201 | 154 explicit ChunkedFile(const std::string& filename) : |
0 | 155 filename_(filename) |
156 { | |
157 } | |
158 | |
159 const std::string& GetFilename() const | |
160 { | |
161 return filename_; | |
162 } | |
163 }; | |
164 | |
165 | |
166 | |
3836 | 167 class ChunkStore : public boost::noncopyable |
0 | 168 { |
169 private: | |
170 typedef std::list<ChunkedFile*> Content; | |
171 Content content_; | |
172 unsigned int numPlaces_; | |
173 | |
174 boost::mutex mutex_; | |
175 std::set<std::string> discardedFiles_; | |
176 | |
177 void Clear() | |
178 { | |
179 for (Content::iterator it = content_.begin(); | |
656 | 180 it != content_.end(); ++it) |
0 | 181 { |
182 delete *it; | |
183 } | |
184 } | |
185 | |
186 Content::iterator Find(const std::string& filename) | |
187 { | |
188 for (Content::iterator it = content_.begin(); | |
656 | 189 it != content_.end(); ++it) |
0 | 190 { |
191 if ((*it)->GetFilename() == filename) | |
192 { | |
193 return it; | |
194 } | |
195 } | |
196 | |
197 return content_.end(); | |
198 } | |
199 | |
200 void Remove(const std::string& filename) | |
201 { | |
202 Content::iterator it = Find(filename); | |
203 if (it != content_.end()) | |
204 { | |
205 delete *it; | |
206 content_.erase(it); | |
207 } | |
208 } | |
209 | |
210 public: | |
211 ChunkStore() | |
212 { | |
213 numPlaces_ = 10; | |
214 } | |
215 | |
216 ~ChunkStore() | |
217 { | |
218 Clear(); | |
219 } | |
220 | |
221 PostDataStatus Store(std::string& completed, | |
222 const char* chunkData, | |
223 size_t chunkSize, | |
224 const std::string& filename, | |
225 size_t filesize) | |
226 { | |
227 boost::mutex::scoped_lock lock(mutex_); | |
228 | |
229 std::set<std::string>::iterator wasDiscarded = discardedFiles_.find(filename); | |
230 if (wasDiscarded != discardedFiles_.end()) | |
231 { | |
232 discardedFiles_.erase(wasDiscarded); | |
233 return PostDataStatus_Failure; | |
234 } | |
235 | |
236 ChunkedFile* f; | |
237 Content::iterator it = Find(filename); | |
238 if (it == content_.end()) | |
239 { | |
240 f = new ChunkedFile(filename); | |
241 | |
242 // Make some room | |
243 if (content_.size() >= numPlaces_) | |
244 { | |
245 discardedFiles_.insert(content_.front()->GetFilename()); | |
246 delete content_.front(); | |
247 content_.pop_front(); | |
248 } | |
249 | |
250 content_.push_back(f); | |
251 } | |
252 else | |
253 { | |
254 f = *it; | |
255 } | |
256 | |
257 f->AddChunk(chunkData, chunkSize); | |
258 | |
259 if (f->GetNumBytes() > filesize) | |
260 { | |
261 Remove(filename); | |
262 } | |
263 else if (f->GetNumBytes() == filesize) | |
264 { | |
265 f->Flatten(completed); | |
266 Remove(filename); | |
267 return PostDataStatus_Success; | |
268 } | |
269 | |
270 return PostDataStatus_Pending; | |
271 } | |
272 | |
273 /*void Print() | |
274 { | |
275 boost::mutex::scoped_lock lock(mutex_); | |
276 | |
277 printf("ChunkStore status:\n"); | |
278 for (Content::const_iterator i = content_.begin(); | |
279 i != content_.end(); i++) | |
280 { | |
281 printf(" [%s]: %d\n", (*i)->GetFilename().c_str(), (*i)->GetNumBytes()); | |
282 } | |
283 printf("-----\n"); | |
284 }*/ | |
285 }; | |
286 | |
287 | |
3138
ab46e537f92e
renamed class MongooseServer as HttpServer, CivetWeb made default HTTP server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3137
diff
changeset
|
288 struct HttpServer::PImpl |
0 | 289 { |
290 struct mg_context *context_; | |
291 ChunkStore chunkStore_; | |
4201 | 292 |
293 PImpl() : | |
294 context_(NULL) | |
295 { | |
296 } | |
0 | 297 }; |
298 | |
299 | |
3138
ab46e537f92e
renamed class MongooseServer as HttpServer, CivetWeb made default HTTP server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3137
diff
changeset
|
300 ChunkStore& HttpServer::GetChunkStore() |
0 | 301 { |
302 return pimpl_->chunkStore_; | |
303 } | |
304 | |
305 | |
3395
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
306 static PostDataStatus ReadBodyWithContentLength(std::string& body, |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
307 struct mg_connection *connection, |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
308 const std::string& contentLength) |
0 | 309 { |
4152
36257d6f348f
Support of multipart messages larger than 2GB in the embedded HTTP server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4119
diff
changeset
|
310 size_t length; |
3395
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
311 try |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
312 { |
4201 | 313 int64_t tmp = boost::lexical_cast<int64_t>(contentLength); |
314 if (tmp < 0) | |
315 { | |
316 return PostDataStatus_NoLength; | |
317 } | |
318 | |
319 length = static_cast<size_t>(tmp); | |
3395
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
320 } |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
321 catch (boost::bad_lexical_cast&) |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
322 { |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
323 return PostDataStatus_NoLength; |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
324 } |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
325 |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
326 body.resize(length); |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
327 |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
328 size_t pos = 0; |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
329 while (length > 0) |
0 | 330 { |
3395
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
331 int r = mg_read(connection, &body[pos], length); |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
332 if (r <= 0) |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
333 { |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
334 return PostDataStatus_Failure; |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
335 } |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
336 |
4152
36257d6f348f
Support of multipart messages larger than 2GB in the embedded HTTP server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4119
diff
changeset
|
337 assert(static_cast<size_t>(r) <= length); |
3395
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
338 length -= r; |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
339 pos += r; |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
340 } |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
341 |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
342 return PostDataStatus_Success; |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
343 } |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
344 |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
345 |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
346 static PostDataStatus ReadBodyToString(std::string& body, |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
347 struct mg_connection *connection, |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
348 const IHttpHandler::Arguments& headers) |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
349 { |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
350 IHttpHandler::Arguments::const_iterator contentLength = headers.find("content-length"); |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
351 |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
352 if (contentLength != headers.end()) |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
353 { |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
354 // "Content-Length" is available |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
355 return ReadBodyWithContentLength(body, connection, contentLength->second); |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
356 } |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
357 else |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
358 { |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
359 // No Content-Length. Store the individual chunks in a temporary |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
360 // file, then read it back into the memory buffer "body" |
3357
c0aa5f1cf2f5
new class: FileBuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3356
diff
changeset
|
361 FileBuffer buffer; |
c0aa5f1cf2f5
new class: FileBuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3356
diff
changeset
|
362 |
3356
f744730c294b
Orthanc now accepts chunked transfer encoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3330
diff
changeset
|
363 std::string tmp(1024 * 1024, 0); |
f744730c294b
Orthanc now accepts chunked transfer encoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3330
diff
changeset
|
364 |
f744730c294b
Orthanc now accepts chunked transfer encoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3330
diff
changeset
|
365 for (;;) |
0 | 366 { |
3356
f744730c294b
Orthanc now accepts chunked transfer encoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3330
diff
changeset
|
367 int r = mg_read(connection, &tmp[0], tmp.size()); |
f744730c294b
Orthanc now accepts chunked transfer encoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3330
diff
changeset
|
368 if (r < 0) |
f744730c294b
Orthanc now accepts chunked transfer encoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3330
diff
changeset
|
369 { |
f744730c294b
Orthanc now accepts chunked transfer encoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3330
diff
changeset
|
370 return PostDataStatus_Failure; |
f744730c294b
Orthanc now accepts chunked transfer encoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3330
diff
changeset
|
371 } |
f744730c294b
Orthanc now accepts chunked transfer encoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3330
diff
changeset
|
372 else if (r == 0) |
f744730c294b
Orthanc now accepts chunked transfer encoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3330
diff
changeset
|
373 { |
f744730c294b
Orthanc now accepts chunked transfer encoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3330
diff
changeset
|
374 break; |
f744730c294b
Orthanc now accepts chunked transfer encoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3330
diff
changeset
|
375 } |
f744730c294b
Orthanc now accepts chunked transfer encoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3330
diff
changeset
|
376 else |
f744730c294b
Orthanc now accepts chunked transfer encoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3330
diff
changeset
|
377 { |
3357
c0aa5f1cf2f5
new class: FileBuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3356
diff
changeset
|
378 buffer.Append(tmp.c_str(), r); |
3356
f744730c294b
Orthanc now accepts chunked transfer encoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3330
diff
changeset
|
379 } |
0 | 380 } |
418
b79bf2f4ab2e
execution of lua through REST
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
417
diff
changeset
|
381 |
3395
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
382 buffer.Read(body); |
3356
f744730c294b
Orthanc now accepts chunked transfer encoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3330
diff
changeset
|
383 |
f744730c294b
Orthanc now accepts chunked transfer encoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3330
diff
changeset
|
384 return PostDataStatus_Success; |
0 | 385 } |
3395
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
386 } |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
387 |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
388 |
3414 | 389 static PostDataStatus ReadBodyToStream(IHttpHandler::IChunkedRequestReader& stream, |
3395
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
390 struct mg_connection *connection, |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
391 const IHttpHandler::Arguments& headers) |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
392 { |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
393 IHttpHandler::Arguments::const_iterator contentLength = headers.find("content-length"); |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
394 |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
395 if (contentLength != headers.end()) |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
396 { |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
397 // "Content-Length" is available |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
398 std::string body; |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
399 PostDataStatus status = ReadBodyWithContentLength(body, connection, contentLength->second); |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
400 |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
401 if (status == PostDataStatus_Success && |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
402 !body.empty()) |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
403 { |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
404 stream.AddBodyChunk(body.c_str(), body.size()); |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
405 } |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
406 |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
407 return status; |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
408 } |
3356
f744730c294b
Orthanc now accepts chunked transfer encoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3330
diff
changeset
|
409 else |
f744730c294b
Orthanc now accepts chunked transfer encoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3330
diff
changeset
|
410 { |
3404
e280ced38a4c
ErrorCode_UnsupportedMediaType
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3395
diff
changeset
|
411 // No Content-Length: This is a chunked transfer. Stream the HTTP connection. |
3395
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
412 std::string tmp(1024 * 1024, 0); |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
413 |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
414 for (;;) |
3356
f744730c294b
Orthanc now accepts chunked transfer encoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3330
diff
changeset
|
415 { |
3395
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
416 int r = mg_read(connection, &tmp[0], tmp.size()); |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
417 if (r < 0) |
3356
f744730c294b
Orthanc now accepts chunked transfer encoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3330
diff
changeset
|
418 { |
f744730c294b
Orthanc now accepts chunked transfer encoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3330
diff
changeset
|
419 return PostDataStatus_Failure; |
f744730c294b
Orthanc now accepts chunked transfer encoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3330
diff
changeset
|
420 } |
3395
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
421 else if (r == 0) |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
422 { |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
423 break; |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
424 } |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
425 else |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
426 { |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
427 stream.AddBodyChunk(tmp.c_str(), r); |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
428 } |
3356
f744730c294b
Orthanc now accepts chunked transfer encoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3330
diff
changeset
|
429 } |
f744730c294b
Orthanc now accepts chunked transfer encoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3330
diff
changeset
|
430 |
f744730c294b
Orthanc now accepts chunked transfer encoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3330
diff
changeset
|
431 return PostDataStatus_Success; |
f744730c294b
Orthanc now accepts chunked transfer encoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3330
diff
changeset
|
432 } |
0 | 433 } |
434 | |
435 | |
3395
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
436 static PostDataStatus ParseMultipartForm(std::string &completedFile, |
0 | 437 struct mg_connection *connection, |
1441
f3672356c121
refactoring: IHttpHandler and HttpToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1438
diff
changeset
|
438 const IHttpHandler::Arguments& headers, |
0 | 439 const std::string& contentType, |
440 ChunkStore& chunkStore) | |
441 { | |
3395
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
442 std::string boundary = "--" + contentType.substr(MULTIPART_FORM_LENGTH); |
0 | 443 |
3395
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
444 std::string body; |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
445 PostDataStatus status = ReadBodyToString(body, connection, headers); |
0 | 446 |
447 if (status != PostDataStatus_Success) | |
448 { | |
449 return status; | |
450 } | |
451 | |
1441
f3672356c121
refactoring: IHttpHandler and HttpToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1438
diff
changeset
|
452 /*for (IHttpHandler::Arguments::const_iterator i = headers.begin(); i != headers.end(); i++) |
0 | 453 { |
454 std::cout << "Header [" << i->first << "] = " << i->second << "\n"; | |
455 } | |
456 printf("CHUNK\n");*/ | |
457 | |
1441
f3672356c121
refactoring: IHttpHandler and HttpToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1438
diff
changeset
|
458 typedef IHttpHandler::Arguments::const_iterator ArgumentIterator; |
0 | 459 |
460 ArgumentIterator requestedWith = headers.find("x-requested-with"); | |
461 ArgumentIterator fileName = headers.find("x-file-name"); | |
462 ArgumentIterator fileSizeStr = headers.find("x-file-size"); | |
463 | |
338
3a3b3ba8c1e0
fix for uploads through internet explorer 7
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
333
diff
changeset
|
464 if (requestedWith != headers.end() && |
0 | 465 requestedWith->second != "XMLHttpRequest") |
466 { | |
467 return PostDataStatus_Failure; | |
468 } | |
469 | |
470 size_t fileSize = 0; | |
471 if (fileSizeStr != headers.end()) | |
472 { | |
473 try | |
474 { | |
475 fileSize = boost::lexical_cast<size_t>(fileSizeStr->second); | |
476 } | |
2836
7133ad478eea
fix Debian warnings
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2790
diff
changeset
|
477 catch (boost::bad_lexical_cast&) |
0 | 478 { |
479 return PostDataStatus_Failure; | |
480 } | |
481 } | |
482 | |
483 typedef boost::find_iterator<std::string::iterator> FindIterator; | |
10 | 484 typedef boost::iterator_range<char*> Range; |
0 | 485 |
486 //chunkStore.Print(); | |
487 | |
3445 | 488 // TODO - Refactor using class "MultipartStreamReader" |
0 | 489 try |
490 { | |
491 FindIterator last; | |
492 for (FindIterator it = | |
3395
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
493 make_find_iterator(body, boost::first_finder(boundary)); |
0 | 494 it!=FindIterator(); |
495 ++it) | |
496 { | |
497 if (last != FindIterator()) | |
498 { | |
10 | 499 Range part(&last->back(), &it->front()); |
0 | 500 Range content = boost::find_first(part, "\r\n\r\n"); |
345 | 501 if (/*content != Range()*/!content.empty()) |
0 | 502 { |
503 Range c(&content.back() + 1, &it->front() - 2); | |
504 size_t chunkSize = c.size(); | |
505 | |
506 if (chunkSize > 0) | |
507 { | |
508 const char* chunkData = &c.front(); | |
509 | |
510 if (fileName == headers.end()) | |
511 { | |
512 // This file is stored in a single chunk | |
513 completedFile.resize(chunkSize); | |
4201 | 514 memcpy(&completedFile[0], chunkData, chunkSize); |
0 | 515 return PostDataStatus_Success; |
516 } | |
517 else | |
518 { | |
519 return chunkStore.Store(completedFile, chunkData, chunkSize, fileName->second, fileSize); | |
520 } | |
521 } | |
10 | 522 } |
0 | 523 } |
524 | |
525 last = it; | |
526 } | |
527 } | |
2836
7133ad478eea
fix Debian warnings
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2790
diff
changeset
|
528 catch (std::length_error&) |
0 | 529 { |
530 return PostDataStatus_Failure; | |
531 } | |
532 | |
533 return PostDataStatus_Pending; | |
534 } | |
535 | |
536 | |
3138
ab46e537f92e
renamed class MongooseServer as HttpServer, CivetWeb made default HTTP server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3137
diff
changeset
|
537 static bool IsAccessGranted(const HttpServer& that, |
1441
f3672356c121
refactoring: IHttpHandler and HttpToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1438
diff
changeset
|
538 const IHttpHandler::Arguments& headers) |
23 | 539 { |
25
dd1489098265
basic http authentication
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
24
diff
changeset
|
540 bool granted = false; |
dd1489098265
basic http authentication
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
24
diff
changeset
|
541 |
1441
f3672356c121
refactoring: IHttpHandler and HttpToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1438
diff
changeset
|
542 IHttpHandler::Arguments::const_iterator auth = headers.find("authorization"); |
25
dd1489098265
basic http authentication
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
24
diff
changeset
|
543 if (auth != headers.end()) |
dd1489098265
basic http authentication
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
24
diff
changeset
|
544 { |
dd1489098265
basic http authentication
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
24
diff
changeset
|
545 std::string s = auth->second; |
1213 | 546 if (s.size() > 6 && |
547 s.substr(0, 6) == "Basic ") | |
25
dd1489098265
basic http authentication
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
24
diff
changeset
|
548 { |
dd1489098265
basic http authentication
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
24
diff
changeset
|
549 std::string b64 = s.substr(6); |
dd1489098265
basic http authentication
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
24
diff
changeset
|
550 granted = that.IsValidBasicHttpAuthentication(b64); |
dd1489098265
basic http authentication
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
24
diff
changeset
|
551 } |
dd1489098265
basic http authentication
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
24
diff
changeset
|
552 } |
23 | 553 |
1202
476a17cfdf42
Fix crash when bad HTTP credentials are provided
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1122
diff
changeset
|
554 return granted; |
23 | 555 } |
556 | |
557 | |
1441
f3672356c121
refactoring: IHttpHandler and HttpToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1438
diff
changeset
|
558 static std::string GetAuthenticatedUsername(const IHttpHandler::Arguments& headers) |
409
63f707278fc8
lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
398
diff
changeset
|
559 { |
1441
f3672356c121
refactoring: IHttpHandler and HttpToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1438
diff
changeset
|
560 IHttpHandler::Arguments::const_iterator auth = headers.find("authorization"); |
409
63f707278fc8
lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
398
diff
changeset
|
561 |
63f707278fc8
lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
398
diff
changeset
|
562 if (auth == headers.end()) |
63f707278fc8
lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
398
diff
changeset
|
563 { |
63f707278fc8
lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
398
diff
changeset
|
564 return ""; |
63f707278fc8
lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
398
diff
changeset
|
565 } |
63f707278fc8
lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
398
diff
changeset
|
566 |
63f707278fc8
lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
398
diff
changeset
|
567 std::string s = auth->second; |
1213 | 568 if (s.size() <= 6 || |
569 s.substr(0, 6) != "Basic ") | |
409
63f707278fc8
lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
398
diff
changeset
|
570 { |
63f707278fc8
lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
398
diff
changeset
|
571 return ""; |
63f707278fc8
lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
398
diff
changeset
|
572 } |
63f707278fc8
lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
398
diff
changeset
|
573 |
63f707278fc8
lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
398
diff
changeset
|
574 std::string b64 = s.substr(6); |
809
8ce2f69436ca
do not return strings with base64
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
749
diff
changeset
|
575 std::string decoded; |
8ce2f69436ca
do not return strings with base64
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
749
diff
changeset
|
576 Toolbox::DecodeBase64(decoded, b64); |
409
63f707278fc8
lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
398
diff
changeset
|
577 size_t semicolons = decoded.find(':'); |
63f707278fc8
lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
398
diff
changeset
|
578 |
63f707278fc8
lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
398
diff
changeset
|
579 if (semicolons == std::string::npos) |
63f707278fc8
lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
398
diff
changeset
|
580 { |
63f707278fc8
lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
398
diff
changeset
|
581 // Bad-formatted request |
63f707278fc8
lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
398
diff
changeset
|
582 return ""; |
63f707278fc8
lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
398
diff
changeset
|
583 } |
63f707278fc8
lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
398
diff
changeset
|
584 else |
63f707278fc8
lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
398
diff
changeset
|
585 { |
63f707278fc8
lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
398
diff
changeset
|
586 return decoded.substr(0, semicolons); |
63f707278fc8
lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
398
diff
changeset
|
587 } |
63f707278fc8
lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
398
diff
changeset
|
588 } |
63f707278fc8
lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
398
diff
changeset
|
589 |
63f707278fc8
lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
398
diff
changeset
|
590 |
473
c9a5d72f8481
changing the namespace of HTTP enumerations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
418
diff
changeset
|
591 static bool ExtractMethod(HttpMethod& method, |
414 | 592 const struct mg_request_info *request, |
1441
f3672356c121
refactoring: IHttpHandler and HttpToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1438
diff
changeset
|
593 const IHttpHandler::Arguments& headers, |
f3672356c121
refactoring: IHttpHandler and HttpToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1438
diff
changeset
|
594 const IHttpHandler::GetArguments& argumentsGET) |
414 | 595 { |
596 std::string overriden; | |
597 | |
598 // Check whether some PUT/DELETE faking is done | |
599 | |
600 // 1. Faking with Google's approach | |
1441
f3672356c121
refactoring: IHttpHandler and HttpToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1438
diff
changeset
|
601 IHttpHandler::Arguments::const_iterator methodOverride = |
414 | 602 headers.find("x-http-method-override"); |
603 | |
604 if (methodOverride != headers.end()) | |
605 { | |
606 overriden = methodOverride->second; | |
607 } | |
608 else if (!strcmp(request->request_method, "GET")) | |
609 { | |
610 // 2. Faking with Ruby on Rail's approach | |
611 // GET /my/resource?_method=delete <=> DELETE /my/resource | |
1363
feaf2840917c
Plugins now receive duplicated GET arguments in their REST callbacks
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1288
diff
changeset
|
612 for (size_t i = 0; i < argumentsGET.size(); i++) |
414 | 613 { |
1363
feaf2840917c
Plugins now receive duplicated GET arguments in their REST callbacks
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1288
diff
changeset
|
614 if (argumentsGET[i].first == "_method") |
feaf2840917c
Plugins now receive duplicated GET arguments in their REST callbacks
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1288
diff
changeset
|
615 { |
feaf2840917c
Plugins now receive duplicated GET arguments in their REST callbacks
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1288
diff
changeset
|
616 overriden = argumentsGET[i].second; |
feaf2840917c
Plugins now receive duplicated GET arguments in their REST callbacks
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1288
diff
changeset
|
617 break; |
feaf2840917c
Plugins now receive duplicated GET arguments in their REST callbacks
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1288
diff
changeset
|
618 } |
414 | 619 } |
620 } | |
621 | |
622 if (overriden.size() > 0) | |
623 { | |
624 // A faking has been done within this request | |
625 Toolbox::ToUpperCase(overriden); | |
626 | |
416 | 627 LOG(INFO) << "HTTP method faking has been detected for " << overriden; |
628 | |
414 | 629 if (overriden == "PUT") |
630 { | |
473
c9a5d72f8481
changing the namespace of HTTP enumerations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
418
diff
changeset
|
631 method = HttpMethod_Put; |
416 | 632 return true; |
414 | 633 } |
634 else if (overriden == "DELETE") | |
635 { | |
473
c9a5d72f8481
changing the namespace of HTTP enumerations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
418
diff
changeset
|
636 method = HttpMethod_Delete; |
416 | 637 return true; |
414 | 638 } |
639 else | |
640 { | |
641 return false; | |
642 } | |
643 } | |
644 | |
645 // No PUT/DELETE faking was present | |
646 if (!strcmp(request->request_method, "GET")) | |
647 { | |
473
c9a5d72f8481
changing the namespace of HTTP enumerations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
418
diff
changeset
|
648 method = HttpMethod_Get; |
414 | 649 } |
650 else if (!strcmp(request->request_method, "POST")) | |
651 { | |
473
c9a5d72f8481
changing the namespace of HTTP enumerations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
418
diff
changeset
|
652 method = HttpMethod_Post; |
414 | 653 } |
654 else if (!strcmp(request->request_method, "DELETE")) | |
655 { | |
473
c9a5d72f8481
changing the namespace of HTTP enumerations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
418
diff
changeset
|
656 method = HttpMethod_Delete; |
414 | 657 } |
658 else if (!strcmp(request->request_method, "PUT")) | |
659 { | |
473
c9a5d72f8481
changing the namespace of HTTP enumerations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
418
diff
changeset
|
660 method = HttpMethod_Put; |
414 | 661 } |
662 else | |
663 { | |
664 return false; | |
665 } | |
666 | |
667 return true; | |
668 } | |
669 | |
670 | |
1517 | 671 static void ConfigureHttpCompression(HttpOutput& output, |
672 const IHttpHandler::Arguments& headers) | |
673 { | |
674 // Look if the client wishes HTTP compression | |
675 // https://en.wikipedia.org/wiki/HTTP_compression | |
676 IHttpHandler::Arguments::const_iterator it = headers.find("accept-encoding"); | |
677 if (it != headers.end()) | |
678 { | |
679 std::vector<std::string> encodings; | |
680 Toolbox::TokenizeString(encodings, it->second, ','); | |
681 | |
682 for (size_t i = 0; i < encodings.size(); i++) | |
683 { | |
684 std::string s = Toolbox::StripSpaces(encodings[i]); | |
685 | |
686 if (s == "deflate") | |
687 { | |
688 output.SetDeflateAllowed(true); | |
689 } | |
690 else if (s == "gzip") | |
691 { | |
692 output.SetGzipAllowed(true); | |
693 } | |
694 } | |
695 } | |
696 } | |
697 | |
698 | |
2134
ddc75c6c712d
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2133
diff
changeset
|
699 static void InternalCallback(HttpOutput& output /* out */, |
ddc75c6c712d
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2133
diff
changeset
|
700 HttpMethod& method /* out */, |
3138
ab46e537f92e
renamed class MongooseServer as HttpServer, CivetWeb made default HTTP server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3137
diff
changeset
|
701 HttpServer& server, |
2134
ddc75c6c712d
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2133
diff
changeset
|
702 struct mg_connection *connection, |
1112
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
703 const struct mg_request_info *request) |
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
704 { |
2377
32bea64e070b
Experimental support of actively maintained Civetweb to replace Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2268
diff
changeset
|
705 bool localhost; |
32bea64e070b
Experimental support of actively maintained Civetweb to replace Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2268
diff
changeset
|
706 |
32bea64e070b
Experimental support of actively maintained Civetweb to replace Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2268
diff
changeset
|
707 #if ORTHANC_ENABLE_MONGOOSE == 1 |
32bea64e070b
Experimental support of actively maintained Civetweb to replace Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2268
diff
changeset
|
708 static const long LOCALHOST = (127ll << 24) + 1ll; |
32bea64e070b
Experimental support of actively maintained Civetweb to replace Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2268
diff
changeset
|
709 localhost = (request->remote_ip == LOCALHOST); |
32bea64e070b
Experimental support of actively maintained Civetweb to replace Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2268
diff
changeset
|
710 #elif ORTHANC_ENABLE_CIVETWEB == 1 |
32bea64e070b
Experimental support of actively maintained Civetweb to replace Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2268
diff
changeset
|
711 // The "remote_ip" field of "struct mg_request_info" is tagged as |
32bea64e070b
Experimental support of actively maintained Civetweb to replace Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2268
diff
changeset
|
712 // deprecated in Civetweb, using "remote_addr" instead. |
32bea64e070b
Experimental support of actively maintained Civetweb to replace Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2268
diff
changeset
|
713 localhost = (std::string(request->remote_addr) == "127.0.0.1"); |
32bea64e070b
Experimental support of actively maintained Civetweb to replace Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2268
diff
changeset
|
714 #else |
3069 | 715 # error |
2377
32bea64e070b
Experimental support of actively maintained Civetweb to replace Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2268
diff
changeset
|
716 #endif |
32bea64e070b
Experimental support of actively maintained Civetweb to replace Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2268
diff
changeset
|
717 |
1112
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
718 // Check remote calls |
2134
ddc75c6c712d
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2133
diff
changeset
|
719 if (!server.IsRemoteAccessAllowed() && |
2377
32bea64e070b
Experimental support of actively maintained Civetweb to replace Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2268
diff
changeset
|
720 !localhost) |
1112
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
721 { |
2790
c7313e1f7644
MongooseServer::SetRealm()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2635
diff
changeset
|
722 output.SendUnauthorized(server.GetRealm()); |
1112
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
723 return; |
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
724 } |
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
725 |
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
726 |
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
727 // Extract the HTTP headers |
1441
f3672356c121
refactoring: IHttpHandler and HttpToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1438
diff
changeset
|
728 IHttpHandler::Arguments headers; |
1112
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
729 for (int i = 0; i < request->num_headers; i++) |
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
730 { |
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
731 std::string name = request->http_headers[i].name; |
1977
ad95331c526a
trace log of http headers
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1963
diff
changeset
|
732 std::string value = request->http_headers[i].value; |
ad95331c526a
trace log of http headers
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1963
diff
changeset
|
733 |
1112
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
734 std::transform(name.begin(), name.end(), name.begin(), ::tolower); |
1977
ad95331c526a
trace log of http headers
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1963
diff
changeset
|
735 headers.insert(std::make_pair(name, value)); |
ad95331c526a
trace log of http headers
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1963
diff
changeset
|
736 VLOG(1) << "HTTP header: [" << name << "]: [" << value << "]"; |
1112
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
737 } |
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
738 |
2134
ddc75c6c712d
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2133
diff
changeset
|
739 if (server.IsHttpCompressionEnabled()) |
1517 | 740 { |
741 ConfigureHttpCompression(output, headers); | |
742 } | |
743 | |
1112
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
744 |
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
745 // Extract the GET arguments |
1441
f3672356c121
refactoring: IHttpHandler and HttpToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1438
diff
changeset
|
746 IHttpHandler::GetArguments argumentsGET; |
1112
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
747 if (!strcmp(request->request_method, "GET")) |
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
748 { |
1441
f3672356c121
refactoring: IHttpHandler and HttpToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1438
diff
changeset
|
749 HttpToolbox::ParseGetArguments(argumentsGET, request->query_string); |
1112
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
750 } |
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
751 |
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
752 |
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
753 // Compute the HTTP method, taking method faking into consideration |
2134
ddc75c6c712d
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2133
diff
changeset
|
754 method = HttpMethod_Get; |
1112
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
755 if (!ExtractMethod(method, request, headers, argumentsGET)) |
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
756 { |
1113
ba5c0908600c
Refactoring of HttpOutput ("Content-Length" header is now always sent)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1112
diff
changeset
|
757 output.SendStatus(HttpStatus_400_BadRequest); |
1112
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
758 return; |
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
759 } |
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
760 |
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
761 |
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
762 // Authenticate this connection |
2134
ddc75c6c712d
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2133
diff
changeset
|
763 if (server.IsAuthenticationEnabled() && |
ddc75c6c712d
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2133
diff
changeset
|
764 !IsAccessGranted(server, headers)) |
1112
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
765 { |
2790
c7313e1f7644
MongooseServer::SetRealm()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2635
diff
changeset
|
766 output.SendUnauthorized(server.GetRealm()); |
1112
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
767 return; |
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
768 } |
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
769 |
2377
32bea64e070b
Experimental support of actively maintained Civetweb to replace Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2268
diff
changeset
|
770 |
32bea64e070b
Experimental support of actively maintained Civetweb to replace Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2268
diff
changeset
|
771 #if ORTHANC_ENABLE_MONGOOSE == 1 |
1112
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
772 // Apply the filter, if it is installed |
1571
3232f1c995a5
provide the origin of the requests to HTTP handlers
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1570
diff
changeset
|
773 char remoteIp[24]; |
3232f1c995a5
provide the origin of the requests to HTTP handlers
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1570
diff
changeset
|
774 sprintf(remoteIp, "%d.%d.%d.%d", |
3232f1c995a5
provide the origin of the requests to HTTP handlers
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1570
diff
changeset
|
775 reinterpret_cast<const uint8_t*>(&request->remote_ip) [3], |
3232f1c995a5
provide the origin of the requests to HTTP handlers
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1570
diff
changeset
|
776 reinterpret_cast<const uint8_t*>(&request->remote_ip) [2], |
3232f1c995a5
provide the origin of the requests to HTTP handlers
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1570
diff
changeset
|
777 reinterpret_cast<const uint8_t*>(&request->remote_ip) [1], |
3232f1c995a5
provide the origin of the requests to HTTP handlers
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1570
diff
changeset
|
778 reinterpret_cast<const uint8_t*>(&request->remote_ip) [0]); |
3068
ad37c21ec4db
fix compatibility with civetweb 1.11
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3060
diff
changeset
|
779 |
ad37c21ec4db
fix compatibility with civetweb 1.11
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3060
diff
changeset
|
780 const char* requestUri = request->uri; |
ad37c21ec4db
fix compatibility with civetweb 1.11
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3060
diff
changeset
|
781 |
2377
32bea64e070b
Experimental support of actively maintained Civetweb to replace Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2268
diff
changeset
|
782 #elif ORTHANC_ENABLE_CIVETWEB == 1 |
32bea64e070b
Experimental support of actively maintained Civetweb to replace Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2268
diff
changeset
|
783 const char* remoteIp = request->remote_addr; |
3068
ad37c21ec4db
fix compatibility with civetweb 1.11
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3060
diff
changeset
|
784 const char* requestUri = request->local_uri; |
2377
32bea64e070b
Experimental support of actively maintained Civetweb to replace Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2268
diff
changeset
|
785 #else |
3069 | 786 # error |
2377
32bea64e070b
Experimental support of actively maintained Civetweb to replace Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2268
diff
changeset
|
787 #endif |
1571
3232f1c995a5
provide the origin of the requests to HTTP handlers
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1570
diff
changeset
|
788 |
3068
ad37c21ec4db
fix compatibility with civetweb 1.11
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3060
diff
changeset
|
789 if (requestUri == NULL) |
ad37c21ec4db
fix compatibility with civetweb 1.11
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3060
diff
changeset
|
790 { |
ad37c21ec4db
fix compatibility with civetweb 1.11
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3060
diff
changeset
|
791 requestUri = ""; |
ad37c21ec4db
fix compatibility with civetweb 1.11
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3060
diff
changeset
|
792 } |
ad37c21ec4db
fix compatibility with civetweb 1.11
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3060
diff
changeset
|
793 |
1571
3232f1c995a5
provide the origin of the requests to HTTP handlers
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1570
diff
changeset
|
794 std::string username = GetAuthenticatedUsername(headers); |
3232f1c995a5
provide the origin of the requests to HTTP handlers
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1570
diff
changeset
|
795 |
2616
2f3007bf0708
event queues in Lua, serialization of sequence of operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2579
diff
changeset
|
796 IIncomingHttpRequestFilter *filter = server.GetIncomingHttpRequestFilter(); |
1112
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
797 if (filter != NULL) |
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
798 { |
3068
ad37c21ec4db
fix compatibility with civetweb 1.11
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3060
diff
changeset
|
799 if (!filter->IsAllowed(method, requestUri, remoteIp, |
2268
ce5c13b95dac
New function: OrthancPluginRegisterIncomingHttpRequestFilter2()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2244
diff
changeset
|
800 username.c_str(), headers, argumentsGET)) |
1112
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
801 { |
2790
c7313e1f7644
MongooseServer::SetRealm()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2635
diff
changeset
|
802 //output.SendUnauthorized(server.GetRealm()); |
1963
af0c90ae0915
Use 403 Forbidden status if the incoming HTTP request is disallowed
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1959
diff
changeset
|
803 output.SendStatus(HttpStatus_403_Forbidden); |
1112
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
804 return; |
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
805 } |
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
806 } |
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
807 |
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
808 |
3395
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
809 // Decompose the URI into its components |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
810 UriComponents uri; |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
811 try |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
812 { |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
813 Toolbox::SplitUriComponents(uri, requestUri); |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
814 } |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
815 catch (OrthancException&) |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
816 { |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
817 output.SendStatus(HttpStatus_400_BadRequest); |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
818 return; |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
819 } |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
820 |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
821 LOG(INFO) << EnumerationToString(method) << " " << Toolbox::FlattenUri(uri); |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
822 |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
823 |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
824 bool found = false; |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
825 |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
826 // Extract the body of the request for PUT and POST, or process |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
827 // the body as a stream |
1446
8dc80ba768aa
refactoring: IHttpHandler does not use std::string to hold the request body
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1443
diff
changeset
|
828 |
8dc80ba768aa
refactoring: IHttpHandler does not use std::string to hold the request body
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1443
diff
changeset
|
829 // TODO Avoid unneccessary memcopy of the body |
8dc80ba768aa
refactoring: IHttpHandler does not use std::string to hold the request body
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1443
diff
changeset
|
830 |
1112
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
831 std::string body; |
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
832 if (method == HttpMethod_Post || |
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
833 method == HttpMethod_Put) |
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
834 { |
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
835 PostDataStatus status; |
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
836 |
3395
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
837 bool isMultipartForm = false; |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
838 |
1441
f3672356c121
refactoring: IHttpHandler and HttpToolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1438
diff
changeset
|
839 IHttpHandler::Arguments::const_iterator ct = headers.find("content-type"); |
3395
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
840 if (ct != headers.end() && |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
841 ct->second.size() >= MULTIPART_FORM_LENGTH && |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
842 !memcmp(ct->second.c_str(), MULTIPART_FORM, MULTIPART_FORM_LENGTH)) |
1112
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
843 { |
3445 | 844 /** |
845 * The user uses the "upload" form of Orthanc Explorer, for | |
846 * file uploads through a HTML form. | |
847 **/ | |
3395
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
848 status = ParseMultipartForm(body, connection, headers, ct->second, server.GetChunkStore()); |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
849 isMultipartForm = true; |
1112
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
850 } |
3395
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
851 |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
852 if (!isMultipartForm) |
1112
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
853 { |
3712
2a170a8f1faf
replacing std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3672
diff
changeset
|
854 std::unique_ptr<IHttpHandler::IChunkedRequestReader> stream; |
3395
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
855 |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
856 if (server.HasHandler()) |
1112
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
857 { |
3414 | 858 found = server.GetHandler().CreateChunkedRequestReader |
859 (stream, RequestOrigin_RestApi, remoteIp, username.c_str(), method, uri, headers); | |
3395
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
860 } |
3414 | 861 |
862 if (found) | |
863 { | |
864 if (stream.get() == NULL) | |
865 { | |
866 throw OrthancException(ErrorCode_InternalError); | |
867 } | |
3395
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
868 |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
869 status = ReadBodyToStream(*stream, connection, headers); |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
870 |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
871 if (status == PostDataStatus_Success) |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
872 { |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
873 stream->Execute(output); |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
874 } |
1112
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
875 } |
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
876 else |
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
877 { |
3395
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
878 status = ReadBodyToString(body, connection, headers); |
1112
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
879 } |
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
880 } |
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
881 |
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
882 switch (status) |
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
883 { |
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
884 case PostDataStatus_NoLength: |
1113
ba5c0908600c
Refactoring of HttpOutput ("Content-Length" header is now always sent)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1112
diff
changeset
|
885 output.SendStatus(HttpStatus_411_LengthRequired); |
1112
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
886 return; |
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
887 |
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
888 case PostDataStatus_Failure: |
1113
ba5c0908600c
Refactoring of HttpOutput ("Content-Length" header is now always sent)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1112
diff
changeset
|
889 output.SendStatus(HttpStatus_400_BadRequest); |
1112
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
890 return; |
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
891 |
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
892 case PostDataStatus_Pending: |
1521 | 893 output.AnswerEmpty(); |
1112
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
894 return; |
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
895 |
3395
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
896 case PostDataStatus_Success: |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
897 break; |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
898 |
1112
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
899 default: |
3395
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
900 throw OrthancException(ErrorCode_InternalError); |
1112
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
901 } |
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
902 } |
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
903 |
3395
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
904 if (!found && |
0ce9b4f5fdf5
new abstraction: IHttpHandler::CreateStreamHandler()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3357
diff
changeset
|
905 server.HasHandler()) |
2134
ddc75c6c712d
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2133
diff
changeset
|
906 { |
ddc75c6c712d
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2133
diff
changeset
|
907 found = server.GetHandler().Handle(output, RequestOrigin_RestApi, remoteIp, username.c_str(), |
ddc75c6c712d
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2133
diff
changeset
|
908 method, uri, headers, argumentsGET, body.c_str(), body.size()); |
ddc75c6c712d
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2133
diff
changeset
|
909 } |
ddc75c6c712d
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2133
diff
changeset
|
910 |
ddc75c6c712d
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2133
diff
changeset
|
911 if (!found) |
ddc75c6c712d
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2133
diff
changeset
|
912 { |
ddc75c6c712d
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2133
diff
changeset
|
913 throw OrthancException(ErrorCode_UnknownResource); |
ddc75c6c712d
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2133
diff
changeset
|
914 } |
ddc75c6c712d
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2133
diff
changeset
|
915 } |
ddc75c6c712d
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2133
diff
changeset
|
916 |
ddc75c6c712d
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2133
diff
changeset
|
917 |
ddc75c6c712d
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2133
diff
changeset
|
918 static void ProtectedCallback(struct mg_connection *connection, |
ddc75c6c712d
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2133
diff
changeset
|
919 const struct mg_request_info *request) |
ddc75c6c712d
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2133
diff
changeset
|
920 { |
1443
895ab369d63c
refactoring: OrthancHttpHandler
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1441
diff
changeset
|
921 try |
1112
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
922 { |
2377
32bea64e070b
Experimental support of actively maintained Civetweb to replace Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2268
diff
changeset
|
923 #if ORTHANC_ENABLE_MONGOOSE == 1 |
3068
ad37c21ec4db
fix compatibility with civetweb 1.11
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3060
diff
changeset
|
924 void *that = request->user_data; |
ad37c21ec4db
fix compatibility with civetweb 1.11
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3060
diff
changeset
|
925 const char* requestUri = request->uri; |
2377
32bea64e070b
Experimental support of actively maintained Civetweb to replace Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2268
diff
changeset
|
926 #elif ORTHANC_ENABLE_CIVETWEB == 1 |
32bea64e070b
Experimental support of actively maintained Civetweb to replace Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2268
diff
changeset
|
927 // https://github.com/civetweb/civetweb/issues/409 |
3068
ad37c21ec4db
fix compatibility with civetweb 1.11
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3060
diff
changeset
|
928 void *that = mg_get_user_data(mg_get_context(connection)); |
ad37c21ec4db
fix compatibility with civetweb 1.11
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3060
diff
changeset
|
929 const char* requestUri = request->local_uri; |
2377
32bea64e070b
Experimental support of actively maintained Civetweb to replace Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2268
diff
changeset
|
930 #else |
3069 | 931 # error |
3068
ad37c21ec4db
fix compatibility with civetweb 1.11
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3060
diff
changeset
|
932 #endif |
ad37c21ec4db
fix compatibility with civetweb 1.11
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3060
diff
changeset
|
933 |
ad37c21ec4db
fix compatibility with civetweb 1.11
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3060
diff
changeset
|
934 if (requestUri == NULL) |
ad37c21ec4db
fix compatibility with civetweb 1.11
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3060
diff
changeset
|
935 { |
ad37c21ec4db
fix compatibility with civetweb 1.11
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3060
diff
changeset
|
936 requestUri = ""; |
ad37c21ec4db
fix compatibility with civetweb 1.11
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3060
diff
changeset
|
937 } |
2134
ddc75c6c712d
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2133
diff
changeset
|
938 |
3138
ab46e537f92e
renamed class MongooseServer as HttpServer, CivetWeb made default HTTP server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3137
diff
changeset
|
939 HttpServer* server = reinterpret_cast<HttpServer*>(that); |
2377
32bea64e070b
Experimental support of actively maintained Civetweb to replace Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2268
diff
changeset
|
940 |
2134
ddc75c6c712d
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2133
diff
changeset
|
941 if (server == NULL) |
ddc75c6c712d
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2133
diff
changeset
|
942 { |
ddc75c6c712d
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2133
diff
changeset
|
943 MongooseOutputStream stream(connection); |
ddc75c6c712d
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2133
diff
changeset
|
944 HttpOutput output(stream, false /* assume no keep-alive */); |
ddc75c6c712d
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2133
diff
changeset
|
945 output.SendStatus(HttpStatus_500_InternalServerError); |
ddc75c6c712d
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2133
diff
changeset
|
946 return; |
ddc75c6c712d
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2133
diff
changeset
|
947 } |
2377
32bea64e070b
Experimental support of actively maintained Civetweb to replace Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2268
diff
changeset
|
948 |
2134
ddc75c6c712d
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2133
diff
changeset
|
949 MongooseOutputStream stream(connection); |
ddc75c6c712d
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2133
diff
changeset
|
950 HttpOutput output(stream, server->IsKeepAliveEnabled()); |
ddc75c6c712d
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2133
diff
changeset
|
951 HttpMethod method = HttpMethod_Get; |
1569 | 952 |
953 try | |
1570 | 954 { |
2134
ddc75c6c712d
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2133
diff
changeset
|
955 try |
ddc75c6c712d
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2133
diff
changeset
|
956 { |
ddc75c6c712d
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2133
diff
changeset
|
957 InternalCallback(output, method, *server, connection, request); |
ddc75c6c712d
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2133
diff
changeset
|
958 } |
ddc75c6c712d
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2133
diff
changeset
|
959 catch (OrthancException&) |
ddc75c6c712d
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2133
diff
changeset
|
960 { |
ddc75c6c712d
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2133
diff
changeset
|
961 throw; // Pass the exception to the main handler below |
ddc75c6c712d
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2133
diff
changeset
|
962 } |
ddc75c6c712d
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2133
diff
changeset
|
963 // Now convert native exceptions as OrthancException |
ddc75c6c712d
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2133
diff
changeset
|
964 catch (boost::bad_lexical_cast&) |
1570 | 965 { |
2954
d924f9bb61cc
taking advantage of details in OrthancException
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2903
diff
changeset
|
966 throw OrthancException(ErrorCode_BadParameterType, |
d924f9bb61cc
taking advantage of details in OrthancException
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2903
diff
changeset
|
967 "Syntax error in some user-supplied data"); |
2134
ddc75c6c712d
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2133
diff
changeset
|
968 } |
3672
ea8c1c0e81eb
Fix issue #65 (Logging improvements)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3640
diff
changeset
|
969 catch (boost::filesystem::filesystem_error& e) |
ea8c1c0e81eb
Fix issue #65 (Logging improvements)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3640
diff
changeset
|
970 { |
ea8c1c0e81eb
Fix issue #65 (Logging improvements)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3640
diff
changeset
|
971 throw OrthancException(ErrorCode_InternalError, |
ea8c1c0e81eb
Fix issue #65 (Logging improvements)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3640
diff
changeset
|
972 "Error while accessing the filesystem: " + e.path1().string()); |
ea8c1c0e81eb
Fix issue #65 (Logging improvements)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3640
diff
changeset
|
973 } |
2134
ddc75c6c712d
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2133
diff
changeset
|
974 catch (std::runtime_error&) |
ddc75c6c712d
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2133
diff
changeset
|
975 { |
3672
ea8c1c0e81eb
Fix issue #65 (Logging improvements)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3640
diff
changeset
|
976 throw OrthancException(ErrorCode_BadRequest, |
ea8c1c0e81eb
Fix issue #65 (Logging improvements)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3640
diff
changeset
|
977 "Presumably an error while parsing the JSON body"); |
2134
ddc75c6c712d
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2133
diff
changeset
|
978 } |
ddc75c6c712d
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2133
diff
changeset
|
979 catch (std::bad_alloc&) |
ddc75c6c712d
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2133
diff
changeset
|
980 { |
2954
d924f9bb61cc
taking advantage of details in OrthancException
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2903
diff
changeset
|
981 throw OrthancException(ErrorCode_NotEnoughMemory, |
d924f9bb61cc
taking advantage of details in OrthancException
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2903
diff
changeset
|
982 "The server hosting Orthanc is running out of memory"); |
2134
ddc75c6c712d
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2133
diff
changeset
|
983 } |
ddc75c6c712d
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2133
diff
changeset
|
984 catch (...) |
ddc75c6c712d
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2133
diff
changeset
|
985 { |
2954
d924f9bb61cc
taking advantage of details in OrthancException
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2903
diff
changeset
|
986 throw OrthancException(ErrorCode_InternalError, |
d924f9bb61cc
taking advantage of details in OrthancException
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2903
diff
changeset
|
987 "An unhandled exception was generated inside the HTTP server"); |
1570 | 988 } |
989 } | |
2134
ddc75c6c712d
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2133
diff
changeset
|
990 catch (OrthancException& e) |
1570 | 991 { |
2134
ddc75c6c712d
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2133
diff
changeset
|
992 assert(server != NULL); |
1569 | 993 |
2134
ddc75c6c712d
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2133
diff
changeset
|
994 // Using this candidate handler results in an exception |
ddc75c6c712d
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2133
diff
changeset
|
995 try |
ddc75c6c712d
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2133
diff
changeset
|
996 { |
ddc75c6c712d
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2133
diff
changeset
|
997 if (server->GetExceptionFormatter() == NULL) |
ddc75c6c712d
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2133
diff
changeset
|
998 { |
ddc75c6c712d
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2133
diff
changeset
|
999 LOG(ERROR) << "Exception in the HTTP handler: " << e.What(); |
ddc75c6c712d
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2133
diff
changeset
|
1000 output.SendStatus(e.GetHttpStatus()); |
ddc75c6c712d
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2133
diff
changeset
|
1001 } |
ddc75c6c712d
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2133
diff
changeset
|
1002 else |
ddc75c6c712d
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2133
diff
changeset
|
1003 { |
3068
ad37c21ec4db
fix compatibility with civetweb 1.11
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3060
diff
changeset
|
1004 server->GetExceptionFormatter()->Format(output, e, method, requestUri); |
2134
ddc75c6c712d
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2133
diff
changeset
|
1005 } |
ddc75c6c712d
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2133
diff
changeset
|
1006 } |
ddc75c6c712d
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2133
diff
changeset
|
1007 catch (OrthancException&) |
ddc75c6c712d
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2133
diff
changeset
|
1008 { |
ddc75c6c712d
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2133
diff
changeset
|
1009 // An exception here reflects the fact that the status code |
ddc75c6c712d
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2133
diff
changeset
|
1010 // was already set by the HTTP handler. |
ddc75c6c712d
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2133
diff
changeset
|
1011 } |
1570 | 1012 } |
1443
895ab369d63c
refactoring: OrthancHttpHandler
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1441
diff
changeset
|
1013 } |
2134
ddc75c6c712d
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2133
diff
changeset
|
1014 catch (...) |
1443
895ab369d63c
refactoring: OrthancHttpHandler
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1441
diff
changeset
|
1015 { |
2134
ddc75c6c712d
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2133
diff
changeset
|
1016 // We should never arrive at this point, where it is even impossible to send an answer |
ddc75c6c712d
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2133
diff
changeset
|
1017 LOG(ERROR) << "Catastrophic error inside the HTTP server, giving up"; |
1443
895ab369d63c
refactoring: OrthancHttpHandler
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1441
diff
changeset
|
1018 } |
1112
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
1019 } |
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
1020 |
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
1021 |
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
1022 #if MONGOOSE_USE_CALLBACKS == 0 |
0 | 1023 static void* Callback(enum mg_event event, |
1024 struct mg_connection *connection, | |
1025 const struct mg_request_info *request) | |
1026 { | |
1027 if (event == MG_NEW_REQUEST) | |
1028 { | |
2134
ddc75c6c712d
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2133
diff
changeset
|
1029 ProtectedCallback(connection, request); |
0 | 1030 |
1031 // Mark as processed | |
1032 return (void*) ""; | |
1112
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
1033 } |
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
1034 else |
0 | 1035 { |
1036 return NULL; | |
1037 } | |
1038 } | |
1039 | |
1112
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
1040 #elif MONGOOSE_USE_CALLBACKS == 1 |
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
1041 static int Callback(struct mg_connection *connection) |
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
1042 { |
2377
32bea64e070b
Experimental support of actively maintained Civetweb to replace Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2268
diff
changeset
|
1043 const struct mg_request_info *request = mg_get_request_info(connection); |
1112
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
1044 |
2134
ddc75c6c712d
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2133
diff
changeset
|
1045 ProtectedCallback(connection, request); |
1112
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
1046 |
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
1047 return 1; // Do not let Mongoose handle the request by itself |
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
1048 } |
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
1049 |
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
1050 #else |
3069 | 1051 # error Please set MONGOOSE_USE_CALLBACKS |
1112
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
1052 #endif |
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
1053 |
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
1054 |
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
1055 |
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
1056 |
0 | 1057 |
3138
ab46e537f92e
renamed class MongooseServer as HttpServer, CivetWeb made default HTTP server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3137
diff
changeset
|
1058 bool HttpServer::IsRunning() const |
0 | 1059 { |
1060 return (pimpl_->context_ != NULL); | |
1061 } | |
1062 | |
1063 | |
4201 | 1064 HttpServer::HttpServer() : |
1065 pimpl_(new PImpl), | |
1066 handler_(NULL), | |
1067 remoteAllowed_(false), | |
1068 authentication_(false), | |
1069 sslVerifyPeers_(false), | |
1070 ssl_(false), | |
1071 port_(8000), | |
1072 filter_(NULL), | |
1073 keepAlive_(false), | |
1074 httpCompression_(true), | |
1075 exceptionFormatter_(NULL), | |
1076 realm_(ORTHANC_REALM), | |
1077 threadsCount_(50), // Default value in mongoose | |
1078 tcpNoDelay_(true), | |
1079 requestTimeout_(30) // Default value in mongoose/civetweb (30 seconds) | |
0 | 1080 { |
3145
239331e4ee0b
log about what HTTP server is running
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3138
diff
changeset
|
1081 #if ORTHANC_ENABLE_MONGOOSE == 1 |
239331e4ee0b
log about what HTTP server is running
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3138
diff
changeset
|
1082 LOG(INFO) << "This Orthanc server uses Mongoose as its embedded HTTP server"; |
239331e4ee0b
log about what HTTP server is running
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3138
diff
changeset
|
1083 #endif |
239331e4ee0b
log about what HTTP server is running
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3138
diff
changeset
|
1084 |
239331e4ee0b
log about what HTTP server is running
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3138
diff
changeset
|
1085 #if ORTHANC_ENABLE_CIVETWEB == 1 |
239331e4ee0b
log about what HTTP server is running
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3138
diff
changeset
|
1086 LOG(INFO) << "This Orthanc server uses CivetWeb as its embedded HTTP server"; |
239331e4ee0b
log about what HTTP server is running
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3138
diff
changeset
|
1087 #endif |
239331e4ee0b
log about what HTTP server is running
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3138
diff
changeset
|
1088 |
2136
dd609a99d39a
uniformization of the macro naming
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2134
diff
changeset
|
1089 #if ORTHANC_ENABLE_SSL == 1 |
749 | 1090 // Check for the Heartbleed exploit |
748
de9763f63510
upgrade to openssl-1.0.1g because of heartbeat exploit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
689
diff
changeset
|
1091 // https://en.wikipedia.org/wiki/OpenSSL#Heartbleed_bug |
de9763f63510
upgrade to openssl-1.0.1g because of heartbeat exploit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
689
diff
changeset
|
1092 if (OPENSSL_VERSION_NUMBER < 0x1000107fL /* openssl-1.0.1g */ && |
de9763f63510
upgrade to openssl-1.0.1g because of heartbeat exploit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
689
diff
changeset
|
1093 OPENSSL_VERSION_NUMBER >= 0x1000100fL /* openssl-1.0.1 */) |
de9763f63510
upgrade to openssl-1.0.1g because of heartbeat exploit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
689
diff
changeset
|
1094 { |
749 | 1095 LOG(WARNING) << "This version of OpenSSL is vulnerable to the Heartbleed exploit"; |
748
de9763f63510
upgrade to openssl-1.0.1g because of heartbeat exploit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
689
diff
changeset
|
1096 } |
de9763f63510
upgrade to openssl-1.0.1g because of heartbeat exploit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
689
diff
changeset
|
1097 #endif |
0 | 1098 } |
1099 | |
1100 | |
3138
ab46e537f92e
renamed class MongooseServer as HttpServer, CivetWeb made default HTTP server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3137
diff
changeset
|
1101 HttpServer::~HttpServer() |
0 | 1102 { |
1103 Stop(); | |
4226
7bd5eab3ba25
prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4201
diff
changeset
|
1104 |
7bd5eab3ba25
prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4201
diff
changeset
|
1105 #if ORTHANC_ENABLE_PUGIXML == 1 |
7bd5eab3ba25
prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4201
diff
changeset
|
1106 for (WebDavBuckets::iterator it = webDavBuckets_.begin(); it != webDavBuckets_.end(); ++it) |
7bd5eab3ba25
prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4201
diff
changeset
|
1107 { |
7bd5eab3ba25
prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4201
diff
changeset
|
1108 assert(it->second != NULL); |
7bd5eab3ba25
prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4201
diff
changeset
|
1109 delete it->second; |
7bd5eab3ba25
prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4201
diff
changeset
|
1110 } |
7bd5eab3ba25
prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4201
diff
changeset
|
1111 #endif |
0 | 1112 } |
1113 | |
1114 | |
3138
ab46e537f92e
renamed class MongooseServer as HttpServer, CivetWeb made default HTTP server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3137
diff
changeset
|
1115 void HttpServer::SetPortNumber(uint16_t port) |
0 | 1116 { |
1117 Stop(); | |
1118 port_ = port; | |
1119 } | |
1120 | |
3138
ab46e537f92e
renamed class MongooseServer as HttpServer, CivetWeb made default HTTP server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3137
diff
changeset
|
1121 void HttpServer::Start() |
0 | 1122 { |
2377
32bea64e070b
Experimental support of actively maintained Civetweb to replace Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2268
diff
changeset
|
1123 #if ORTHANC_ENABLE_MONGOOSE == 1 |
32bea64e070b
Experimental support of actively maintained Civetweb to replace Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2268
diff
changeset
|
1124 LOG(INFO) << "Starting embedded Web server using Mongoose"; |
32bea64e070b
Experimental support of actively maintained Civetweb to replace Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2268
diff
changeset
|
1125 #elif ORTHANC_ENABLE_CIVETWEB == 1 |
32bea64e070b
Experimental support of actively maintained Civetweb to replace Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2268
diff
changeset
|
1126 LOG(INFO) << "Starting embedded Web server using Civetweb"; |
32bea64e070b
Experimental support of actively maintained Civetweb to replace Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2268
diff
changeset
|
1127 #else |
3069 | 1128 # error |
2377
32bea64e070b
Experimental support of actively maintained Civetweb to replace Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2268
diff
changeset
|
1129 #endif |
32bea64e070b
Experimental support of actively maintained Civetweb to replace Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2268
diff
changeset
|
1130 |
0 | 1131 if (!IsRunning()) |
1132 { | |
1133 std::string port = boost::lexical_cast<std::string>(port_); | |
2903
1153b1a128fe
MongooseServer::SetThreadsCount()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2895
diff
changeset
|
1134 std::string numThreads = boost::lexical_cast<std::string>(threadsCount_); |
3537
9cc09f4c0fa9
New configuration option: "HttpRequestTimeout"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3445
diff
changeset
|
1135 std::string requestTimeoutMilliseconds = boost::lexical_cast<std::string>(requestTimeout_ * 1000); |
0 | 1136 |
23 | 1137 if (ssl_) |
1138 { | |
1139 port += "s"; | |
1140 } | |
1141 | |
4193
ff24a06b3474
fix HttpServer options if sslVerifyPeers_ == false and ssl_ == true
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4190
diff
changeset
|
1142 std::vector<const char*> options; |
ff24a06b3474
fix HttpServer options if sslVerifyPeers_ == false and ssl_ == true
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4190
diff
changeset
|
1143 |
ff24a06b3474
fix HttpServer options if sslVerifyPeers_ == false and ssl_ == true
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4190
diff
changeset
|
1144 // Set the TCP port for the HTTP server |
ff24a06b3474
fix HttpServer options if sslVerifyPeers_ == false and ssl_ == true
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4190
diff
changeset
|
1145 options.push_back("listening_ports"); |
ff24a06b3474
fix HttpServer options if sslVerifyPeers_ == false and ssl_ == true
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4190
diff
changeset
|
1146 options.push_back(port.c_str()); |
1110
becde5351e47
preparing to update mongoose
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1100
diff
changeset
|
1147 |
4193
ff24a06b3474
fix HttpServer options if sslVerifyPeers_ == false and ssl_ == true
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4190
diff
changeset
|
1148 // Optimization reported by Chris Hafey |
ff24a06b3474
fix HttpServer options if sslVerifyPeers_ == false and ssl_ == true
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4190
diff
changeset
|
1149 // https://groups.google.com/d/msg/orthanc-users/CKueKX0pJ9E/_UCbl8T-VjIJ |
ff24a06b3474
fix HttpServer options if sslVerifyPeers_ == false and ssl_ == true
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4190
diff
changeset
|
1150 options.push_back("enable_keep_alive"); |
ff24a06b3474
fix HttpServer options if sslVerifyPeers_ == false and ssl_ == true
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4190
diff
changeset
|
1151 options.push_back(keepAlive_ ? "yes" : "no"); |
1110
becde5351e47
preparing to update mongoose
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1100
diff
changeset
|
1152 |
2579 | 1153 #if ORTHANC_ENABLE_CIVETWEB == 1 |
4193
ff24a06b3474
fix HttpServer options if sslVerifyPeers_ == false and ssl_ == true
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4190
diff
changeset
|
1154 // https://github.com/civetweb/civetweb/blob/master/docs/UserManual.md#enable_keep_alive-no |
ff24a06b3474
fix HttpServer options if sslVerifyPeers_ == false and ssl_ == true
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4190
diff
changeset
|
1155 options.push_back("keep_alive_timeout_ms"); |
ff24a06b3474
fix HttpServer options if sslVerifyPeers_ == false and ssl_ == true
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4190
diff
changeset
|
1156 options.push_back(keepAlive_ ? "500" : "0"); |
2577
6783a7c02990
keep_alive_timeout_ms for civetweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2447
diff
changeset
|
1157 #endif |
2903
1153b1a128fe
MongooseServer::SetThreadsCount()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2895
diff
changeset
|
1158 |
3136
f948deef53d9
using tcp_nodelay in civetweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3069
diff
changeset
|
1159 #if ORTHANC_ENABLE_CIVETWEB == 1 |
4193
ff24a06b3474
fix HttpServer options if sslVerifyPeers_ == false and ssl_ == true
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4190
diff
changeset
|
1160 // Disable TCP Nagle's algorithm to maximize speed (this |
ff24a06b3474
fix HttpServer options if sslVerifyPeers_ == false and ssl_ == true
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4190
diff
changeset
|
1161 // option is not available in Mongoose). |
ff24a06b3474
fix HttpServer options if sslVerifyPeers_ == false and ssl_ == true
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4190
diff
changeset
|
1162 // https://groups.google.com/d/topic/civetweb/35HBR9seFjU/discussion |
ff24a06b3474
fix HttpServer options if sslVerifyPeers_ == false and ssl_ == true
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4190
diff
changeset
|
1163 // https://eklitzke.org/the-caveats-of-tcp-nodelay |
ff24a06b3474
fix HttpServer options if sslVerifyPeers_ == false and ssl_ == true
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4190
diff
changeset
|
1164 options.push_back("tcp_nodelay"); |
ff24a06b3474
fix HttpServer options if sslVerifyPeers_ == false and ssl_ == true
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4190
diff
changeset
|
1165 options.push_back(tcpNoDelay_ ? "1" : "0"); |
3136
f948deef53d9
using tcp_nodelay in civetweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3069
diff
changeset
|
1166 #endif |
f948deef53d9
using tcp_nodelay in civetweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3069
diff
changeset
|
1167 |
4193
ff24a06b3474
fix HttpServer options if sslVerifyPeers_ == false and ssl_ == true
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4190
diff
changeset
|
1168 // Set the number of threads |
ff24a06b3474
fix HttpServer options if sslVerifyPeers_ == false and ssl_ == true
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4190
diff
changeset
|
1169 options.push_back("num_threads"); |
ff24a06b3474
fix HttpServer options if sslVerifyPeers_ == false and ssl_ == true
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4190
diff
changeset
|
1170 options.push_back(numThreads.c_str()); |
2577
6783a7c02990
keep_alive_timeout_ms for civetweb
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2447
diff
changeset
|
1171 |
4193
ff24a06b3474
fix HttpServer options if sslVerifyPeers_ == false and ssl_ == true
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4190
diff
changeset
|
1172 // Set the timeout for the HTTP server |
ff24a06b3474
fix HttpServer options if sslVerifyPeers_ == false and ssl_ == true
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4190
diff
changeset
|
1173 options.push_back("request_timeout_ms"); |
ff24a06b3474
fix HttpServer options if sslVerifyPeers_ == false and ssl_ == true
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4190
diff
changeset
|
1174 options.push_back(requestTimeoutMilliseconds.c_str()); |
ff24a06b3474
fix HttpServer options if sslVerifyPeers_ == false and ssl_ == true
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4190
diff
changeset
|
1175 |
ff24a06b3474
fix HttpServer options if sslVerifyPeers_ == false and ssl_ == true
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4190
diff
changeset
|
1176 // Set the client authentication |
ff24a06b3474
fix HttpServer options if sslVerifyPeers_ == false and ssl_ == true
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4190
diff
changeset
|
1177 options.push_back("ssl_verify_peer"); |
ff24a06b3474
fix HttpServer options if sslVerifyPeers_ == false and ssl_ == true
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4190
diff
changeset
|
1178 options.push_back(sslVerifyPeers_ ? "yes" : "no"); |
3537
9cc09f4c0fa9
New configuration option: "HttpRequestTimeout"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3445
diff
changeset
|
1179 |
4193
ff24a06b3474
fix HttpServer options if sslVerifyPeers_ == false and ssl_ == true
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4190
diff
changeset
|
1180 if (sslVerifyPeers_) |
ff24a06b3474
fix HttpServer options if sslVerifyPeers_ == false and ssl_ == true
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4190
diff
changeset
|
1181 { |
4190
9ce5c89328f5
New configuration options to enable HTTP peers identification through certificates
Alain Mazy <alain@mazy.be>
parents:
4152
diff
changeset
|
1182 // Set the trusted client certificates (for X509 mutual authentication) |
4193
ff24a06b3474
fix HttpServer options if sslVerifyPeers_ == false and ssl_ == true
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4190
diff
changeset
|
1183 options.push_back("ssl_ca_file"); |
ff24a06b3474
fix HttpServer options if sslVerifyPeers_ == false and ssl_ == true
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4190
diff
changeset
|
1184 options.push_back(trustedClientCertificates_.c_str()); |
ff24a06b3474
fix HttpServer options if sslVerifyPeers_ == false and ssl_ == true
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4190
diff
changeset
|
1185 } |
4190
9ce5c89328f5
New configuration options to enable HTTP peers identification through certificates
Alain Mazy <alain@mazy.be>
parents:
4152
diff
changeset
|
1186 |
4193
ff24a06b3474
fix HttpServer options if sslVerifyPeers_ == false and ssl_ == true
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4190
diff
changeset
|
1187 if (ssl_) |
ff24a06b3474
fix HttpServer options if sslVerifyPeers_ == false and ssl_ == true
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4190
diff
changeset
|
1188 { |
ff24a06b3474
fix HttpServer options if sslVerifyPeers_ == false and ssl_ == true
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4190
diff
changeset
|
1189 // Set the SSL certificate, if any |
ff24a06b3474
fix HttpServer options if sslVerifyPeers_ == false and ssl_ == true
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4190
diff
changeset
|
1190 options.push_back("ssl_certificate"); |
ff24a06b3474
fix HttpServer options if sslVerifyPeers_ == false and ssl_ == true
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4190
diff
changeset
|
1191 options.push_back(certificate_.c_str()); |
0 | 1192 }; |
1193 | |
4193
ff24a06b3474
fix HttpServer options if sslVerifyPeers_ == false and ssl_ == true
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4190
diff
changeset
|
1194 assert(options.size() % 2 == 0); |
ff24a06b3474
fix HttpServer options if sslVerifyPeers_ == false and ssl_ == true
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4190
diff
changeset
|
1195 options.push_back(NULL); |
ff24a06b3474
fix HttpServer options if sslVerifyPeers_ == false and ssl_ == true
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4190
diff
changeset
|
1196 |
1112
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
1197 #if MONGOOSE_USE_CALLBACKS == 0 |
4193
ff24a06b3474
fix HttpServer options if sslVerifyPeers_ == false and ssl_ == true
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4190
diff
changeset
|
1198 pimpl_->context_ = mg_start(&Callback, this, &options[0]); |
1112
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
1199 |
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
1200 #elif MONGOOSE_USE_CALLBACKS == 1 |
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
1201 struct mg_callbacks callbacks; |
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
1202 memset(&callbacks, 0, sizeof(callbacks)); |
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
1203 callbacks.begin_request = Callback; |
4193
ff24a06b3474
fix HttpServer options if sslVerifyPeers_ == false and ssl_ == true
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4190
diff
changeset
|
1204 pimpl_->context_ = mg_start(&callbacks, this, &options[0]); |
1112
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
1205 |
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
1206 #else |
3069 | 1207 # error Please set MONGOOSE_USE_CALLBACKS |
1112
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
1208 #endif |
a119f9ae3640
upgrade to Mongoose 3.8
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1110
diff
changeset
|
1209 |
0 | 1210 if (!pimpl_->context_) |
1211 { | |
3801
9fe1d64a748c
upgrade to civetweb 1.12, error reporting if OpenSSL failure
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3712
diff
changeset
|
1212 bool isSslError = false; |
9fe1d64a748c
upgrade to civetweb 1.12, error reporting if OpenSSL failure
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3712
diff
changeset
|
1213 |
9fe1d64a748c
upgrade to civetweb 1.12, error reporting if OpenSSL failure
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3712
diff
changeset
|
1214 #if ORTHANC_ENABLE_SSL == 1 |
9fe1d64a748c
upgrade to civetweb 1.12, error reporting if OpenSSL failure
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3712
diff
changeset
|
1215 for (;;) |
9fe1d64a748c
upgrade to civetweb 1.12, error reporting if OpenSSL failure
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3712
diff
changeset
|
1216 { |
9fe1d64a748c
upgrade to civetweb 1.12, error reporting if OpenSSL failure
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3712
diff
changeset
|
1217 unsigned long code = ERR_get_error(); |
9fe1d64a748c
upgrade to civetweb 1.12, error reporting if OpenSSL failure
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3712
diff
changeset
|
1218 if (code == 0) |
9fe1d64a748c
upgrade to civetweb 1.12, error reporting if OpenSSL failure
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3712
diff
changeset
|
1219 { |
9fe1d64a748c
upgrade to civetweb 1.12, error reporting if OpenSSL failure
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3712
diff
changeset
|
1220 break; |
9fe1d64a748c
upgrade to civetweb 1.12, error reporting if OpenSSL failure
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3712
diff
changeset
|
1221 } |
9fe1d64a748c
upgrade to civetweb 1.12, error reporting if OpenSSL failure
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3712
diff
changeset
|
1222 else |
9fe1d64a748c
upgrade to civetweb 1.12, error reporting if OpenSSL failure
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3712
diff
changeset
|
1223 { |
9fe1d64a748c
upgrade to civetweb 1.12, error reporting if OpenSSL failure
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3712
diff
changeset
|
1224 isSslError = true; |
9fe1d64a748c
upgrade to civetweb 1.12, error reporting if OpenSSL failure
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3712
diff
changeset
|
1225 char message[1024]; |
9fe1d64a748c
upgrade to civetweb 1.12, error reporting if OpenSSL failure
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3712
diff
changeset
|
1226 ERR_error_string_n(code, message, sizeof(message) - 1); |
9fe1d64a748c
upgrade to civetweb 1.12, error reporting if OpenSSL failure
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3712
diff
changeset
|
1227 LOG(ERROR) << "OpenSSL error: " << message; |
9fe1d64a748c
upgrade to civetweb 1.12, error reporting if OpenSSL failure
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3712
diff
changeset
|
1228 } |
9fe1d64a748c
upgrade to civetweb 1.12, error reporting if OpenSSL failure
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3712
diff
changeset
|
1229 } |
9fe1d64a748c
upgrade to civetweb 1.12, error reporting if OpenSSL failure
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3712
diff
changeset
|
1230 #endif |
9fe1d64a748c
upgrade to civetweb 1.12, error reporting if OpenSSL failure
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3712
diff
changeset
|
1231 |
9fe1d64a748c
upgrade to civetweb 1.12, error reporting if OpenSSL failure
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3712
diff
changeset
|
1232 if (isSslError) |
9fe1d64a748c
upgrade to civetweb 1.12, error reporting if OpenSSL failure
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3712
diff
changeset
|
1233 { |
9fe1d64a748c
upgrade to civetweb 1.12, error reporting if OpenSSL failure
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3712
diff
changeset
|
1234 throw OrthancException(ErrorCode_SslInitialization); |
9fe1d64a748c
upgrade to civetweb 1.12, error reporting if OpenSSL failure
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3712
diff
changeset
|
1235 } |
9fe1d64a748c
upgrade to civetweb 1.12, error reporting if OpenSSL failure
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3712
diff
changeset
|
1236 else |
9fe1d64a748c
upgrade to civetweb 1.12, error reporting if OpenSSL failure
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3712
diff
changeset
|
1237 { |
9fe1d64a748c
upgrade to civetweb 1.12, error reporting if OpenSSL failure
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3712
diff
changeset
|
1238 throw OrthancException(ErrorCode_HttpPortInUse, |
9fe1d64a748c
upgrade to civetweb 1.12, error reporting if OpenSSL failure
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3712
diff
changeset
|
1239 " (port = " + boost::lexical_cast<std::string>(port_) + ")"); |
9fe1d64a748c
upgrade to civetweb 1.12, error reporting if OpenSSL failure
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3712
diff
changeset
|
1240 } |
0 | 1241 } |
2633
40c7926b75f8
log about remote access allowed
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2579
diff
changeset
|
1242 |
40c7926b75f8
log about remote access allowed
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2579
diff
changeset
|
1243 LOG(WARNING) << "HTTP server listening on port: " << GetPortNumber() |
40c7926b75f8
log about remote access allowed
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2579
diff
changeset
|
1244 << " (HTTPS encryption is " |
40c7926b75f8
log about remote access allowed
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2579
diff
changeset
|
1245 << (IsSslEnabled() ? "enabled" : "disabled") |
40c7926b75f8
log about remote access allowed
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2579
diff
changeset
|
1246 << ", remote access is " |
40c7926b75f8
log about remote access allowed
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2579
diff
changeset
|
1247 << (IsRemoteAccessAllowed() ? "" : "not ") |
40c7926b75f8
log about remote access allowed
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2579
diff
changeset
|
1248 << "allowed)"; |
0 | 1249 } |
1250 } | |
1251 | |
3138
ab46e537f92e
renamed class MongooseServer as HttpServer, CivetWeb made default HTTP server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3137
diff
changeset
|
1252 void HttpServer::Stop() |
0 | 1253 { |
1254 if (IsRunning()) | |
1255 { | |
1256 mg_stop(pimpl_->context_); | |
1257 pimpl_->context_ = NULL; | |
1258 } | |
1259 } | |
1260 | |
1261 | |
3138
ab46e537f92e
renamed class MongooseServer as HttpServer, CivetWeb made default HTTP server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3137
diff
changeset
|
1262 void HttpServer::ClearUsers() |
25
dd1489098265
basic http authentication
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
24
diff
changeset
|
1263 { |
dd1489098265
basic http authentication
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
24
diff
changeset
|
1264 Stop(); |
dd1489098265
basic http authentication
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
24
diff
changeset
|
1265 registeredUsers_.clear(); |
dd1489098265
basic http authentication
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
24
diff
changeset
|
1266 } |
dd1489098265
basic http authentication
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
24
diff
changeset
|
1267 |
dd1489098265
basic http authentication
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
24
diff
changeset
|
1268 |
3138
ab46e537f92e
renamed class MongooseServer as HttpServer, CivetWeb made default HTTP server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3137
diff
changeset
|
1269 void HttpServer::RegisterUser(const char* username, |
ab46e537f92e
renamed class MongooseServer as HttpServer, CivetWeb made default HTTP server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3137
diff
changeset
|
1270 const char* password) |
23 | 1271 { |
1272 Stop(); | |
24 | 1273 |
1274 std::string tag = std::string(username) + ":" + std::string(password); | |
809
8ce2f69436ca
do not return strings with base64
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
749
diff
changeset
|
1275 std::string encoded; |
8ce2f69436ca
do not return strings with base64
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
749
diff
changeset
|
1276 Toolbox::EncodeBase64(encoded, tag); |
8ce2f69436ca
do not return strings with base64
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
749
diff
changeset
|
1277 registeredUsers_.insert(encoded); |
23 | 1278 } |
1279 | |
3138
ab46e537f92e
renamed class MongooseServer as HttpServer, CivetWeb made default HTTP server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3137
diff
changeset
|
1280 void HttpServer::SetSslEnabled(bool enabled) |
23 | 1281 { |
1282 Stop(); | |
1283 | |
2136
dd609a99d39a
uniformization of the macro naming
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2134
diff
changeset
|
1284 #if ORTHANC_ENABLE_SSL == 0 |
23 | 1285 if (enabled) |
1286 { | |
1674
4fc502d469f4
fix build if SSL is disabled
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1649
diff
changeset
|
1287 throw OrthancException(ErrorCode_SslDisabled); |
23 | 1288 } |
1289 else | |
1290 { | |
1291 ssl_ = false; | |
1292 } | |
1293 #else | |
1294 ssl_ = enabled; | |
1295 #endif | |
1296 } | |
1297 | |
4190
9ce5c89328f5
New configuration options to enable HTTP peers identification through certificates
Alain Mazy <alain@mazy.be>
parents:
4152
diff
changeset
|
1298 void HttpServer::SetSslVerifyPeers(bool enabled) |
9ce5c89328f5
New configuration options to enable HTTP peers identification through certificates
Alain Mazy <alain@mazy.be>
parents:
4152
diff
changeset
|
1299 { |
9ce5c89328f5
New configuration options to enable HTTP peers identification through certificates
Alain Mazy <alain@mazy.be>
parents:
4152
diff
changeset
|
1300 Stop(); |
9ce5c89328f5
New configuration options to enable HTTP peers identification through certificates
Alain Mazy <alain@mazy.be>
parents:
4152
diff
changeset
|
1301 |
9ce5c89328f5
New configuration options to enable HTTP peers identification through certificates
Alain Mazy <alain@mazy.be>
parents:
4152
diff
changeset
|
1302 #if ORTHANC_ENABLE_SSL == 0 |
9ce5c89328f5
New configuration options to enable HTTP peers identification through certificates
Alain Mazy <alain@mazy.be>
parents:
4152
diff
changeset
|
1303 if (enabled) |
9ce5c89328f5
New configuration options to enable HTTP peers identification through certificates
Alain Mazy <alain@mazy.be>
parents:
4152
diff
changeset
|
1304 { |
9ce5c89328f5
New configuration options to enable HTTP peers identification through certificates
Alain Mazy <alain@mazy.be>
parents:
4152
diff
changeset
|
1305 throw OrthancException(ErrorCode_SslDisabled); |
9ce5c89328f5
New configuration options to enable HTTP peers identification through certificates
Alain Mazy <alain@mazy.be>
parents:
4152
diff
changeset
|
1306 } |
9ce5c89328f5
New configuration options to enable HTTP peers identification through certificates
Alain Mazy <alain@mazy.be>
parents:
4152
diff
changeset
|
1307 else |
9ce5c89328f5
New configuration options to enable HTTP peers identification through certificates
Alain Mazy <alain@mazy.be>
parents:
4152
diff
changeset
|
1308 { |
9ce5c89328f5
New configuration options to enable HTTP peers identification through certificates
Alain Mazy <alain@mazy.be>
parents:
4152
diff
changeset
|
1309 sslVerifyPeers_ = false; |
9ce5c89328f5
New configuration options to enable HTTP peers identification through certificates
Alain Mazy <alain@mazy.be>
parents:
4152
diff
changeset
|
1310 } |
9ce5c89328f5
New configuration options to enable HTTP peers identification through certificates
Alain Mazy <alain@mazy.be>
parents:
4152
diff
changeset
|
1311 #else |
9ce5c89328f5
New configuration options to enable HTTP peers identification through certificates
Alain Mazy <alain@mazy.be>
parents:
4152
diff
changeset
|
1312 sslVerifyPeers_ = enabled; |
9ce5c89328f5
New configuration options to enable HTTP peers identification through certificates
Alain Mazy <alain@mazy.be>
parents:
4152
diff
changeset
|
1313 #endif |
9ce5c89328f5
New configuration options to enable HTTP peers identification through certificates
Alain Mazy <alain@mazy.be>
parents:
4152
diff
changeset
|
1314 } |
1115
da56a7916e8a
Experimental "KeepAlive" configuration option to enable HTTP Keep-Alive
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1113
diff
changeset
|
1315 |
3138
ab46e537f92e
renamed class MongooseServer as HttpServer, CivetWeb made default HTTP server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3137
diff
changeset
|
1316 void HttpServer::SetKeepAliveEnabled(bool enabled) |
1115
da56a7916e8a
Experimental "KeepAlive" configuration option to enable HTTP Keep-Alive
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1113
diff
changeset
|
1317 { |
da56a7916e8a
Experimental "KeepAlive" configuration option to enable HTTP Keep-Alive
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1113
diff
changeset
|
1318 Stop(); |
da56a7916e8a
Experimental "KeepAlive" configuration option to enable HTTP Keep-Alive
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1113
diff
changeset
|
1319 keepAlive_ = enabled; |
2069
fabf7820d1f1
New configuration options: "DicomScuTimeout" and "DicomScpTimeout" + validation of non-negative options
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1977
diff
changeset
|
1320 LOG(INFO) << "HTTP keep alive is " << (enabled ? "enabled" : "disabled"); |
3137
5a3b961e9524
New configuration option: 'TcpNoDelay' to disable Nagle's algorithm in HTTP server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3136
diff
changeset
|
1321 |
5a3b961e9524
New configuration option: 'TcpNoDelay' to disable Nagle's algorithm in HTTP server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3136
diff
changeset
|
1322 #if ORTHANC_ENABLE_MONGOOSE == 1 |
5a3b961e9524
New configuration option: 'TcpNoDelay' to disable Nagle's algorithm in HTTP server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3136
diff
changeset
|
1323 if (enabled) |
5a3b961e9524
New configuration option: 'TcpNoDelay' to disable Nagle's algorithm in HTTP server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3136
diff
changeset
|
1324 { |
5a3b961e9524
New configuration option: 'TcpNoDelay' to disable Nagle's algorithm in HTTP server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3136
diff
changeset
|
1325 LOG(WARNING) << "You should disable HTTP keep alive, as you are using Mongoose"; |
5a3b961e9524
New configuration option: 'TcpNoDelay' to disable Nagle's algorithm in HTTP server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3136
diff
changeset
|
1326 } |
5a3b961e9524
New configuration option: 'TcpNoDelay' to disable Nagle's algorithm in HTTP server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3136
diff
changeset
|
1327 #endif |
1115
da56a7916e8a
Experimental "KeepAlive" configuration option to enable HTTP Keep-Alive
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1113
diff
changeset
|
1328 } |
da56a7916e8a
Experimental "KeepAlive" configuration option to enable HTTP Keep-Alive
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1113
diff
changeset
|
1329 |
da56a7916e8a
Experimental "KeepAlive" configuration option to enable HTTP Keep-Alive
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1113
diff
changeset
|
1330 |
3138
ab46e537f92e
renamed class MongooseServer as HttpServer, CivetWeb made default HTTP server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3137
diff
changeset
|
1331 void HttpServer::SetAuthenticationEnabled(bool enabled) |
25
dd1489098265
basic http authentication
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
24
diff
changeset
|
1332 { |
dd1489098265
basic http authentication
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
24
diff
changeset
|
1333 Stop(); |
dd1489098265
basic http authentication
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
24
diff
changeset
|
1334 authentication_ = enabled; |
dd1489098265
basic http authentication
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
24
diff
changeset
|
1335 } |
dd1489098265
basic http authentication
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
24
diff
changeset
|
1336 |
3138
ab46e537f92e
renamed class MongooseServer as HttpServer, CivetWeb made default HTTP server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3137
diff
changeset
|
1337 void HttpServer::SetSslCertificate(const char* path) |
23 | 1338 { |
1339 Stop(); | |
1340 certificate_ = path; | |
1341 } | |
25
dd1489098265
basic http authentication
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
24
diff
changeset
|
1342 |
4190
9ce5c89328f5
New configuration options to enable HTTP peers identification through certificates
Alain Mazy <alain@mazy.be>
parents:
4152
diff
changeset
|
1343 void HttpServer::SetSslTrustedClientCertificates(const char* path) |
9ce5c89328f5
New configuration options to enable HTTP peers identification through certificates
Alain Mazy <alain@mazy.be>
parents:
4152
diff
changeset
|
1344 { |
9ce5c89328f5
New configuration options to enable HTTP peers identification through certificates
Alain Mazy <alain@mazy.be>
parents:
4152
diff
changeset
|
1345 Stop(); |
9ce5c89328f5
New configuration options to enable HTTP peers identification through certificates
Alain Mazy <alain@mazy.be>
parents:
4152
diff
changeset
|
1346 trustedClientCertificates_ = path; |
9ce5c89328f5
New configuration options to enable HTTP peers identification through certificates
Alain Mazy <alain@mazy.be>
parents:
4152
diff
changeset
|
1347 } |
9ce5c89328f5
New configuration options to enable HTTP peers identification through certificates
Alain Mazy <alain@mazy.be>
parents:
4152
diff
changeset
|
1348 |
3138
ab46e537f92e
renamed class MongooseServer as HttpServer, CivetWeb made default HTTP server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3137
diff
changeset
|
1349 void HttpServer::SetRemoteAccessAllowed(bool allowed) |
34
96e57b863dd9
option to disallow remote access
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
25
diff
changeset
|
1350 { |
96e57b863dd9
option to disallow remote access
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
25
diff
changeset
|
1351 Stop(); |
96e57b863dd9
option to disallow remote access
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
25
diff
changeset
|
1352 remoteAllowed_ = allowed; |
96e57b863dd9
option to disallow remote access
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
25
diff
changeset
|
1353 } |
96e57b863dd9
option to disallow remote access
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
25
diff
changeset
|
1354 |
3138
ab46e537f92e
renamed class MongooseServer as HttpServer, CivetWeb made default HTTP server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3137
diff
changeset
|
1355 void HttpServer::SetHttpCompressionEnabled(bool enabled) |
1517 | 1356 { |
1357 Stop(); | |
1358 httpCompression_ = enabled; | |
1518 | 1359 LOG(WARNING) << "HTTP compression is " << (enabled ? "enabled" : "disabled"); |
1517 | 1360 } |
1592
d73124f6b439
configuration option HttpDescribeErrors
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1582
diff
changeset
|
1361 |
3138
ab46e537f92e
renamed class MongooseServer as HttpServer, CivetWeb made default HTTP server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3137
diff
changeset
|
1362 void HttpServer::SetIncomingHttpRequestFilter(IIncomingHttpRequestFilter& filter) |
409
63f707278fc8
lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
398
diff
changeset
|
1363 { |
63f707278fc8
lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
398
diff
changeset
|
1364 Stop(); |
63f707278fc8
lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
398
diff
changeset
|
1365 filter_ = &filter; |
63f707278fc8
lua filtering of incoming http requests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
398
diff
changeset
|
1366 } |
34
96e57b863dd9
option to disallow remote access
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
25
diff
changeset
|
1367 |
1645
1558b3226b18
IHttpExceptionFormatter
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1644
diff
changeset
|
1368 |
3138
ab46e537f92e
renamed class MongooseServer as HttpServer, CivetWeb made default HTTP server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3137
diff
changeset
|
1369 void HttpServer::SetHttpExceptionFormatter(IHttpExceptionFormatter& formatter) |
1645
1558b3226b18
IHttpExceptionFormatter
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1644
diff
changeset
|
1370 { |
1558b3226b18
IHttpExceptionFormatter
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1644
diff
changeset
|
1371 Stop(); |
1558b3226b18
IHttpExceptionFormatter
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1644
diff
changeset
|
1372 exceptionFormatter_ = &formatter; |
1558b3226b18
IHttpExceptionFormatter
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1644
diff
changeset
|
1373 } |
1558b3226b18
IHttpExceptionFormatter
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1644
diff
changeset
|
1374 |
1558b3226b18
IHttpExceptionFormatter
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1644
diff
changeset
|
1375 |
3138
ab46e537f92e
renamed class MongooseServer as HttpServer, CivetWeb made default HTTP server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3137
diff
changeset
|
1376 bool HttpServer::IsValidBasicHttpAuthentication(const std::string& basic) const |
25
dd1489098265
basic http authentication
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
24
diff
changeset
|
1377 { |
dd1489098265
basic http authentication
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
24
diff
changeset
|
1378 return registeredUsers_.find(basic) != registeredUsers_.end(); |
dd1489098265
basic http authentication
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
24
diff
changeset
|
1379 } |
1443
895ab369d63c
refactoring: OrthancHttpHandler
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1441
diff
changeset
|
1380 |
895ab369d63c
refactoring: OrthancHttpHandler
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1441
diff
changeset
|
1381 |
3138
ab46e537f92e
renamed class MongooseServer as HttpServer, CivetWeb made default HTTP server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3137
diff
changeset
|
1382 void HttpServer::Register(IHttpHandler& handler) |
1443
895ab369d63c
refactoring: OrthancHttpHandler
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1441
diff
changeset
|
1383 { |
895ab369d63c
refactoring: OrthancHttpHandler
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1441
diff
changeset
|
1384 Stop(); |
895ab369d63c
refactoring: OrthancHttpHandler
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1441
diff
changeset
|
1385 handler_ = &handler; |
895ab369d63c
refactoring: OrthancHttpHandler
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1441
diff
changeset
|
1386 } |
895ab369d63c
refactoring: OrthancHttpHandler
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1441
diff
changeset
|
1387 |
895ab369d63c
refactoring: OrthancHttpHandler
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1441
diff
changeset
|
1388 |
3138
ab46e537f92e
renamed class MongooseServer as HttpServer, CivetWeb made default HTTP server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3137
diff
changeset
|
1389 IHttpHandler& HttpServer::GetHandler() const |
1443
895ab369d63c
refactoring: OrthancHttpHandler
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1441
diff
changeset
|
1390 { |
895ab369d63c
refactoring: OrthancHttpHandler
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1441
diff
changeset
|
1391 if (handler_ == NULL) |
895ab369d63c
refactoring: OrthancHttpHandler
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1441
diff
changeset
|
1392 { |
895ab369d63c
refactoring: OrthancHttpHandler
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1441
diff
changeset
|
1393 throw OrthancException(ErrorCode_InternalError); |
895ab369d63c
refactoring: OrthancHttpHandler
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1441
diff
changeset
|
1394 } |
895ab369d63c
refactoring: OrthancHttpHandler
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1441
diff
changeset
|
1395 |
895ab369d63c
refactoring: OrthancHttpHandler
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1441
diff
changeset
|
1396 return *handler_; |
895ab369d63c
refactoring: OrthancHttpHandler
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1441
diff
changeset
|
1397 } |
2903
1153b1a128fe
MongooseServer::SetThreadsCount()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2895
diff
changeset
|
1398 |
1153b1a128fe
MongooseServer::SetThreadsCount()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2895
diff
changeset
|
1399 |
3138
ab46e537f92e
renamed class MongooseServer as HttpServer, CivetWeb made default HTTP server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3137
diff
changeset
|
1400 void HttpServer::SetThreadsCount(unsigned int threads) |
2903
1153b1a128fe
MongooseServer::SetThreadsCount()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2895
diff
changeset
|
1401 { |
4201 | 1402 if (threads == 0) |
2903
1153b1a128fe
MongooseServer::SetThreadsCount()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2895
diff
changeset
|
1403 { |
1153b1a128fe
MongooseServer::SetThreadsCount()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2895
diff
changeset
|
1404 throw OrthancException(ErrorCode_ParameterOutOfRange); |
1153b1a128fe
MongooseServer::SetThreadsCount()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2895
diff
changeset
|
1405 } |
1153b1a128fe
MongooseServer::SetThreadsCount()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2895
diff
changeset
|
1406 |
1153b1a128fe
MongooseServer::SetThreadsCount()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2895
diff
changeset
|
1407 Stop(); |
1153b1a128fe
MongooseServer::SetThreadsCount()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2895
diff
changeset
|
1408 threadsCount_ = threads; |
3180
07a2f637b76d
new option: "HttpThreadsCount" to set the number of threads in the embedded HTTP server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3178
diff
changeset
|
1409 |
07a2f637b76d
new option: "HttpThreadsCount" to set the number of threads in the embedded HTTP server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3178
diff
changeset
|
1410 LOG(INFO) << "The embedded HTTP server will use " << threads << " threads"; |
2903
1153b1a128fe
MongooseServer::SetThreadsCount()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2895
diff
changeset
|
1411 } |
3137
5a3b961e9524
New configuration option: 'TcpNoDelay' to disable Nagle's algorithm in HTTP server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3136
diff
changeset
|
1412 |
3537
9cc09f4c0fa9
New configuration option: "HttpRequestTimeout"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3445
diff
changeset
|
1413 |
3138
ab46e537f92e
renamed class MongooseServer as HttpServer, CivetWeb made default HTTP server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3137
diff
changeset
|
1414 void HttpServer::SetTcpNoDelay(bool tcpNoDelay) |
3137
5a3b961e9524
New configuration option: 'TcpNoDelay' to disable Nagle's algorithm in HTTP server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3136
diff
changeset
|
1415 { |
5a3b961e9524
New configuration option: 'TcpNoDelay' to disable Nagle's algorithm in HTTP server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3136
diff
changeset
|
1416 Stop(); |
5a3b961e9524
New configuration option: 'TcpNoDelay' to disable Nagle's algorithm in HTTP server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3136
diff
changeset
|
1417 tcpNoDelay_ = tcpNoDelay; |
5a3b961e9524
New configuration option: 'TcpNoDelay' to disable Nagle's algorithm in HTTP server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3136
diff
changeset
|
1418 LOG(INFO) << "TCP_NODELAY for the HTTP sockets is set to " |
5a3b961e9524
New configuration option: 'TcpNoDelay' to disable Nagle's algorithm in HTTP server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3136
diff
changeset
|
1419 << (tcpNoDelay ? "true" : "false"); |
5a3b961e9524
New configuration option: 'TcpNoDelay' to disable Nagle's algorithm in HTTP server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3136
diff
changeset
|
1420 } |
3537
9cc09f4c0fa9
New configuration option: "HttpRequestTimeout"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3445
diff
changeset
|
1421 |
9cc09f4c0fa9
New configuration option: "HttpRequestTimeout"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3445
diff
changeset
|
1422 |
9cc09f4c0fa9
New configuration option: "HttpRequestTimeout"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3445
diff
changeset
|
1423 void HttpServer::SetRequestTimeout(unsigned int seconds) |
9cc09f4c0fa9
New configuration option: "HttpRequestTimeout"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3445
diff
changeset
|
1424 { |
4201 | 1425 if (seconds == 0) |
3537
9cc09f4c0fa9
New configuration option: "HttpRequestTimeout"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3445
diff
changeset
|
1426 { |
9cc09f4c0fa9
New configuration option: "HttpRequestTimeout"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3445
diff
changeset
|
1427 throw OrthancException(ErrorCode_ParameterOutOfRange, |
9cc09f4c0fa9
New configuration option: "HttpRequestTimeout"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3445
diff
changeset
|
1428 "Request timeout must be a stricly positive integer"); |
9cc09f4c0fa9
New configuration option: "HttpRequestTimeout"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3445
diff
changeset
|
1429 } |
9cc09f4c0fa9
New configuration option: "HttpRequestTimeout"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3445
diff
changeset
|
1430 |
9cc09f4c0fa9
New configuration option: "HttpRequestTimeout"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3445
diff
changeset
|
1431 Stop(); |
9cc09f4c0fa9
New configuration option: "HttpRequestTimeout"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3445
diff
changeset
|
1432 requestTimeout_ = seconds; |
9cc09f4c0fa9
New configuration option: "HttpRequestTimeout"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3445
diff
changeset
|
1433 LOG(INFO) << "Request timeout in the HTTP server is set to " << seconds << " seconds"; |
9cc09f4c0fa9
New configuration option: "HttpRequestTimeout"
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3445
diff
changeset
|
1434 } |
4226
7bd5eab3ba25
prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4201
diff
changeset
|
1435 |
7bd5eab3ba25
prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4201
diff
changeset
|
1436 |
7bd5eab3ba25
prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4201
diff
changeset
|
1437 #if ORTHANC_ENABLE_PUGIXML == 1 |
7bd5eab3ba25
prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4201
diff
changeset
|
1438 void HttpServer::Register(const std::vector<std::string>& root, |
7bd5eab3ba25
prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4201
diff
changeset
|
1439 IWebDavBucket* bucket) |
7bd5eab3ba25
prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4201
diff
changeset
|
1440 { |
7bd5eab3ba25
prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4201
diff
changeset
|
1441 std::unique_ptr<IWebDavBucket> protection(bucket); |
7bd5eab3ba25
prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4201
diff
changeset
|
1442 |
7bd5eab3ba25
prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4201
diff
changeset
|
1443 if (bucket == NULL) |
7bd5eab3ba25
prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4201
diff
changeset
|
1444 { |
7bd5eab3ba25
prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4201
diff
changeset
|
1445 throw OrthancException(ErrorCode_NullPointer); |
7bd5eab3ba25
prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4201
diff
changeset
|
1446 } |
7bd5eab3ba25
prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4201
diff
changeset
|
1447 |
7bd5eab3ba25
prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4201
diff
changeset
|
1448 std::string s = "/"; |
7bd5eab3ba25
prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4201
diff
changeset
|
1449 for (size_t i = 0; i < root.size(); i++) |
7bd5eab3ba25
prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4201
diff
changeset
|
1450 { |
7bd5eab3ba25
prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4201
diff
changeset
|
1451 if (root[i].empty()) |
7bd5eab3ba25
prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4201
diff
changeset
|
1452 { |
7bd5eab3ba25
prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4201
diff
changeset
|
1453 throw OrthancException(ErrorCode_ParameterOutOfRange, "An URI component cannot be empty"); |
7bd5eab3ba25
prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4201
diff
changeset
|
1454 } |
7bd5eab3ba25
prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4201
diff
changeset
|
1455 |
7bd5eab3ba25
prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4201
diff
changeset
|
1456 s += root[i]; |
7bd5eab3ba25
prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4201
diff
changeset
|
1457 } |
7bd5eab3ba25
prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4201
diff
changeset
|
1458 |
7bd5eab3ba25
prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4201
diff
changeset
|
1459 if (webDavBuckets_.find(s) != webDavBuckets_.end()) |
7bd5eab3ba25
prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4201
diff
changeset
|
1460 { |
7bd5eab3ba25
prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4201
diff
changeset
|
1461 throw OrthancException(ErrorCode_ParameterOutOfRange, |
7bd5eab3ba25
prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4201
diff
changeset
|
1462 "Cannot register two WebDAV buckets at the same root: " + s); |
7bd5eab3ba25
prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4201
diff
changeset
|
1463 } |
7bd5eab3ba25
prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4201
diff
changeset
|
1464 else |
7bd5eab3ba25
prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4201
diff
changeset
|
1465 { |
7bd5eab3ba25
prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4201
diff
changeset
|
1466 webDavBuckets_[s] = protection.release(); |
7bd5eab3ba25
prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4201
diff
changeset
|
1467 } |
7bd5eab3ba25
prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4201
diff
changeset
|
1468 } |
7bd5eab3ba25
prototyping IWebDavBucket
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4201
diff
changeset
|
1469 #endif |
0 | 1470 } |