Mercurial > hg > orthanc
annotate Core/RestApi/RestApi.cpp @ 210:96b7918a6a18
start of the refactoring of the Orthanc REST API
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Wed, 28 Nov 2012 18:03:44 +0100 |
parents | 9960642f0f45 |
children | c07170f3f4f7 |
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; | |
185 | |
186 call.getArguments_ = &getArguments; | |
187 it->second(call); | |
188 } | |
189 } | |
190 } | |
191 else if (method == "PUT") | |
192 { | |
193 for (PutHandlers::const_iterator it = putHandlers_.begin(); | |
194 it != putHandlers_.end(); it++) | |
195 { | |
196 if (it->first->Match(components, trailing, uri)) | |
197 { | |
210
96b7918a6a18
start of the refactoring of the Orthanc REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
209
diff
changeset
|
198 LOG(INFO) << "REST PUT call on: " << Toolbox::FlattenUri(uri); |
209 | 199 ok = true; |
200 PutCall call; | |
201 call.output_ = &restOutput; | |
210
96b7918a6a18
start of the refactoring of the Orthanc REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
209
diff
changeset
|
202 call.context_ = this; |
209 | 203 call.httpHeaders_ = &headers; |
204 call.uriComponents_ = &components; | |
205 call.trailing_ = &trailing; | |
206 | |
207 call.data_ = &postData; | |
208 it->second(call); | |
209 } | |
210 } | |
211 } | |
212 else if (method == "POST") | |
213 { | |
214 for (PostHandlers::const_iterator it = postHandlers_.begin(); | |
215 it != postHandlers_.end(); it++) | |
216 { | |
217 if (it->first->Match(components, trailing, uri)) | |
218 { | |
210
96b7918a6a18
start of the refactoring of the Orthanc REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
209
diff
changeset
|
219 LOG(INFO) << "REST POST call on: " << Toolbox::FlattenUri(uri); |
209 | 220 ok = true; |
221 PostCall call; | |
222 call.output_ = &restOutput; | |
210
96b7918a6a18
start of the refactoring of the Orthanc REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
209
diff
changeset
|
223 call.context_ = this; |
209 | 224 call.httpHeaders_ = &headers; |
225 call.uriComponents_ = &components; | |
226 call.trailing_ = &trailing; | |
227 | |
228 call.data_ = &postData; | |
229 it->second(call); | |
230 } | |
231 } | |
232 } | |
233 else if (method == "DELETE") | |
234 { | |
235 for (DeleteHandlers::const_iterator it = deleteHandlers_.begin(); | |
236 it != deleteHandlers_.end(); it++) | |
237 { | |
238 if (it->first->Match(components, trailing, uri)) | |
239 { | |
210
96b7918a6a18
start of the refactoring of the Orthanc REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
209
diff
changeset
|
240 LOG(INFO) << "REST DELETE call on: " << Toolbox::FlattenUri(uri); |
209 | 241 ok = true; |
242 DeleteCall call; | |
243 call.output_ = &restOutput; | |
210
96b7918a6a18
start of the refactoring of the Orthanc REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
209
diff
changeset
|
244 call.context_ = this; |
209 | 245 call.httpHeaders_ = &headers; |
246 call.uriComponents_ = &components; | |
247 call.trailing_ = &trailing; | |
248 it->second(call); | |
249 } | |
250 } | |
251 } | |
252 | |
253 if (!ok) | |
254 { | |
210
96b7918a6a18
start of the refactoring of the Orthanc REST API
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
209
diff
changeset
|
255 LOG(INFO) << "REST method " << method << " not allowed on: " << Toolbox::FlattenUri(uri); |
209 | 256 output.SendMethodNotAllowedError(GetAcceptedMethods(uri)); |
257 } | |
258 } | |
259 | |
260 void RestApi::Register(const std::string& path, | |
261 GetHandler handler) | |
262 { | |
263 getHandlers_.push_back(std::make_pair(new RestApiPath(path), handler)); | |
264 } | |
265 | |
266 void RestApi::Register(const std::string& path, | |
267 PutHandler handler) | |
268 { | |
269 putHandlers_.push_back(std::make_pair(new RestApiPath(path), handler)); | |
270 } | |
271 | |
272 void RestApi::Register(const std::string& path, | |
273 PostHandler handler) | |
274 { | |
275 postHandlers_.push_back(std::make_pair(new RestApiPath(path), handler)); | |
276 } | |
277 | |
278 void RestApi::Register(const std::string& path, | |
279 DeleteHandler handler) | |
280 { | |
281 deleteHandlers_.push_back(std::make_pair(new RestApiPath(path), handler)); | |
282 } | |
283 } |