43 SocketContextUpgradeFactory::create(core::socket::stream::SocketConnection* socketConnection,
44 web::http::server::Request* request,
45 web::http::server::Response* response) {
46 SocketContextUpgrade* socketContext =
nullptr;
48 if (request->get(
"Sec-WebSocket-Version") ==
"13") {
49 std::string requestedSubProtocolNames = request->get(
"sec-websocket-protocol");
51 std::list<std::string> subProtocolNamesList;
53 std::string subProtocolName;
54 std::tie(subProtocolName, requestedSubProtocolNames) = httputils::str_split(requestedSubProtocolNames,
',');
55 httputils::str_trimm(subProtocolName);
56 subProtocolNamesList.push_back(subProtocolName);
57 }
while (!requestedSubProtocolNames.empty());
59 if (!subProtocolNamesList.empty()) {
60 std::string selectedSubProtocolName;
62 socketContext =
new SocketContextUpgrade(socketConnection,
this);
63 selectedSubProtocolName = socketContext->loadSubProtocol(subProtocolNamesList);
65 if (!selectedSubProtocolName.empty()) {
66 response->set(
"Upgrade",
"websocket");
67 response->set(
"Connection",
"Upgrade");
68 response->set(
"Sec-WebSocket-Protocol", selectedSubProtocolName);
69 response->set(
"Sec-WebSocket-Accept", base64::serverWebSocketKey(request->get(
"sec-websocket-key")));
71 response->status(101);
74 socketContext =
nullptr;
76 response->set(
"Connection",
"close");
77 response->status(400);
82 response->set(
"Connection",
"close");
83 response->status(400);
88 response->set(
"Sec-WebSocket-Version",
"13");
89 response->set(
"Connection",
"close");
90 response->status(426);