SNode.C
Loading...
Searching...
No Matches
JsonMiddleware.cpp
Go to the documentation of this file.
1/*
2 * SNode.C - A Slim Toolkit for Network Communication
3 * Copyright (C) Volker Christian <me@vchrist.at>
4 * 2020, 2021, 2022, 2023, 2024, 2025
5 *
6 * This program is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU Lesser General Public License as published
8 * by the Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public License
17 * along with this program. If not, see <http://www.gnu.org/licenses/>.
18 */
19
20/*
21 * MIT License
22 *
23 * Permission is hereby granted, free of charge, to any person obtaining a copy
24 * of this software and associated documentation files (the "Software"), to deal
25 * in the Software without restriction, including without limitation the rights
26 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
27 * copies of the Software, and to permit persons to whom the Software is
28 * furnished to do so, subject to the following conditions:
29 *
30 * The above copyright notice and this permission notice shall be included in
31 * all copies or substantial portions of the Software.
32 *
33 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
34 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
35 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
36 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
37 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
38 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
39 * THE SOFTWARE.
40 */
41
42#include "express/middleware/JsonMiddleware.h"
43
44#ifndef DOXYGEN_SHOULD_SKIP_THIS
45
46#include <nlohmann/json.hpp>
47#include <string>
48#include <vector>
49
50// IWYU pragma: no_include <nlohmann/detail/exceptions.hpp>
51// IWYU pragma: no_include <nlohmann/json_fwd.hpp>
52
53#endif /* DOXYGEN_SHOULD_SKIP_THIS */
54
55namespace express::middleware {
56
57 JsonMiddleware::JsonMiddleware() {
58 use("/", [] MIDDLEWARE(req, res, next) {
59 try {
60 // parse body string with json library
61 // store it as type json from nlohmann library
62 // nlohmann::json json = nlohmann::json::parse(req.body, req.body + req.contentLength);
63
64 // req->body.push_back(0);
65 const nlohmann::json json = nlohmann::json::parse(std::string(req->body.begin(), req->body.end()));
66
67 // set all the json data as attributes in the request object
68 req->setAttribute<nlohmann::json>(json);
69 } catch ([[maybe_unused]] const nlohmann::detail::parse_error& error) {
70 // silently fail if body is not json
71 }
72
73 next();
74 });
75 }
76
77 class JsonMiddleware& JsonMiddleware::instance() {
78 // Keep the created json middleware alive
79 static std::shared_ptr<class JsonMiddleware> jsonMiddleware = nullptr;
80
81 if (jsonMiddleware == nullptr) {
82 jsonMiddleware = std::shared_ptr<JsonMiddleware>(new JsonMiddleware());
83 }
84
85 return *jsonMiddleware;
86 }
87
88 // "Constructor" of JsonMiddleware
89 class JsonMiddleware& JsonMiddleware() {
90 return JsonMiddleware::instance();
91 }
92
93} // namespace express::middleware
#define MIDDLEWARE(req, res, next)
Definition Router.h:63
void operator()(const std::string &how="") const
Definition Next.cpp:56
std::vector< char > body
Definition Request.h:104
constexpr bool setAttribute(const Attribute &attribute, const std::string &subKey="", bool overwrite=false)