Mercurial > hg > orthanc
annotate UnitTestsSources/RestApiTests.cpp @ 968:8ed284e79850
RestApiHierarchy
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Fri, 27 Jun 2014 17:48:55 +0200 |
parents | dfc076546821 |
children | 3dce528b0cc2 |
rev | line source |
---|---|
827
3d6f9b7d0add
precompiled headers in unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
707
diff
changeset
|
1 /** |
3d6f9b7d0add
precompiled headers in unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
707
diff
changeset
|
2 * Orthanc - A Lightweight, RESTful DICOM Store |
3d6f9b7d0add
precompiled headers in unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
707
diff
changeset
|
3 * Copyright (C) 2012-2014 Medical Physics Department, CHU of Liege, |
3d6f9b7d0add
precompiled headers in unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
707
diff
changeset
|
4 * Belgium |
3d6f9b7d0add
precompiled headers in unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
707
diff
changeset
|
5 * |
3d6f9b7d0add
precompiled headers in unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
707
diff
changeset
|
6 * This program is free software: you can redistribute it and/or |
3d6f9b7d0add
precompiled headers in unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
707
diff
changeset
|
7 * modify it under the terms of the GNU General Public License as |
3d6f9b7d0add
precompiled headers in unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
707
diff
changeset
|
8 * published by the Free Software Foundation, either version 3 of the |
3d6f9b7d0add
precompiled headers in unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
707
diff
changeset
|
9 * License, or (at your option) any later version. |
3d6f9b7d0add
precompiled headers in unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
707
diff
changeset
|
10 * |
3d6f9b7d0add
precompiled headers in unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
707
diff
changeset
|
11 * In addition, as a special exception, the copyright holders of this |
3d6f9b7d0add
precompiled headers in unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
707
diff
changeset
|
12 * program give permission to link the code of its release with the |
3d6f9b7d0add
precompiled headers in unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
707
diff
changeset
|
13 * OpenSSL project's "OpenSSL" library (or with modified versions of it |
3d6f9b7d0add
precompiled headers in unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
707
diff
changeset
|
14 * that use the same license as the "OpenSSL" library), and distribute |
3d6f9b7d0add
precompiled headers in unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
707
diff
changeset
|
15 * the linked executables. You must obey the GNU General Public License |
3d6f9b7d0add
precompiled headers in unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
707
diff
changeset
|
16 * in all respects for all of the code used other than "OpenSSL". If you |
3d6f9b7d0add
precompiled headers in unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
707
diff
changeset
|
17 * modify file(s) with this exception, you may extend this exception to |
3d6f9b7d0add
precompiled headers in unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
707
diff
changeset
|
18 * your version of the file(s), but you are not obligated to do so. If |
3d6f9b7d0add
precompiled headers in unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
707
diff
changeset
|
19 * you do not wish to do so, delete this exception statement from your |
3d6f9b7d0add
precompiled headers in unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
707
diff
changeset
|
20 * version. If you delete this exception statement from all source files |
3d6f9b7d0add
precompiled headers in unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
707
diff
changeset
|
21 * in the program, then also delete it here. |
3d6f9b7d0add
precompiled headers in unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
707
diff
changeset
|
22 * |
3d6f9b7d0add
precompiled headers in unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
707
diff
changeset
|
23 * This program is distributed in the hope that it will be useful, but |
3d6f9b7d0add
precompiled headers in unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
707
diff
changeset
|
24 * WITHOUT ANY WARRANTY; without even the implied warranty of |
3d6f9b7d0add
precompiled headers in unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
707
diff
changeset
|
25 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
3d6f9b7d0add
precompiled headers in unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
707
diff
changeset
|
26 * General Public License for more details. |
3d6f9b7d0add
precompiled headers in unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
707
diff
changeset
|
27 * |
3d6f9b7d0add
precompiled headers in unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
707
diff
changeset
|
28 * You should have received a copy of the GNU General Public License |
3d6f9b7d0add
precompiled headers in unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
707
diff
changeset
|
29 * along with this program. If not, see <http://www.gnu.org/licenses/>. |
3d6f9b7d0add
precompiled headers in unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
707
diff
changeset
|
30 **/ |
3d6f9b7d0add
precompiled headers in unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
707
diff
changeset
|
31 |
3d6f9b7d0add
precompiled headers in unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
707
diff
changeset
|
32 |
831
84513f2ee1f3
pch for unit tests and server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
827
diff
changeset
|
33 #include "PrecompiledHeadersUnitTests.h" |
209 | 34 #include "gtest/gtest.h" |
35 | |
36 #include <ctype.h> | |
37 #include <glog/logging.h> | |
38 | |
707
203157cb4fde
unit tests of httpclient
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
632
diff
changeset
|
39 #include "../Core/ChunkedBuffer.h" |
203157cb4fde
unit tests of httpclient
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
632
diff
changeset
|
40 #include "../Core/HttpClient.h" |
209 | 41 #include "../Core/RestApi/RestApi.h" |
221
e7432706b354
accessors to storage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
210
diff
changeset
|
42 #include "../Core/Uuid.h" |
e7432706b354
accessors to storage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
210
diff
changeset
|
43 #include "../Core/OrthancException.h" |
e7432706b354
accessors to storage
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
210
diff
changeset
|
44 #include "../Core/Compression/ZlibCompressor.h" |
209 | 45 |
46 using namespace Orthanc; | |
47 | |
707
203157cb4fde
unit tests of httpclient
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
632
diff
changeset
|
48 #if !defined(UNIT_TESTS_WITH_HTTP_CONNEXIONS) |
203157cb4fde
unit tests of httpclient
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
632
diff
changeset
|
49 #error "Please set UNIT_TESTS_WITH_HTTP_CONNEXIONS" |
203157cb4fde
unit tests of httpclient
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
632
diff
changeset
|
50 #endif |
203157cb4fde
unit tests of httpclient
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
632
diff
changeset
|
51 |
203157cb4fde
unit tests of httpclient
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
632
diff
changeset
|
52 TEST(HttpClient, Basic) |
203157cb4fde
unit tests of httpclient
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
632
diff
changeset
|
53 { |
203157cb4fde
unit tests of httpclient
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
632
diff
changeset
|
54 HttpClient c; |
203157cb4fde
unit tests of httpclient
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
632
diff
changeset
|
55 ASSERT_FALSE(c.IsVerbose()); |
203157cb4fde
unit tests of httpclient
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
632
diff
changeset
|
56 c.SetVerbose(true); |
203157cb4fde
unit tests of httpclient
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
632
diff
changeset
|
57 ASSERT_TRUE(c.IsVerbose()); |
203157cb4fde
unit tests of httpclient
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
632
diff
changeset
|
58 c.SetVerbose(false); |
203157cb4fde
unit tests of httpclient
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
632
diff
changeset
|
59 ASSERT_FALSE(c.IsVerbose()); |
203157cb4fde
unit tests of httpclient
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
632
diff
changeset
|
60 |
203157cb4fde
unit tests of httpclient
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
632
diff
changeset
|
61 #if UNIT_TESTS_WITH_HTTP_CONNEXIONS == 1 |
203157cb4fde
unit tests of httpclient
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
632
diff
changeset
|
62 Json::Value v; |
203157cb4fde
unit tests of httpclient
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
632
diff
changeset
|
63 c.SetUrl("http://orthanc.googlecode.com/hg/Resources/Configuration.json"); |
203157cb4fde
unit tests of httpclient
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
632
diff
changeset
|
64 c.Apply(v); |
203157cb4fde
unit tests of httpclient
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
632
diff
changeset
|
65 ASSERT_TRUE(v.isMember("StorageDirectory")); |
203157cb4fde
unit tests of httpclient
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
632
diff
changeset
|
66 //ASSERT_EQ(GetLastStatusText()); |
203157cb4fde
unit tests of httpclient
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
632
diff
changeset
|
67 |
203157cb4fde
unit tests of httpclient
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
632
diff
changeset
|
68 v = Json::nullValue; |
203157cb4fde
unit tests of httpclient
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
632
diff
changeset
|
69 |
203157cb4fde
unit tests of httpclient
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
632
diff
changeset
|
70 HttpClient cc(c); |
203157cb4fde
unit tests of httpclient
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
632
diff
changeset
|
71 cc.SetUrl("https://orthanc.googlecode.com/hg/Resources/Configuration.json"); |
203157cb4fde
unit tests of httpclient
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
632
diff
changeset
|
72 cc.Apply(v); |
203157cb4fde
unit tests of httpclient
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
632
diff
changeset
|
73 ASSERT_TRUE(v.isMember("LuaScripts")); |
203157cb4fde
unit tests of httpclient
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
632
diff
changeset
|
74 #endif |
203157cb4fde
unit tests of httpclient
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
632
diff
changeset
|
75 } |
203157cb4fde
unit tests of httpclient
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
632
diff
changeset
|
76 |
203157cb4fde
unit tests of httpclient
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
632
diff
changeset
|
77 TEST(RestApi, ChunkedBuffer) |
203157cb4fde
unit tests of httpclient
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
632
diff
changeset
|
78 { |
203157cb4fde
unit tests of httpclient
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
632
diff
changeset
|
79 ChunkedBuffer b; |
203157cb4fde
unit tests of httpclient
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
632
diff
changeset
|
80 ASSERT_EQ(0, b.GetNumBytes()); |
203157cb4fde
unit tests of httpclient
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
632
diff
changeset
|
81 |
203157cb4fde
unit tests of httpclient
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
632
diff
changeset
|
82 b.AddChunk("hello", 5); |
203157cb4fde
unit tests of httpclient
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
632
diff
changeset
|
83 ASSERT_EQ(5, b.GetNumBytes()); |
203157cb4fde
unit tests of httpclient
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
632
diff
changeset
|
84 |
203157cb4fde
unit tests of httpclient
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
632
diff
changeset
|
85 b.AddChunk("world", 5); |
203157cb4fde
unit tests of httpclient
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
632
diff
changeset
|
86 ASSERT_EQ(10, b.GetNumBytes()); |
203157cb4fde
unit tests of httpclient
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
632
diff
changeset
|
87 |
203157cb4fde
unit tests of httpclient
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
632
diff
changeset
|
88 std::string s; |
203157cb4fde
unit tests of httpclient
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
632
diff
changeset
|
89 b.Flatten(s); |
203157cb4fde
unit tests of httpclient
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
632
diff
changeset
|
90 ASSERT_EQ("helloworld", s); |
203157cb4fde
unit tests of httpclient
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
632
diff
changeset
|
91 } |
203157cb4fde
unit tests of httpclient
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
632
diff
changeset
|
92 |
330 | 93 TEST(RestApi, ParseCookies) |
94 { | |
95 HttpHandler::Arguments headers; | |
96 HttpHandler::Arguments cookies; | |
97 | |
332 | 98 headers["cookie"] = "a=b;c=d;;;e=f;;g=h;"; |
330 | 99 HttpHandler::ParseCookies(cookies, headers); |
100 ASSERT_EQ(4u, cookies.size()); | |
101 ASSERT_EQ("b", cookies["a"]); | |
102 ASSERT_EQ("d", cookies["c"]); | |
103 ASSERT_EQ("f", cookies["e"]); | |
104 ASSERT_EQ("h", cookies["g"]); | |
105 | |
332 | 106 headers["cookie"] = " name = value ; name2=value2"; |
330 | 107 HttpHandler::ParseCookies(cookies, headers); |
108 ASSERT_EQ(2u, cookies.size()); | |
109 ASSERT_EQ("value", cookies["name"]); | |
110 ASSERT_EQ("value2", cookies["name2"]); | |
111 | |
332 | 112 headers["cookie"] = " ;;; "; |
330 | 113 HttpHandler::ParseCookies(cookies, headers); |
114 ASSERT_EQ(0u, cookies.size()); | |
115 | |
332 | 116 headers["cookie"] = " ; n=v ;; "; |
330 | 117 HttpHandler::ParseCookies(cookies, headers); |
118 ASSERT_EQ(1u, cookies.size()); | |
119 ASSERT_EQ("v", cookies["n"]); | |
120 } | |
121 | |
209 | 122 TEST(RestApi, RestApiPath) |
123 { | |
124 RestApiPath::Components args; | |
125 UriComponents trail; | |
126 | |
127 { | |
128 RestApiPath uri("/coucou/{abc}/d/*"); | |
129 ASSERT_TRUE(uri.Match(args, trail, "/coucou/moi/d/e/f/g")); | |
130 ASSERT_EQ(1u, args.size()); | |
131 ASSERT_EQ(3u, trail.size()); | |
132 ASSERT_EQ("moi", args["abc"]); | |
133 ASSERT_EQ("e", trail[0]); | |
134 ASSERT_EQ("f", trail[1]); | |
135 ASSERT_EQ("g", trail[2]); | |
136 | |
137 ASSERT_FALSE(uri.Match(args, trail, "/coucou/moi/f")); | |
138 ASSERT_TRUE(uri.Match(args, trail, "/coucou/moi/d/")); | |
139 ASSERT_FALSE(uri.Match(args, trail, "/a/moi/d")); | |
140 ASSERT_FALSE(uri.Match(args, trail, "/coucou/moi")); | |
966
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
141 |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
142 ASSERT_EQ(3u, uri.GetLevelCount()); |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
143 ASSERT_TRUE(uri.IsUniversalTrailing()); |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
144 |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
145 ASSERT_EQ("coucou", uri.GetLevelName(0)); |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
146 ASSERT_THROW(uri.GetWildcardName(0), OrthancException); |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
147 |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
148 ASSERT_EQ("abc", uri.GetWildcardName(1)); |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
149 ASSERT_THROW(uri.GetLevelName(1), OrthancException); |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
150 |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
151 ASSERT_EQ("d", uri.GetLevelName(2)); |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
152 ASSERT_THROW(uri.GetWildcardName(2), OrthancException); |
209 | 153 } |
154 | |
155 { | |
156 RestApiPath uri("/coucou/{abc}/d"); | |
157 ASSERT_FALSE(uri.Match(args, trail, "/coucou/moi/d/e/f/g")); | |
158 ASSERT_TRUE(uri.Match(args, trail, "/coucou/moi/d")); | |
159 ASSERT_EQ(1u, args.size()); | |
160 ASSERT_EQ(0u, trail.size()); | |
161 ASSERT_EQ("moi", args["abc"]); | |
966
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
162 |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
163 ASSERT_EQ(3u, uri.GetLevelCount()); |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
164 ASSERT_FALSE(uri.IsUniversalTrailing()); |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
165 |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
166 ASSERT_EQ("coucou", uri.GetLevelName(0)); |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
167 ASSERT_THROW(uri.GetWildcardName(0), OrthancException); |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
168 |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
169 ASSERT_EQ("abc", uri.GetWildcardName(1)); |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
170 ASSERT_THROW(uri.GetLevelName(1), OrthancException); |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
171 |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
172 ASSERT_EQ("d", uri.GetLevelName(2)); |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
173 ASSERT_THROW(uri.GetWildcardName(2), OrthancException); |
209 | 174 } |
175 | |
176 { | |
177 RestApiPath uri("/*"); | |
178 ASSERT_TRUE(uri.Match(args, trail, "/a/b/c")); | |
179 ASSERT_EQ(0u, args.size()); | |
180 ASSERT_EQ(3u, trail.size()); | |
181 ASSERT_EQ("a", trail[0]); | |
182 ASSERT_EQ("b", trail[1]); | |
183 ASSERT_EQ("c", trail[2]); | |
966
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
184 |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
185 ASSERT_EQ(0u, uri.GetLevelCount()); |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
186 ASSERT_TRUE(uri.IsUniversalTrailing()); |
209 | 187 } |
188 } | |
966
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
189 |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
190 |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
191 |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
192 |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
193 |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
194 |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
195 namespace Orthanc |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
196 { |
968 | 197 class RestApiHierarchy |
966
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
198 { |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
199 private: |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
200 struct Handlers |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
201 { |
968 | 202 typedef std::list<RestApi::GetHandler> GetHandlers; |
203 typedef std::list<RestApi::PostHandler> PostHandlers; | |
204 typedef std::list<RestApi::PutHandler> PutHandlers; | |
205 typedef std::list<RestApi::DeleteHandler> DeleteHandlers; | |
206 | |
207 GetHandlers getHandlers_; | |
208 PostHandlers postHandlers_; | |
209 PutHandlers putHandlers_; | |
210 DeleteHandlers deleteHandlers_; | |
211 | |
212 bool HasGet() const | |
213 { | |
214 return getHandlers_.size() > 0; | |
215 } | |
966
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
216 |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
217 void Register(RestApi::GetHandler handler) |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
218 { |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
219 getHandlers_.push_back(handler); |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
220 } |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
221 |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
222 void Register(RestApi::PutHandler handler) |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
223 { |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
224 putHandlers_.push_back(handler); |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
225 } |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
226 |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
227 void Register(RestApi::PostHandler handler) |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
228 { |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
229 postHandlers_.push_back(handler); |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
230 } |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
231 |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
232 void Register(RestApi::DeleteHandler handler) |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
233 { |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
234 deleteHandlers_.push_back(handler); |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
235 } |
968 | 236 |
237 bool IsEmpty() const | |
238 { | |
239 return (getHandlers_.empty() && | |
240 postHandlers_.empty() && | |
241 putHandlers_.empty() && | |
242 deleteHandlers_.empty()); | |
243 } | |
966
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
244 }; |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
245 |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
246 |
968 | 247 typedef std::map<std::string, RestApiHierarchy*> Children; |
248 typedef bool (*ResourceCallback) (Handlers&, | |
249 const UriComponents& uri, | |
250 const RestApiPath::Components& components, | |
251 const UriComponents& trailing, | |
252 void* call); | |
966
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
253 |
968 | 254 Handlers handlers_; |
966
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
255 Children children_; |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
256 Children wildcardChildren_; |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
257 Handlers universalHandlers_; |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
258 |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
259 |
968 | 260 static RestApiHierarchy& AddChild(Children& children, |
261 const std::string& name) | |
966
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
262 { |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
263 Children::iterator it = children.find(name); |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
264 |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
265 if (it == children.end()) |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
266 { |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
267 // Create new child |
968 | 268 RestApiHierarchy *child = new RestApiHierarchy; |
966
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
269 children[name] = child; |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
270 return *child; |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
271 } |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
272 else |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
273 { |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
274 return *it->second; |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
275 } |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
276 } |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
277 |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
278 |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
279 static void DeleteChildren(Children& children) |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
280 { |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
281 for (Children::iterator it = children.begin(); |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
282 it != children.end(); it++) |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
283 { |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
284 delete it->second; |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
285 } |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
286 } |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
287 |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
288 |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
289 template <typename Handler> |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
290 void RegisterInternal(const RestApiPath& path, |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
291 Handler handler, |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
292 size_t level) |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
293 { |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
294 if (path.GetLevelCount() == level) |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
295 { |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
296 if (path.IsUniversalTrailing()) |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
297 { |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
298 universalHandlers_.Register(handler); |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
299 } |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
300 else |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
301 { |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
302 handlers_.Register(handler); |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
303 } |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
304 } |
968 | 305 else |
966
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
306 { |
968 | 307 RestApiHierarchy* child; |
308 if (path.IsWildcardLevel(level)) | |
309 { | |
310 child = &AddChild(wildcardChildren_, path.GetWildcardName(level)); | |
311 } | |
312 else | |
313 { | |
314 child = &AddChild(children_, path.GetLevelName(level)); | |
315 } | |
316 | |
317 child->RegisterInternal(path, handler, level + 1); | |
966
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
318 } |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
319 } |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
320 |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
321 |
968 | 322 bool LookupHandler(RestApiPath::Components& components, |
323 const UriComponents& uri, | |
324 ResourceCallback callback, | |
325 size_t level, | |
326 void* call) | |
327 { | |
328 assert(uri.size() >= level); | |
329 UriComponents trailing; | |
330 | |
331 // Look for an exact match on the resource of interest | |
332 if (uri.size() == level) | |
333 { | |
334 if (!handlers_.IsEmpty() && | |
335 callback(handlers_, uri, components, trailing, call)) | |
336 { | |
337 return true; | |
338 } | |
339 } | |
340 | |
341 | |
342 // Try and go down in the hierarchy, using an exact match for the child | |
343 Children::const_iterator child = children_.find(uri[level]); | |
344 if (child != children_.end()) | |
345 { | |
346 if (child->second->LookupHandler(components, uri, callback, level + 1, call)) | |
347 { | |
348 return true; | |
349 } | |
350 } | |
351 | |
352 | |
353 // Try and go down in the hierarchy, using wildcard rules for children | |
354 for (child = wildcardChildren_.begin(); | |
355 child != wildcardChildren_.end(); child++) | |
356 { | |
357 RestApiPath::Components subComponents = components; | |
358 subComponents[child->first] = uri[level]; | |
359 | |
360 if (child->second->LookupHandler(components, uri, callback, level + 1, call)) | |
361 { | |
362 return true; | |
363 } | |
364 } | |
365 | |
366 | |
367 // As a last resort, call the universal handlers, if any | |
368 if (!universalHandlers_.IsEmpty()) | |
369 { | |
370 trailing.resize(uri.size() - level); | |
371 size_t pos = 0; | |
372 for (size_t i = level; i < uri.size(); i++, pos++) | |
373 { | |
374 trailing[pos] = uri[i]; | |
375 } | |
376 | |
377 assert(pos == trailing.size()); | |
378 | |
379 if (callback(universalHandlers_, uri, components, trailing, call)) | |
380 { | |
381 return true; | |
382 } | |
383 } | |
384 | |
385 return false; | |
386 } | |
387 | |
388 | |
389 bool GetDirectory(Json::Value& result, | |
390 const UriComponents& uri, | |
391 size_t level) | |
392 { | |
393 if (uri.size() == level) | |
394 { | |
395 if (!handlers_.HasGet() && | |
396 universalHandlers_.IsEmpty() && | |
397 wildcardChildren_.size() == 0) | |
398 { | |
399 result = Json::arrayValue; | |
400 | |
401 for (Children::const_iterator it = children_.begin(); | |
402 it != children_.end(); it++) | |
403 { | |
404 result.append(it->first); | |
405 } | |
406 | |
407 return true; | |
408 } | |
409 else | |
410 { | |
411 return false; | |
412 } | |
413 } | |
414 | |
415 Children::const_iterator child = children_.find(uri[level]); | |
416 if (child != children_.end()) | |
417 { | |
418 if (child->second->GetDirectory(result, uri, level + 1)) | |
419 { | |
420 return true; | |
421 } | |
422 } | |
423 | |
424 for (child = wildcardChildren_.begin(); | |
425 child != wildcardChildren_.end(); child++) | |
426 { | |
427 if (child->second->GetDirectory(result, uri, level + 1)) | |
428 { | |
429 return true; | |
430 } | |
431 } | |
432 | |
433 return false; | |
434 } | |
435 | |
436 | |
437 static bool GetCallback(Handlers& handlers, | |
438 const UriComponents& uri, | |
439 const RestApiPath::Components& components, | |
440 const UriComponents& trailing, | |
441 void* call) | |
442 { | |
443 for (Handlers::GetHandlers::iterator | |
444 it = handlers.getHandlers_.begin(); | |
445 it != handlers.getHandlers_.end(); it++) | |
446 { | |
447 // TODO RETURN BOOL | |
448 | |
449 (*it) (*reinterpret_cast<RestApi::GetCall*>(call)); | |
450 return true; | |
451 } | |
452 | |
453 return false; | |
454 } | |
455 | |
456 | |
457 static bool PostCallback(Handlers& handlers, | |
458 const UriComponents& uri, | |
459 const RestApiPath::Components& components, | |
460 const UriComponents& trailing, | |
461 void* call) | |
462 { | |
463 for (Handlers::PostHandlers::iterator | |
464 it = handlers.postHandlers_.begin(); | |
465 it != handlers.postHandlers_.end(); it++) | |
466 { | |
467 // TODO RETURN BOOL | |
468 | |
469 (*it) (*reinterpret_cast<RestApi::PostCall*>(call)); | |
470 return true; | |
471 } | |
472 | |
473 return false; | |
474 } | |
475 | |
476 | |
477 static bool PutCallback(Handlers& handlers, | |
478 const UriComponents& uri, | |
479 const RestApiPath::Components& components, | |
480 const UriComponents& trailing, | |
481 void* call) | |
482 { | |
483 for (Handlers::PutHandlers::iterator | |
484 it = handlers.putHandlers_.begin(); | |
485 it != handlers.putHandlers_.end(); it++) | |
486 { | |
487 // TODO RETURN BOOL | |
488 | |
489 (*it) (*reinterpret_cast<RestApi::PutCall*>(call)); | |
490 return true; | |
491 } | |
492 | |
493 return false; | |
494 } | |
495 | |
496 | |
497 static bool DeleteCallback(Handlers& handlers, | |
498 const UriComponents& uri, | |
499 const RestApiPath::Components& components, | |
500 const UriComponents& trailing, | |
501 void* call) | |
502 { | |
503 for (Handlers::DeleteHandlers::iterator | |
504 it = handlers.deleteHandlers_.begin(); | |
505 it != handlers.deleteHandlers_.end(); it++) | |
506 { | |
507 // TODO RETURN BOOL | |
508 | |
509 (*it) (*reinterpret_cast<RestApi::DeleteCall*>(call)); | |
510 return true; | |
511 } | |
512 | |
513 return false; | |
514 } | |
515 | |
516 | |
966
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
517 public: |
968 | 518 ~RestApiHierarchy() |
966
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
519 { |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
520 DeleteChildren(children_); |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
521 DeleteChildren(wildcardChildren_); |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
522 } |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
523 |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
524 void Register(const RestApiPath& path, |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
525 RestApi::GetHandler handler) |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
526 { |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
527 RegisterInternal(path, handler, 0); |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
528 } |
968 | 529 |
530 void Register(const RestApiPath& path, | |
531 RestApi::PutHandler handler) | |
532 { | |
533 RegisterInternal(path, handler, 0); | |
534 } | |
535 | |
536 void Register(const RestApiPath& path, | |
537 RestApi::PostHandler handler) | |
538 { | |
539 RegisterInternal(path, handler, 0); | |
540 } | |
541 | |
542 void Register(const RestApiPath& path, | |
543 RestApi::DeleteHandler handler) | |
544 { | |
545 RegisterInternal(path, handler, 0); | |
546 } | |
547 | |
548 void CreateSiteMap(Json::Value& target) const | |
549 { | |
550 if (children_.size() == 0) | |
551 { | |
552 std::string s = " "; | |
553 if (handlers_.getHandlers_.size() != 0) | |
554 { | |
555 s += "GET "; | |
556 } | |
557 | |
558 if (handlers_.postHandlers_.size() != 0) | |
559 { | |
560 s += "POST "; | |
561 } | |
562 | |
563 if (handlers_.putHandlers_.size() != 0) | |
564 { | |
565 s += "PUT "; | |
566 } | |
567 | |
568 if (handlers_.deleteHandlers_.size() != 0) | |
569 { | |
570 s += "DELETE "; | |
571 } | |
572 | |
573 target = s; | |
574 } | |
575 else | |
576 { | |
577 target = Json::objectValue; | |
578 | |
579 for (Children::const_iterator it = children_.begin(); | |
580 it != children_.end(); it++) | |
581 { | |
582 it->second->CreateSiteMap(target[it->first]); | |
583 } | |
584 } | |
585 | |
586 /*for (Children::const_iterator it = wildcardChildren_.begin(); | |
587 it != wildcardChildren_.end(); it++) | |
588 { | |
589 it->second->CreateSiteMap(target["* (" + it->first + ")"]); | |
590 }*/ | |
591 } | |
592 | |
593 bool GetDirectory(Json::Value& result, | |
594 const UriComponents& uri) | |
595 { | |
596 return GetDirectory(result, uri, 0); | |
597 } | |
598 | |
599 bool GetDirectory(Json::Value& result, | |
600 const std::string& uri) | |
601 { | |
602 UriComponents c; | |
603 Toolbox::SplitUriComponents(c, uri); | |
604 return GetDirectory(result, c, 0); | |
605 } | |
606 | |
607 bool Handle(RestApi::GetCall& call, | |
608 const UriComponents& uri) | |
609 { | |
610 RestApiPath::Components components; | |
611 return LookupHandler(components, uri, GetCallback, 0, &call); | |
612 } | |
613 | |
614 bool Handle(RestApi::PutCall& call, | |
615 const UriComponents& uri) | |
616 { | |
617 RestApiPath::Components components; | |
618 return LookupHandler(components, uri, PutCallback, 0, &call); | |
619 } | |
620 | |
621 bool Handle(RestApi::PostCall& call, | |
622 const UriComponents& uri) | |
623 { | |
624 RestApiPath::Components components; | |
625 return LookupHandler(components, uri, PostCallback, 0, &call); | |
626 } | |
627 | |
628 bool Handle(RestApi::DeleteCall& call, | |
629 const UriComponents& uri) | |
630 { | |
631 RestApiPath::Components components; | |
632 return LookupHandler(components, uri, DeleteCallback, 0, &call); | |
633 } | |
634 | |
635 bool Handle(RestApi::GetCall& call, | |
636 const std::string& uri) | |
637 { | |
638 UriComponents c; | |
639 Toolbox::SplitUriComponents(c, uri); | |
640 return Handle(call, c); | |
641 } | |
966
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
642 }; |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
643 |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
644 } |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
645 |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
646 |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
647 |
968 | 648 |
649 static int testValue; | |
650 | |
651 template <int value> | |
652 static void SetValue(RestApi::GetCall& get) | |
966
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
653 { |
968 | 654 testValue = value; |
966
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
655 } |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
656 |
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
657 |
968 | 658 TEST(RestApi, RestApiHierarchy) |
966
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
659 { |
968 | 660 RestApiHierarchy root; |
661 root.Register(RestApiPath("/hello/world/test"), SetValue<1>); | |
662 root.Register(RestApiPath("/hello/world/test2"), SetValue<2>); | |
663 root.Register(RestApiPath("/hello/{world}/test3/test4"), SetValue<3>); | |
664 root.Register(RestApiPath("/hello2/*"), SetValue<4>); | |
665 | |
666 Json::Value m; | |
667 root.CreateSiteMap(m); | |
668 std::cout << m; | |
669 | |
670 Json::Value d; | |
671 ASSERT_FALSE(root.GetDirectory(d, "/hello")); | |
672 | |
673 ASSERT_TRUE(root.GetDirectory(d, "/hello/a")); | |
674 ASSERT_EQ(1u, d.size()); | |
675 ASSERT_EQ("test3", d[0].asString()); | |
676 | |
677 ASSERT_TRUE(root.GetDirectory(d, "/hello/world")); | |
678 ASSERT_EQ(2u, d.size()); | |
966
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
679 |
968 | 680 ASSERT_TRUE(root.GetDirectory(d, "/hello/a/test3")); |
681 ASSERT_EQ(1u, d.size()); | |
682 ASSERT_EQ("test4", d[0].asString()); | |
683 | |
684 ASSERT_FALSE(root.GetDirectory(d, "/hello/world/test")); | |
685 ASSERT_FALSE(root.GetDirectory(d, "/hello/world/test2")); | |
686 ASSERT_FALSE(root.GetDirectory(d, "/hello2")); | |
687 | |
688 testValue = 0; | |
689 ASSERT_TRUE(root.Handle(*reinterpret_cast<RestApi::GetCall*>(NULL), "/hello/world/test")); | |
690 ASSERT_EQ(testValue, 1); | |
691 ASSERT_TRUE(root.Handle(*reinterpret_cast<RestApi::GetCall*>(NULL), "/hello/world/test2")); | |
692 ASSERT_EQ(testValue, 2); | |
693 ASSERT_TRUE(root.Handle(*reinterpret_cast<RestApi::GetCall*>(NULL), "/hello/b/test3/test4")); | |
694 ASSERT_EQ(testValue, 3); | |
695 ASSERT_FALSE(root.Handle(*reinterpret_cast<RestApi::GetCall*>(NULL), "/hello/b/test3/test")); | |
696 ASSERT_EQ(testValue, 3); | |
697 ASSERT_TRUE(root.Handle(*reinterpret_cast<RestApi::GetCall*>(NULL), "/hello2/a/b")); | |
698 ASSERT_EQ(testValue, 4); | |
966
886652370ff2
accelerating REST API matching
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
831
diff
changeset
|
699 } |