Mercurial > hg > orthanc
annotate Core/RestApi/RestApi.cpp @ 244:916d72e0a937 Orthanc-0.3.0
close
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Mon, 29 Apr 2013 12:54:58 +0200 |
parents | c07170f3f4f7 |
children | 5694365ecb96 |
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 | |
210
96b7918a6a18
start of the refactoring of the Orthanc REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
209
diff
changeset
|
35 #include <glog/logging.h> |
96b7918a6a18
start of the refactoring of the Orthanc REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
209
diff
changeset
|
36 |
209 | 37 namespace Orthanc |
38 { | |
39 bool RestApi::IsGetAccepted(const UriComponents& uri) | |
40 { | |
41 for (GetHandlers::const_iterator it = getHandlers_.begin(); | |
42 it != getHandlers_.end(); it++) | |
43 { | |
44 if (it->first->Match(uri)) | |
45 { | |
46 return true; | |
47 } | |
48 } | |
49 | |
50 return false; | |
51 } | |
52 | |
53 bool RestApi::IsPutAccepted(const UriComponents& uri) | |
54 { | |
55 for (PutHandlers::const_iterator it = putHandlers_.begin(); | |
56 it != putHandlers_.end(); it++) | |
57 { | |
58 if (it->first->Match(uri)) | |
59 { | |
60 return true; | |
61 } | |
62 } | |
63 | |
64 return false; | |
65 } | |
66 | |
67 bool RestApi::IsPostAccepted(const UriComponents& uri) | |
68 { | |
69 for (PostHandlers::const_iterator it = postHandlers_.begin(); | |
70 it != postHandlers_.end(); it++) | |
71 { | |
72 if (it->first->Match(uri)) | |
73 { | |
74 return true; | |
75 } | |
76 } | |
77 | |
78 return false; | |
79 } | |
80 | |
81 bool RestApi::IsDeleteAccepted(const UriComponents& uri) | |
82 { | |
83 for (DeleteHandlers::const_iterator it = deleteHandlers_.begin(); | |
84 it != deleteHandlers_.end(); it++) | |
85 { | |
86 if (it->first->Match(uri)) | |
87 { | |
88 return true; | |
89 } | |
90 } | |
91 | |
92 return false; | |
93 } | |
94 | |
95 static void AddMethod(std::string& target, | |
96 const std::string& method) | |
97 { | |
98 if (target.size() > 0) | |
99 target += "," + method; | |
100 else | |
101 target = method; | |
102 } | |
103 | |
104 std::string RestApi::GetAcceptedMethods(const UriComponents& uri) | |
105 { | |
106 std::string s; | |
107 | |
108 if (IsGetAccepted(uri)) | |
109 AddMethod(s, "GET"); | |
110 | |
111 if (IsPutAccepted(uri)) | |
112 AddMethod(s, "PUT"); | |
113 | |
114 if (IsPostAccepted(uri)) | |
115 AddMethod(s, "POST"); | |
116 | |
117 if (IsDeleteAccepted(uri)) | |
118 AddMethod(s, "DELETE"); | |
119 | |
120 return s; | |
121 } | |
122 | |
123 RestApi::~RestApi() | |
124 { | |
125 for (GetHandlers::iterator it = getHandlers_.begin(); | |
126 it != getHandlers_.end(); it++) | |
127 { | |
128 delete it->first; | |
129 } | |
130 | |
131 for (PutHandlers::iterator it = putHandlers_.begin(); | |
132 it != putHandlers_.end(); it++) | |
133 { | |
134 delete it->first; | |
135 } | |
136 | |
137 for (PostHandlers::iterator it = postHandlers_.begin(); | |
138 it != postHandlers_.end(); it++) | |
139 { | |
140 delete it->first; | |
141 } | |
142 | |
143 for (DeleteHandlers::iterator it = deleteHandlers_.begin(); | |
144 it != deleteHandlers_.end(); it++) | |
145 { | |
146 delete it->first; | |
147 } | |
148 } | |
149 | |
150 bool RestApi::IsServedUri(const UriComponents& uri) | |
151 { | |
152 return (IsGetAccepted(uri) || | |
153 IsPutAccepted(uri) || | |
154 IsPostAccepted(uri) || | |
155 IsDeleteAccepted(uri)); | |
156 } | |
157 | |
158 void RestApi::Handle(HttpOutput& output, | |
159 const std::string& method, | |
160 const UriComponents& uri, | |
161 const Arguments& headers, | |
162 const Arguments& getArguments, | |
163 const std::string& postData) | |
164 { | |
165 bool ok = false; | |
166 RestApiOutput restOutput(output); | |
167 RestApiPath::Components components; | |
168 UriComponents trailing; | |
210
96b7918a6a18
start of the refactoring of the Orthanc REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
209
diff
changeset
|
169 |
209 | 170 if (method == "GET") |
171 { | |
172 for (GetHandlers::const_iterator it = getHandlers_.begin(); | |
173 it != getHandlers_.end(); it++) | |
174 { | |
175 if (it->first->Match(components, trailing, uri)) | |
176 { | |
210
96b7918a6a18
start of the refactoring of the Orthanc REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
209
diff
changeset
|
177 LOG(INFO) << "REST GET call on: " << Toolbox::FlattenUri(uri); |
209 | 178 ok = true; |
179 GetCall call; | |
180 call.output_ = &restOutput; | |
210
96b7918a6a18
start of the refactoring of the Orthanc REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
209
diff
changeset
|
181 call.context_ = this; |
209 | 182 call.httpHeaders_ = &headers; |
183 call.uriComponents_ = &components; | |
184 call.trailing_ = &trailing; | |
215
c07170f3f4f7
refactoring of access to images in REST
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
210
diff
changeset
|
185 call.fullUri_ = &uri; |
c07170f3f4f7
refactoring of access to images in REST
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
210
diff
changeset
|
186 |
209 | 187 call.getArguments_ = &getArguments; |
188 it->second(call); | |
189 } | |
190 } | |
191 } | |
192 else if (method == "PUT") | |
193 { | |
194 for (PutHandlers::const_iterator it = putHandlers_.begin(); | |
195 it != putHandlers_.end(); it++) | |
196 { | |
197 if (it->first->Match(components, trailing, uri)) | |
198 { | |
210
96b7918a6a18
start of the refactoring of the Orthanc REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
209
diff
changeset
|
199 LOG(INFO) << "REST PUT call on: " << Toolbox::FlattenUri(uri); |
209 | 200 ok = true; |
201 PutCall call; | |
202 call.output_ = &restOutput; | |
210
96b7918a6a18
start of the refactoring of the Orthanc REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
209
diff
changeset
|
203 call.context_ = this; |
209 | 204 call.httpHeaders_ = &headers; |
205 call.uriComponents_ = &components; | |
206 call.trailing_ = &trailing; | |
215
c07170f3f4f7
refactoring of access to images in REST
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
210
diff
changeset
|
207 call.fullUri_ = &uri; |
209 | 208 |
209 call.data_ = &postData; | |
210 it->second(call); | |
211 } | |
212 } | |
213 } | |
214 else if (method == "POST") | |
215 { | |
216 for (PostHandlers::const_iterator it = postHandlers_.begin(); | |
217 it != postHandlers_.end(); it++) | |
218 { | |
219 if (it->first->Match(components, trailing, uri)) | |
220 { | |
210
96b7918a6a18
start of the refactoring of the Orthanc REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
209
diff
changeset
|
221 LOG(INFO) << "REST POST call on: " << Toolbox::FlattenUri(uri); |
209 | 222 ok = true; |
223 PostCall call; | |
224 call.output_ = &restOutput; | |
210
96b7918a6a18
start of the refactoring of the Orthanc REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
209
diff
changeset
|
225 call.context_ = this; |
209 | 226 call.httpHeaders_ = &headers; |
227 call.uriComponents_ = &components; | |
228 call.trailing_ = &trailing; | |
215
c07170f3f4f7
refactoring of access to images in REST
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
210
diff
changeset
|
229 call.fullUri_ = &uri; |
209 | 230 |
231 call.data_ = &postData; | |
232 it->second(call); | |
233 } | |
234 } | |
235 } | |
236 else if (method == "DELETE") | |
237 { | |
238 for (DeleteHandlers::const_iterator it = deleteHandlers_.begin(); | |
239 it != deleteHandlers_.end(); it++) | |
240 { | |
241 if (it->first->Match(components, trailing, uri)) | |
242 { | |
210
96b7918a6a18
start of the refactoring of the Orthanc REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
209
diff
changeset
|
243 LOG(INFO) << "REST DELETE call on: " << Toolbox::FlattenUri(uri); |
209 | 244 ok = true; |
245 DeleteCall call; | |
246 call.output_ = &restOutput; | |
210
96b7918a6a18
start of the refactoring of the Orthanc REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
209
diff
changeset
|
247 call.context_ = this; |
209 | 248 call.httpHeaders_ = &headers; |
249 call.uriComponents_ = &components; | |
250 call.trailing_ = &trailing; | |
215
c07170f3f4f7
refactoring of access to images in REST
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
210
diff
changeset
|
251 call.fullUri_ = &uri; |
209 | 252 it->second(call); |
253 } | |
254 } | |
255 } | |
256 | |
257 if (!ok) | |
258 { | |
210
96b7918a6a18
start of the refactoring of the Orthanc REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
209
diff
changeset
|
259 LOG(INFO) << "REST method " << method << " not allowed on: " << Toolbox::FlattenUri(uri); |
209 | 260 output.SendMethodNotAllowedError(GetAcceptedMethods(uri)); |
261 } | |
262 } | |
263 | |
264 void RestApi::Register(const std::string& path, | |
265 GetHandler handler) | |
266 { | |
267 getHandlers_.push_back(std::make_pair(new RestApiPath(path), handler)); | |
268 } | |
269 | |
270 void RestApi::Register(const std::string& path, | |
271 PutHandler handler) | |
272 { | |
273 putHandlers_.push_back(std::make_pair(new RestApiPath(path), handler)); | |
274 } | |
275 | |
276 void RestApi::Register(const std::string& path, | |
277 PostHandler handler) | |
278 { | |
279 postHandlers_.push_back(std::make_pair(new RestApiPath(path), handler)); | |
280 } | |
281 | |
282 void RestApi::Register(const std::string& path, | |
283 DeleteHandler handler) | |
284 { | |
285 deleteHandlers_.push_back(std::make_pair(new RestApiPath(path), handler)); | |
286 } | |
287 } |