|
2 | 2 |
|
3 | 3 | namespace httpsserver {
|
4 | 4 |
|
| 5 | +ResourceResolver::HTTPSMiddlewareFunctionCallback::HTTPSMiddlewareFunctionCallback(const HTTPSMiddlewareFunction callback, const HTTPSMiddlewareFunction* callback_std_function, const HTTPSMiddlewareFunctionType* callback_raw_pointer) : _callback(callback), _callback_std_function(callback_std_function), _callback_raw_pointer(callback_raw_pointer) { |
| 6 | +}; |
| 7 | + |
| 8 | +HTTPSMiddlewareFunction ResourceResolver::HTTPSMiddlewareFunctionCallback::getCallback() { |
| 9 | + return _callback; |
| 10 | +}; |
| 11 | + |
| 12 | +const HTTPSMiddlewareFunction* ResourceResolver::HTTPSMiddlewareFunctionCallback::getStdFunctionPointer() { |
| 13 | + return _callback_std_function; |
| 14 | +}; |
| 15 | + |
| 16 | +const HTTPSMiddlewareFunctionType* ResourceResolver::HTTPSMiddlewareFunctionCallback::getRawFunctionPointer() { |
| 17 | + return _callback_raw_pointer; |
| 18 | +}; |
| 19 | + |
5 | 20 | ResourceResolver::ResourceResolver() {
|
6 | 21 | _nodes = new std::vector<HTTPNode *>();
|
7 | 22 | _defaultNode = NULL;
|
@@ -160,20 +175,68 @@ void ResourceResolver::resolveNode(const std::string &method, const std::string
|
160 | 175 | }
|
161 | 176 | }
|
162 | 177 |
|
163 |
| -void ResourceResolver::addMiddleware(const HTTPSMiddlewareFunction mwFunction) { |
| 178 | +void ResourceResolver::updateMiddlewareList() { |
| 179 | + _middleware.clear(); |
| 180 | + _middleware.reserve(_middleware_callback.size()); |
| 181 | + for (auto& callback : _middleware_callback) { |
| 182 | + _middleware.push_back(callback.getCallback()); |
| 183 | + } |
| 184 | +} |
| 185 | + |
| 186 | +void ResourceResolver::addMiddleware(const HTTPSMiddlewareFunction &mwFunction) { |
| 187 | + const HTTPSMiddlewareFunctionCallback callback{ |
| 188 | + mwFunction, |
| 189 | + &mwFunction, |
| 190 | + nullptr |
| 191 | + }; |
164 | 192 | _middleware.push_back(mwFunction);
|
| 193 | + _middleware_callback.push_back(callback); |
165 | 194 | }
|
166 | 195 |
|
167 | 196 | void ResourceResolver::addMiddleware(void (*mwFunction)(HTTPRequest * req, HTTPResponse * res, std::function<void()> next)) {
|
168 |
| - _middleware.push_back(HTTPSMiddlewareFunction(mwFunction)); |
| 197 | + auto mwFunction_callback = HTTPSMiddlewareFunction(mwFunction); |
| 198 | + const HTTPSMiddlewareFunctionCallback callback{ |
| 199 | + mwFunction_callback, |
| 200 | + &mwFunction_callback, |
| 201 | + mwFunction |
| 202 | + }; |
| 203 | + _middleware.push_back(mwFunction_callback); |
| 204 | + _middleware_callback.push_back(callback); |
169 | 205 | }
|
170 | 206 |
|
171 |
| -void ResourceResolver::removeMiddleware(const HTTPSMiddlewareFunction mwFunction) { |
172 |
| - _middleware.erase(std::remove(_middleware.begin(), _middleware.end(), mwFunction), _middleware.end()); |
| 207 | +void ResourceResolver::removeMiddleware(const HTTPSMiddlewareFunction &mwFunction) { |
| 208 | + bool found = false; |
| 209 | + for (auto it = _middleware_callback.begin(); it != _middleware_callback.end();) { |
| 210 | + auto element = *it; |
| 211 | + const auto callback = element.getStdFunctionPointer(); |
| 212 | + const auto callback_supplied = &mwFunction; |
| 213 | + if (callback != nullptr && callback == callback_supplied) { |
| 214 | + it = _middleware_callback.erase(it); |
| 215 | + found = true; |
| 216 | + } else { |
| 217 | + ++it; |
| 218 | + } |
| 219 | + } |
| 220 | + if (found) { |
| 221 | + updateMiddlewareList(); |
| 222 | + } |
173 | 223 | }
|
174 | 224 |
|
175 | 225 | void ResourceResolver::removeMiddleware(void (*mwFunction)(HTTPRequest * req, HTTPResponse * res, std::function<void()> next)) {
|
176 |
| - _middleware.erase(std::remove(_middleware.begin(), _middleware.end(), mwFunction), _middleware.end()); |
| 226 | + bool found = false; |
| 227 | + for (auto it = _middleware_callback.begin(); it != _middleware_callback.end();) { |
| 228 | + auto element = *it; |
| 229 | + auto callback = element.getRawFunctionPointer(); |
| 230 | + if (callback != nullptr && callback == mwFunction) { |
| 231 | + it = _middleware_callback.erase(it); |
| 232 | + found = true; |
| 233 | + } else { |
| 234 | + ++it; |
| 235 | + } |
| 236 | + } |
| 237 | + if (found) { |
| 238 | + updateMiddlewareList(); |
| 239 | + } |
177 | 240 | }
|
178 | 241 |
|
179 | 242 | const std::vector<HTTPSMiddlewareFunction> ResourceResolver::getMiddleware() {
|
|
0 commit comments