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/client/SocketContextUpgradeFactorySelector.h"
21
22
#
include
"web/http/SocketContextUpgradeFactorySelector.hpp"
23
#
include
"web/http/client/Response.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
39
namespace
web::http::
client
{
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
+
"-client.so."
SOVERSION
,
54
socketContextUpgradeName
+
"ClientSocketContextUpgradeFactory"
);
55
}
56
57
SocketContextUpgradeFactorySelector
*
SocketContextUpgradeFactorySelector
::
instance
() {
58
static
SocketContextUpgradeFactorySelector
socketContextUpgradeFactorySelector
;
59
60
return
&
socketContextUpgradeFactorySelector
;
61
}
62
63
SocketContextUpgradeFactory
*
SocketContextUpgradeFactorySelector
::
select
(
const
std
::
string
&
protocols
,
Request
&
req
) {
64
SocketContextUpgradeFactory
*
socketContextUpgradeFactory
=
nullptr
;
65
66
std
::
string
upgradeContextNames
=
protocols
;
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
);
// Fill in the missing header fields into the request object
83
}
84
85
return
socketContextUpgradeFactory
;
86
}
87
88
SocketContextUpgradeFactory
*
SocketContextUpgradeFactorySelector
::
select
(
Request
&
req
,
Response
&
res
) {
89
SocketContextUpgradeFactory
*
socketContextUpgradeFactory
=
nullptr
;
90
91
std
::
string
upgradeContextName
=
res
.
get
(
"upgrade"
);
92
93
if
(!
upgradeContextName
.
empty
()) {
94
httputils
::
to_lower
(
upgradeContextName
);
95
96
socketContextUpgradeFactory
=
select
(
upgradeContextName
);
97
98
if
(
socketContextUpgradeFactory
!=
nullptr
) {
99
socketContextUpgradeFactory
->
prepare
(
req
,
res
);
// Fill in the missing header fields into the request object
100
}
101
}
102
103
return
socketContextUpgradeFactory
;
104
}
105
106
}
// namespace web::http::client
107
108
template
class
web::http::SocketContextUpgradeFactorySelector<web::http::client::SocketContextUpgradeFactory>;
web
Definition
ResponseParser.h:39
web
http
client
SocketContextUpgradeFactorySelector.cpp
Generated on Mon Feb 10 2025 20:22:05 for SNode.C by
1.11.0