REDAC HybridController
Firmware for LUCIDAC/REDAC Teensy
Loading...
Searching...
No Matches
server.cpp
Go to the documentation of this file.
1#include <map>
2#include <memory>
3#include <web/websockets.h>
4#include <websockets/server.h>
5
6namespace websockets {
7WebsocketsServer::WebsocketsServer(network::TcpServer *server) : _server(server) {}
8
9bool WebsocketsServer::available() { return this->_server->available(); }
10
11void WebsocketsServer::listen(uint16_t port) { this->_server->listen(port); }
12
13FLASHMEM
14bool WebsocketsServer::poll() { return this->_server->poll(); }
15
17 std::string head;
18 std::map<std::string, std::string> headers;
19};
20
21FLASHMEM
22ParsedHandshakeParams recvHandshakeRequest(network::TcpClient &client) {
24
25 result.head = client.readLine();
26
27 std::string line = client.readLine();
28 do {
29 std::string key = "", value = "";
30 size_t idx = 0;
31
32 // read key
33 while (idx < line.size() && line[idx] != ':') {
34 key += line[idx];
35 idx++;
36 }
37
38 // skip key and whitespace
39 idx++;
40 while (idx < line.size() && (line[idx] == ' ' || line[idx] == '\t'))
41 idx++;
42
43 // read value (until \r\n)
44 while (idx < line.size() && line[idx] != '\r') {
45 value += line[idx];
46 idx++;
47 }
48
49 // store header
50 result.headers[key] = value;
51
52 line = client.readLine();
53 } while (client.available() && line != "\r\n");
54
55 return result;
56}
57
58FLASHMEM
59WebsocketsClient WebsocketsServer::accept() {
60 std::shared_ptr<network::TcpClient> tcpClient(_server->accept());
61 if (tcpClient->available() == false)
62 return {};
63
64 auto params = recvHandshakeRequest(*tcpClient);
65
66 if (params.headers["Connection"].find("Upgrade") == std::string::npos)
67 return {};
68 if (params.headers["Upgrade"] != "websocket")
69 return {};
70 if (params.headers["Sec-WebSocket-Version"] != "13")
71 return {};
72 if (params.headers["Sec-WebSocket-Key"] == "")
73 return {};
74
75 // FIXME link to existing implementation if we want this
76
77 std::string serverAccept = "fixme"; // crypto::websocketsHandshakeEncodeKey(
78 // params.headers["Sec-WebSocket-Key"]
79 //);
80
81 tcpClient->send("HTTP/1.1 101 Switching Protocols\r\n");
82 tcpClient->send("Connection: Upgrade\r\n");
83 tcpClient->send("Upgrade: websocket\r\n");
84 tcpClient->send("Sec-WebSocket-Version: 13\r\n");
85 tcpClient->send("Sec-WebSocket-Accept: " + serverAccept + "\r\n");
86 tcpClient->send("\r\n");
87
88 WebsocketsClient wsClient(tcpClient);
89 // Don't use masking from server to client (according to RFC)
90 wsClient.setUseMasking(false);
91 return wsClient;
92}
93
94WebsocketsServer::~WebsocketsServer() { this->_server->close(); }
95
96} // namespace websockets
FLASHMEM ParsedHandshakeParams recvHandshakeRequest(network::TcpClient &client)
Definition server.cpp:22
std::map< std::string, std::string > headers
Definition server.cpp:18