Mercurial > hg > orthanc
annotate OrthancFramework/Sources/HttpServer/HttpContentNegociation.cpp @ 5485:48b8dae6dc77
upgrade to year 2024
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Thu, 04 Jan 2024 15:10:42 +0100 |
parents | f41e1f635c4d |
children | f7adfb22e20e |
rev | line source |
---|---|
1783 | 1 /** |
2 * Orthanc - A Lightweight, RESTful DICOM Store | |
1900 | 3 * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics |
1783 | 4 * Department, University Hospital of Liege, Belgium |
5485
48b8dae6dc77
upgrade to year 2024
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5344
diff
changeset
|
5 * Copyright (C) 2017-2024 Osimis S.A., Belgium |
48b8dae6dc77
upgrade to year 2024
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5344
diff
changeset
|
6 * Copyright (C) 2021-2024 Sebastien Jodogne, ICTEAM UCLouvain, Belgium |
1783 | 7 * |
8 * 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
|
9 * 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
|
10 * 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
|
11 * the License, or (at your option) any later version. |
1783 | 12 * |
13 * This program is distributed in the hope that it will be useful, but | |
14 * WITHOUT ANY WARRANTY; without even the implied warranty of | |
15 * 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
|
16 * Lesser General Public License for more details. |
1783 | 17 * |
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
|
18 * 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
|
19 * 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
|
20 * <http://www.gnu.org/licenses/>. |
1783 | 21 **/ |
22 | |
23 | |
24 #include "../PrecompiledHeaders.h" | |
25 #include "HttpContentNegociation.h" | |
26 | |
27 #include "../Logging.h" | |
28 #include "../OrthancException.h" | |
29 #include "../Toolbox.h" | |
30 | |
31 #include <boost/lexical_cast.hpp> | |
32 | |
33 namespace Orthanc | |
34 { | |
35 HttpContentNegociation::Handler::Handler(const std::string& type, | |
36 const std::string& subtype, | |
37 IHandler& handler) : | |
38 type_(type), | |
39 subtype_(subtype), | |
40 handler_(handler) | |
41 { | |
42 } | |
43 | |
44 | |
45 bool HttpContentNegociation::Handler::IsMatch(const std::string& type, | |
46 const std::string& subtype) const | |
47 { | |
48 if (type == "*" && subtype == "*") | |
49 { | |
50 return true; | |
51 } | |
5338
78c59b02b121
accept parameters are now provided to HttpContentNegociation::IHandler::Handle()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
52 else if (subtype == "*" && type == type_) |
1783 | 53 { |
54 return true; | |
55 } | |
5338
78c59b02b121
accept parameters are now provided to HttpContentNegociation::IHandler::Handle()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
56 else |
78c59b02b121
accept parameters are now provided to HttpContentNegociation::IHandler::Handle()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
57 { |
78c59b02b121
accept parameters are now provided to HttpContentNegociation::IHandler::Handle()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
58 return type == type_ && subtype == subtype_; |
78c59b02b121
accept parameters are now provided to HttpContentNegociation::IHandler::Handle()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
59 } |
1783 | 60 } |
61 | |
62 | |
5338
78c59b02b121
accept parameters are now provided to HttpContentNegociation::IHandler::Handle()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
63 class HttpContentNegociation::Reference : public boost::noncopyable |
1783 | 64 { |
5338
78c59b02b121
accept parameters are now provided to HttpContentNegociation::IHandler::Handle()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
65 private: |
1783 | 66 const Handler& handler_; |
67 uint8_t level_; | |
68 float quality_; | |
5338
78c59b02b121
accept parameters are now provided to HttpContentNegociation::IHandler::Handle()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
69 Dictionary parameters_; |
1783 | 70 |
5338
78c59b02b121
accept parameters are now provided to HttpContentNegociation::IHandler::Handle()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
71 static float GetQuality(const Dictionary& parameters) |
78c59b02b121
accept parameters are now provided to HttpContentNegociation::IHandler::Handle()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
72 { |
78c59b02b121
accept parameters are now provided to HttpContentNegociation::IHandler::Handle()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
73 Dictionary::const_iterator found = parameters.find("q"); |
78c59b02b121
accept parameters are now provided to HttpContentNegociation::IHandler::Handle()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
74 |
78c59b02b121
accept parameters are now provided to HttpContentNegociation::IHandler::Handle()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
75 if (found != parameters.end()) |
78c59b02b121
accept parameters are now provided to HttpContentNegociation::IHandler::Handle()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
76 { |
78c59b02b121
accept parameters are now provided to HttpContentNegociation::IHandler::Handle()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
77 float quality; |
78c59b02b121
accept parameters are now provided to HttpContentNegociation::IHandler::Handle()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
78 bool ok = false; |
78c59b02b121
accept parameters are now provided to HttpContentNegociation::IHandler::Handle()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
79 |
78c59b02b121
accept parameters are now provided to HttpContentNegociation::IHandler::Handle()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
80 try |
78c59b02b121
accept parameters are now provided to HttpContentNegociation::IHandler::Handle()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
81 { |
78c59b02b121
accept parameters are now provided to HttpContentNegociation::IHandler::Handle()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
82 quality = boost::lexical_cast<float>(found->second); |
78c59b02b121
accept parameters are now provided to HttpContentNegociation::IHandler::Handle()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
83 ok = (quality >= 0.0f && quality <= 1.0f); |
78c59b02b121
accept parameters are now provided to HttpContentNegociation::IHandler::Handle()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
84 } |
78c59b02b121
accept parameters are now provided to HttpContentNegociation::IHandler::Handle()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
85 catch (boost::bad_lexical_cast&) |
78c59b02b121
accept parameters are now provided to HttpContentNegociation::IHandler::Handle()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
86 { |
78c59b02b121
accept parameters are now provided to HttpContentNegociation::IHandler::Handle()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
87 } |
78c59b02b121
accept parameters are now provided to HttpContentNegociation::IHandler::Handle()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
88 |
78c59b02b121
accept parameters are now provided to HttpContentNegociation::IHandler::Handle()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
89 if (ok) |
78c59b02b121
accept parameters are now provided to HttpContentNegociation::IHandler::Handle()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
90 { |
78c59b02b121
accept parameters are now provided to HttpContentNegociation::IHandler::Handle()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
91 return quality; |
78c59b02b121
accept parameters are now provided to HttpContentNegociation::IHandler::Handle()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
92 } |
78c59b02b121
accept parameters are now provided to HttpContentNegociation::IHandler::Handle()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
93 else |
78c59b02b121
accept parameters are now provided to HttpContentNegociation::IHandler::Handle()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
94 { |
78c59b02b121
accept parameters are now provided to HttpContentNegociation::IHandler::Handle()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
95 throw OrthancException( |
78c59b02b121
accept parameters are now provided to HttpContentNegociation::IHandler::Handle()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
96 ErrorCode_BadRequest, |
78c59b02b121
accept parameters are now provided to HttpContentNegociation::IHandler::Handle()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
97 "Quality parameter out of range in a HTTP request (must be between 0 and 1): " + found->second); |
78c59b02b121
accept parameters are now provided to HttpContentNegociation::IHandler::Handle()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
98 } |
78c59b02b121
accept parameters are now provided to HttpContentNegociation::IHandler::Handle()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
99 } |
78c59b02b121
accept parameters are now provided to HttpContentNegociation::IHandler::Handle()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
100 else |
78c59b02b121
accept parameters are now provided to HttpContentNegociation::IHandler::Handle()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
101 { |
78c59b02b121
accept parameters are now provided to HttpContentNegociation::IHandler::Handle()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
102 return 1.0f; // Default quality |
78c59b02b121
accept parameters are now provided to HttpContentNegociation::IHandler::Handle()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
103 } |
78c59b02b121
accept parameters are now provided to HttpContentNegociation::IHandler::Handle()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
104 } |
78c59b02b121
accept parameters are now provided to HttpContentNegociation::IHandler::Handle()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
105 |
78c59b02b121
accept parameters are now provided to HttpContentNegociation::IHandler::Handle()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
106 public: |
1783 | 107 Reference(const Handler& handler, |
108 const std::string& type, | |
109 const std::string& subtype, | |
5338
78c59b02b121
accept parameters are now provided to HttpContentNegociation::IHandler::Handle()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
110 const Dictionary& parameters) : |
1783 | 111 handler_(handler), |
5338
78c59b02b121
accept parameters are now provided to HttpContentNegociation::IHandler::Handle()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
112 quality_(GetQuality(parameters)), |
78c59b02b121
accept parameters are now provided to HttpContentNegociation::IHandler::Handle()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
113 parameters_(parameters) |
1783 | 114 { |
115 if (type == "*" && subtype == "*") | |
116 { | |
117 level_ = 0; | |
118 } | |
119 else if (subtype == "*") | |
120 { | |
121 level_ = 1; | |
122 } | |
123 else | |
124 { | |
125 level_ = 2; | |
126 } | |
127 } | |
5338
78c59b02b121
accept parameters are now provided to HttpContentNegociation::IHandler::Handle()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
128 |
78c59b02b121
accept parameters are now provided to HttpContentNegociation::IHandler::Handle()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
129 void Call() const |
78c59b02b121
accept parameters are now provided to HttpContentNegociation::IHandler::Handle()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
130 { |
78c59b02b121
accept parameters are now provided to HttpContentNegociation::IHandler::Handle()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
131 handler_.Call(parameters_); |
78c59b02b121
accept parameters are now provided to HttpContentNegociation::IHandler::Handle()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
132 } |
1783 | 133 |
134 bool operator< (const Reference& other) const | |
135 { | |
136 if (level_ < other.level_) | |
137 { | |
138 return true; | |
139 } | |
5338
78c59b02b121
accept parameters are now provided to HttpContentNegociation::IHandler::Handle()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
140 else if (level_ > other.level_) |
1783 | 141 { |
142 return false; | |
143 } | |
5338
78c59b02b121
accept parameters are now provided to HttpContentNegociation::IHandler::Handle()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
144 else |
78c59b02b121
accept parameters are now provided to HttpContentNegociation::IHandler::Handle()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
145 { |
78c59b02b121
accept parameters are now provided to HttpContentNegociation::IHandler::Handle()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
146 return quality_ < other.quality_; |
78c59b02b121
accept parameters are now provided to HttpContentNegociation::IHandler::Handle()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
147 } |
1783 | 148 } |
149 }; | |
150 | |
151 | |
152 bool HttpContentNegociation::SplitPair(std::string& first /* out */, | |
153 std::string& second /* out */, | |
154 const std::string& source, | |
155 char separator) | |
156 { | |
157 size_t pos = source.find(separator); | |
158 | |
159 if (pos == std::string::npos) | |
160 { | |
161 return false; | |
162 } | |
163 else | |
164 { | |
165 first = Toolbox::StripSpaces(source.substr(0, pos)); | |
166 second = Toolbox::StripSpaces(source.substr(pos + 1)); | |
167 return true; | |
168 } | |
169 } | |
170 | |
171 | |
5338
78c59b02b121
accept parameters are now provided to HttpContentNegociation::IHandler::Handle()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
172 void HttpContentNegociation::SelectBestMatch(std::unique_ptr<Reference>& target, |
1783 | 173 const Handler& handler, |
174 const std::string& type, | |
175 const std::string& subtype, | |
5338
78c59b02b121
accept parameters are now provided to HttpContentNegociation::IHandler::Handle()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
176 const Dictionary& parameters) |
1783 | 177 { |
5338
78c59b02b121
accept parameters are now provided to HttpContentNegociation::IHandler::Handle()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
178 std::unique_ptr<Reference> match(new Reference(handler, type, subtype, parameters)); |
1783 | 179 |
5338
78c59b02b121
accept parameters are now provided to HttpContentNegociation::IHandler::Handle()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
180 if (target.get() == NULL || |
78c59b02b121
accept parameters are now provided to HttpContentNegociation::IHandler::Handle()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
181 *target < *match) |
1783 | 182 { |
3712
2a170a8f1faf
replacing std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3640
diff
changeset
|
183 #if __cplusplus < 201103L |
5338
78c59b02b121
accept parameters are now provided to HttpContentNegociation::IHandler::Handle()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
184 target.reset(match.release()); |
3712
2a170a8f1faf
replacing std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3640
diff
changeset
|
185 #else |
5338
78c59b02b121
accept parameters are now provided to HttpContentNegociation::IHandler::Handle()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
186 target = std::move(match); |
3712
2a170a8f1faf
replacing std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3640
diff
changeset
|
187 #endif |
1783 | 188 } |
189 } | |
190 | |
191 | |
192 void HttpContentNegociation::Register(const std::string& mime, | |
193 IHandler& handler) | |
194 { | |
195 std::string type, subtype; | |
196 | |
197 if (SplitPair(type, subtype, mime, '/') && | |
198 type != "*" && | |
199 subtype != "*") | |
200 { | |
201 handlers_.push_back(Handler(type, subtype, handler)); | |
202 } | |
203 else | |
204 { | |
205 throw OrthancException(ErrorCode_ParameterOutOfRange); | |
206 } | |
207 } | |
208 | |
209 | |
5338
78c59b02b121
accept parameters are now provided to HttpContentNegociation::IHandler::Handle()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
210 bool HttpContentNegociation::Apply(const Dictionary& headers) |
1783 | 211 { |
5338
78c59b02b121
accept parameters are now provided to HttpContentNegociation::IHandler::Handle()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
212 Dictionary::const_iterator accept = headers.find("accept"); |
1783 | 213 if (accept != headers.end()) |
214 { | |
215 return Apply(accept->second); | |
216 } | |
217 else | |
218 { | |
219 return Apply("*/*"); | |
220 } | |
221 } | |
222 | |
223 | |
224 bool HttpContentNegociation::Apply(const std::string& accept) | |
225 { | |
226 // http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.1 | |
227 // https://en.wikipedia.org/wiki/Content_negotiation | |
228 // http://www.newmediacampaigns.com/blog/browser-rest-http-accept-headers | |
229 | |
230 Tokens mediaRanges; | |
231 Toolbox::TokenizeString(mediaRanges, accept, ','); | |
232 | |
3712
2a170a8f1faf
replacing std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3640
diff
changeset
|
233 std::unique_ptr<Reference> bestMatch; |
1783 | 234 |
235 for (Tokens::const_iterator it = mediaRanges.begin(); | |
236 it != mediaRanges.end(); ++it) | |
237 { | |
5338
78c59b02b121
accept parameters are now provided to HttpContentNegociation::IHandler::Handle()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
238 Tokens tokens; |
78c59b02b121
accept parameters are now provided to HttpContentNegociation::IHandler::Handle()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
239 Toolbox::TokenizeString(tokens, *it, ';'); |
1783 | 240 |
5338
78c59b02b121
accept parameters are now provided to HttpContentNegociation::IHandler::Handle()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
241 if (tokens.size() > 0) |
1783 | 242 { |
5338
78c59b02b121
accept parameters are now provided to HttpContentNegociation::IHandler::Handle()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
243 Dictionary parameters; |
78c59b02b121
accept parameters are now provided to HttpContentNegociation::IHandler::Handle()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
244 for (size_t i = 1; i < tokens.size(); i++) |
78c59b02b121
accept parameters are now provided to HttpContentNegociation::IHandler::Handle()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
245 { |
78c59b02b121
accept parameters are now provided to HttpContentNegociation::IHandler::Handle()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
246 std::string key, value; |
78c59b02b121
accept parameters are now provided to HttpContentNegociation::IHandler::Handle()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
247 |
5339
cb11e5ced4e3
added tests from issue 216
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5338
diff
changeset
|
248 if (SplitPair(key, value, tokens[i], '=')) |
cb11e5ced4e3
added tests from issue 216
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5338
diff
changeset
|
249 { |
cb11e5ced4e3
added tests from issue 216
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5338
diff
changeset
|
250 // Remove the enclosing quotes, if present |
cb11e5ced4e3
added tests from issue 216
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5338
diff
changeset
|
251 if (!value.empty() && |
cb11e5ced4e3
added tests from issue 216
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5338
diff
changeset
|
252 value[0] == '"' && |
cb11e5ced4e3
added tests from issue 216
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5338
diff
changeset
|
253 value[value.size() - 1] == '"') |
cb11e5ced4e3
added tests from issue 216
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5338
diff
changeset
|
254 { |
cb11e5ced4e3
added tests from issue 216
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5338
diff
changeset
|
255 value = value.substr(1, value.size() - 2); |
cb11e5ced4e3
added tests from issue 216
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5338
diff
changeset
|
256 } |
cb11e5ced4e3
added tests from issue 216
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5338
diff
changeset
|
257 } |
cb11e5ced4e3
added tests from issue 216
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5338
diff
changeset
|
258 else |
5338
78c59b02b121
accept parameters are now provided to HttpContentNegociation::IHandler::Handle()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
259 { |
78c59b02b121
accept parameters are now provided to HttpContentNegociation::IHandler::Handle()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
260 key = Toolbox::StripSpaces(tokens[i]); |
78c59b02b121
accept parameters are now provided to HttpContentNegociation::IHandler::Handle()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
261 value = ""; |
78c59b02b121
accept parameters are now provided to HttpContentNegociation::IHandler::Handle()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
262 } |
1783 | 263 |
5338
78c59b02b121
accept parameters are now provided to HttpContentNegociation::IHandler::Handle()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
264 parameters[key] = value; |
78c59b02b121
accept parameters are now provided to HttpContentNegociation::IHandler::Handle()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
265 } |
78c59b02b121
accept parameters are now provided to HttpContentNegociation::IHandler::Handle()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
266 |
1783 | 267 std::string type, subtype; |
5338
78c59b02b121
accept parameters are now provided to HttpContentNegociation::IHandler::Handle()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
268 if (SplitPair(type, subtype, tokens[0], '/')) |
1783 | 269 { |
270 for (Handlers::const_iterator it2 = handlers_.begin(); | |
271 it2 != handlers_.end(); ++it2) | |
272 { | |
273 if (it2->IsMatch(type, subtype)) | |
274 { | |
5338
78c59b02b121
accept parameters are now provided to HttpContentNegociation::IHandler::Handle()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
275 SelectBestMatch(bestMatch, *it2, type, subtype, parameters); |
1783 | 276 } |
277 } | |
278 } | |
279 } | |
280 } | |
281 | |
282 if (bestMatch.get() == NULL) // No match was found | |
283 { | |
284 return false; | |
285 } | |
286 else | |
287 { | |
5338
78c59b02b121
accept parameters are now provided to HttpContentNegociation::IHandler::Handle()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
5185
diff
changeset
|
288 bestMatch->Call(); |
1783 | 289 return true; |
290 } | |
291 } | |
292 } |