SNode.C
Loading...
Searching...
No Matches
SocketContextUpgradeFactorySelector.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#include "web/http/server/SocketContextUpgradeFactorySelector.h"
21
22#include "web/http/SocketContextUpgradeFactorySelector.hpp"
23#include "web/http/server/Request.h"
24
25#ifndef DOXYGEN_SHOULD_SKIP_THIS
26
27#if !defined(NDEBUG)
28#include "log/Logger.h"
29
30#include <cstdlib>
31#endif
32
33#include "web/http/http_utils.h"
34
35#include <tuple>
36
37#endif /* DOXYGEN_SHOULD_SKIP_THIS */
38
39namespace web::http::server {
40
41 SocketContextUpgradeFactorySelector::SocketContextUpgradeFactory*
42 SocketContextUpgradeFactorySelector::load(const std::string& socketContextUpgradeName) {
43 std::string httpUpgradeInstallLibdir = HTTP_UPGRADE_INSTALL_LIBDIR;
44
45#if !defined(NDEBUG)
46 if (const char* httpUpgradeInstallLibdirEnv = std::getenv("HTTP_UPGRADE_INSTALL_LIBDIR")) {
47 LOG(WARNING) << "HTTP: Overriding http upgrade library dir";
48 httpUpgradeInstallLibdir = std::string(httpUpgradeInstallLibdirEnv);
49 }
50#endif
51
52 return load(socketContextUpgradeName,
53 httpUpgradeInstallLibdir + "/libsnodec-" + socketContextUpgradeName + "-server.so." SOVERSION,
54 socketContextUpgradeName + "ServerSocketContextUpgradeFactory");
55 }
56
57 SocketContextUpgradeFactorySelector* SocketContextUpgradeFactorySelector::instance() {
58 static SocketContextUpgradeFactorySelector socketContextUpgradeFactorySelector;
59
60 return &socketContextUpgradeFactorySelector;
61 }
62
63 SocketContextUpgradeFactory* SocketContextUpgradeFactorySelector::select(Request& req, Response& res) {
64 SocketContextUpgradeFactory* socketContextUpgradeFactory = nullptr;
65
66 std::string upgradeContextNames = req.get("upgrade");
67
68 while (!upgradeContextNames.empty() && socketContextUpgradeFactory == nullptr) {
69 std::string upgradeContextName;
70 std::string upgradeContextVersion;
71
72 std::tie(upgradeContextName, upgradeContextNames) = httputils::str_split(upgradeContextNames, ',');
73 std::tie(upgradeContextName, upgradeContextVersion) = httputils::str_split(upgradeContextName, '/');
74
75 httputils::str_trimm(upgradeContextName);
76 httputils::to_lower(upgradeContextName);
77
78 socketContextUpgradeFactory = select(upgradeContextName);
79 }
80
81 if (socketContextUpgradeFactory != nullptr) {
82 socketContextUpgradeFactory->prepare(req, res);
83 }
84
85 return socketContextUpgradeFactory;
86 }
87
88} // namespace web::http::server
89
90template class web::http::SocketContextUpgradeFactorySelector<web::http::server::SocketContextUpgradeFactory>;