Mercurial > hg > orthanc
annotate Core/RestApi/RestApi.cpp @ 288:40d3bf6cc8d9
logs
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Fri, 14 Dec 2012 11:22:04 +0100 |
parents | 5694365ecb96 |
children | 4eea080e6e7a |
rev | line source |
---|---|
209 | 1 /** |
2 * Orthanc - A Lightweight, RESTful DICOM Store | |
3 * Copyright (C) 2012 Medical Physics Department, CHU of Liege, | |
4 * Belgium | |
5 * | |
6 * This program is free software: you can redistribute it and/or | |
7 * modify it under the terms of the GNU General Public License as | |
8 * published by the Free Software Foundation, either version 3 of the | |
9 * License, or (at your option) any later version. | |
10 * | |
11 * In addition, as a special exception, the copyright holders of this | |
12 * program give permission to link the code of its release with the | |
13 * OpenSSL project's "OpenSSL" library (or with modified versions of it | |
14 * that use the same license as the "OpenSSL" library), and distribute | |
15 * the linked executables. You must obey the GNU General Public License | |
16 * in all respects for all of the code used other than "OpenSSL". If you | |
17 * modify file(s) with this exception, you may extend this exception to | |
18 * your version of the file(s), but you are not obligated to do so. If | |
19 * you do not wish to do so, delete this exception statement from your | |
20 * version. If you delete this exception statement from all source files | |
21 * in the program, then also delete it here. | |
22 * | |
23 * This program is distributed in the hope that it will be useful, but | |
24 * WITHOUT ANY WARRANTY; without even the implied warranty of | |
25 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
26 * General Public License for more details. | |
27 * | |
28 * You should have received a copy of the GNU General Public License | |
29 * along with this program. If not, see <http://www.gnu.org/licenses/>. | |
30 **/ | |
31 | |
32 | |
33 #include "RestApi.h" | |
34 | |
249 | 35 #include <stdlib.h> // To define "_exit()" under Windows |
210
96b7918a6a18
start of the refactoring of the Orthanc REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
209
diff
changeset
|
36 #include <glog/logging.h> |
96b7918a6a18
start of the refactoring of the Orthanc REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
209
diff
changeset
|
37 |
209 | 38 namespace Orthanc |
39 { | |
40 bool RestApi::IsGetAccepted(const UriComponents& uri) | |
41 { | |
42 for (GetHandlers::const_iterator it = getHandlers_.begin(); | |
43 it != getHandlers_.end(); it++) | |
44 { | |
45 if (it->first->Match(uri)) | |
46 { | |
47 return true; | |
48 } | |
49 } | |
50 | |
51 return false; | |
52 } | |
53 | |
54 bool RestApi::IsPutAccepted(const UriComponents& uri) | |
55 { | |
56 for (PutHandlers::const_iterator it = putHandlers_.begin(); | |
57 it != putHandlers_.end(); it++) | |
58 { | |
59 if (it->first->Match(uri)) | |
60 { | |
61 return true; | |
62 } | |
63 } | |
64 | |
65 return false; | |
66 } | |
67 | |
68 bool RestApi::IsPostAccepted(const UriComponents& uri) | |
69 { | |
70 for (PostHandlers::const_iterator it = postHandlers_.begin(); | |
71 it != postHandlers_.end(); it++) | |
72 { | |
73 if (it->first->Match(uri)) | |
74 { | |
75 return true; | |
76 } | |
77 } | |
78 | |
79 return false; | |
80 } | |
81 | |
82 bool RestApi::IsDeleteAccepted(const UriComponents& uri) | |
83 { | |
84 for (DeleteHandlers::const_iterator it = deleteHandlers_.begin(); | |
85 it != deleteHandlers_.end(); it++) | |
86 { | |
87 if (it->first->Match(uri)) | |
88 { | |
89 return true; | |
90 } | |
91 } | |
92 | |
93 return false; | |
94 } | |
95 | |
96 static void AddMethod(std::string& target, | |
97 const std::string& method) | |
98 { | |
99 if (target.size() > 0) | |
100 target += "," + method; | |
101 else | |
102 target = method; | |
103 } | |
104 | |
105 std::string RestApi::GetAcceptedMethods(const UriComponents& uri) | |
106 { | |
107 std::string s; | |
108 | |
109 if (IsGetAccepted(uri)) | |
110 AddMethod(s, "GET"); | |
111 | |
112 if (IsPutAccepted(uri)) | |
113 AddMethod(s, "PUT"); | |
114 | |
115 if (IsPostAccepted(uri)) | |
116 AddMethod(s, "POST"); | |
117 | |
118 if (IsDeleteAccepted(uri)) | |
119 AddMethod(s, "DELETE"); | |
120 | |
121 return s; | |
122 } | |
123 | |
124 RestApi::~RestApi() | |
125 { | |
126 for (GetHandlers::iterator it = getHandlers_.begin(); | |
127 it != getHandlers_.end(); it++) | |
128 { | |
129 delete it->first; | |
130 } | |
131 | |
132 for (PutHandlers::iterator it = putHandlers_.begin(); | |
133 it != putHandlers_.end(); it++) | |
134 { | |
135 delete it->first; | |
136 } | |
137 | |
138 for (PostHandlers::iterator it = postHandlers_.begin(); | |
139 it != postHandlers_.end(); it++) | |
140 { | |
141 delete it->first; | |
142 } | |
143 | |
144 for (DeleteHandlers::iterator it = deleteHandlers_.begin(); | |
145 it != deleteHandlers_.end(); it++) | |
146 { | |
147 delete it->first; | |
148 } | |
149 } | |
150 | |
151 bool RestApi::IsServedUri(const UriComponents& uri) | |
152 { | |
153 return (IsGetAccepted(uri) || | |
154 IsPutAccepted(uri) || | |
155 IsPostAccepted(uri) || | |
156 IsDeleteAccepted(uri)); | |
157 } | |
158 | |
159 void RestApi::Handle(HttpOutput& output, | |
160 const std::string& method, | |
161 const UriComponents& uri, | |
162 const Arguments& headers, | |
163 const Arguments& getArguments, | |
164 const std::string& postData) | |
165 { | |
166 bool ok = false; | |
167 RestApiOutput restOutput(output); | |
168 RestApiPath::Components components; | |
169 UriComponents trailing; | |
210
96b7918a6a18
start of the refactoring of the Orthanc REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
209
diff
changeset
|
170 |
209 | 171 if (method == "GET") |
172 { | |
173 for (GetHandlers::const_iterator it = getHandlers_.begin(); | |
174 it != getHandlers_.end(); it++) | |
175 { | |
176 if (it->first->Match(components, trailing, uri)) | |
177 { | |
210
96b7918a6a18
start of the refactoring of the Orthanc REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
209
diff
changeset
|
178 LOG(INFO) << "REST GET call on: " << Toolbox::FlattenUri(uri); |
209 | 179 ok = true; |
180 GetCall call; | |
181 call.output_ = &restOutput; | |
210
96b7918a6a18
start of the refactoring of the Orthanc REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
209
diff
changeset
|
182 call.context_ = this; |
209 | 183 call.httpHeaders_ = &headers; |
184 call.uriComponents_ = &components; | |
185 call.trailing_ = &trailing; | |
215
c07170f3f4f7
refactoring of access to images in REST
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
210
diff
changeset
|
186 call.fullUri_ = &uri; |
c07170f3f4f7
refactoring of access to images in REST
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
210
diff
changeset
|
187 |
209 | 188 call.getArguments_ = &getArguments; |
189 it->second(call); | |
190 } | |
191 } | |
192 } | |
193 else if (method == "PUT") | |
194 { | |
195 for (PutHandlers::const_iterator it = putHandlers_.begin(); | |
196 it != putHandlers_.end(); it++) | |
197 { | |
198 if (it->first->Match(components, trailing, uri)) | |
199 { | |
210
96b7918a6a18
start of the refactoring of the Orthanc REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
209
diff
changeset
|
200 LOG(INFO) << "REST PUT call on: " << Toolbox::FlattenUri(uri); |
209 | 201 ok = true; |
202 PutCall call; | |
203 call.output_ = &restOutput; | |
210
96b7918a6a18
start of the refactoring of the Orthanc REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
209
diff
changeset
|
204 call.context_ = this; |
209 | 205 call.httpHeaders_ = &headers; |
206 call.uriComponents_ = &components; | |
207 call.trailing_ = &trailing; | |
215
c07170f3f4f7
refactoring of access to images in REST
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
210
diff
changeset
|
208 call.fullUri_ = &uri; |
209 | 209 |
210 call.data_ = &postData; | |
211 it->second(call); | |
212 } | |
213 } | |
214 } | |
215 else if (method == "POST") | |
216 { | |
217 for (PostHandlers::const_iterator it = postHandlers_.begin(); | |
218 it != postHandlers_.end(); it++) | |
219 { | |
220 if (it->first->Match(components, trailing, uri)) | |
221 { | |
210
96b7918a6a18
start of the refactoring of the Orthanc REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
209
diff
changeset
|
222 LOG(INFO) << "REST POST call on: " << Toolbox::FlattenUri(uri); |
209 | 223 ok = true; |
224 PostCall call; | |
225 call.output_ = &restOutput; | |
210
96b7918a6a18
start of the refactoring of the Orthanc REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
209
diff
changeset
|
226 call.context_ = this; |
209 | 227 call.httpHeaders_ = &headers; |
228 call.uriComponents_ = &components; | |
229 call.trailing_ = &trailing; | |
215
c07170f3f4f7
refactoring of access to images in REST
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
210
diff
changeset
|
230 call.fullUri_ = &uri; |
209 | 231 |
232 call.data_ = &postData; | |
233 it->second(call); | |
234 } | |
235 } | |
236 } | |
237 else if (method == "DELETE") | |
238 { | |
239 for (DeleteHandlers::const_iterator it = deleteHandlers_.begin(); | |
240 it != deleteHandlers_.end(); it++) | |
241 { | |
242 if (it->first->Match(components, trailing, uri)) | |
243 { | |
210
96b7918a6a18
start of the refactoring of the Orthanc REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
209
diff
changeset
|
244 LOG(INFO) << "REST DELETE call on: " << Toolbox::FlattenUri(uri); |
209 | 245 ok = true; |
246 DeleteCall call; | |
247 call.output_ = &restOutput; | |
210
96b7918a6a18
start of the refactoring of the Orthanc REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
209
diff
changeset
|
248 call.context_ = this; |
209 | 249 call.httpHeaders_ = &headers; |
250 call.uriComponents_ = &components; | |
251 call.trailing_ = &trailing; | |
215
c07170f3f4f7
refactoring of access to images in REST
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
210
diff
changeset
|
252 call.fullUri_ = &uri; |
209 | 253 it->second(call); |
254 } | |
255 } | |
256 } | |
257 | |
258 if (!ok) | |
259 { | |
210
96b7918a6a18
start of the refactoring of the Orthanc REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
209
diff
changeset
|
260 LOG(INFO) << "REST method " << method << " not allowed on: " << Toolbox::FlattenUri(uri); |
209 | 261 output.SendMethodNotAllowedError(GetAcceptedMethods(uri)); |
262 } | |
263 } | |
264 | |
265 void RestApi::Register(const std::string& path, | |
266 GetHandler handler) | |
267 { | |
268 getHandlers_.push_back(std::make_pair(new RestApiPath(path), handler)); | |
269 } | |
270 | |
271 void RestApi::Register(const std::string& path, | |
272 PutHandler handler) | |
273 { | |
274 putHandlers_.push_back(std::make_pair(new RestApiPath(path), handler)); | |
275 } | |
276 | |
277 void RestApi::Register(const std::string& path, | |
278 PostHandler handler) | |
279 { | |
280 postHandlers_.push_back(std::make_pair(new RestApiPath(path), handler)); | |
281 } | |
282 | |
283 void RestApi::Register(const std::string& path, | |
284 DeleteHandler handler) | |
285 { | |
286 deleteHandlers_.push_back(std::make_pair(new RestApiPath(path), handler)); | |
287 } | |
288 } |