in Gems/Metastream/Code/Source/CivetHttpServer.cpp [86:150]
bool handleData([[maybe_unused]] CivetServer *server, struct mg_connection *conn, int bits, char *data, size_t data_len) override
{
// RFC for websockets: https://tools.ietf.org/html/rfc6455
// bits represents the websocket frame flags
// we check if this is the final fragment (FIN)
if (bits & 0x80) {
bits &= 0x7f; // extract only the opcode
switch (bits) {
case WEBSOCKET_OPCODE_CONTINUATION:
break;
case WEBSOCKET_OPCODE_TEXT:
{
std::map<std::string, std::string> filters;
if (data != nullptr)
{
filters = BaseHttpServer::TokenizeQuery(std::string(data, data_len).c_str());
}
HttpResponse response;
auto table = filters.find("table");
if (table != filters.end())
{
auto key = filters.find("key");
if (key != filters.end())
{
std::vector<std::string> keyList = BaseHttpServer::SplitValueList(key->second, ',');
response = m_parent->GetDataValues(table->second, keyList);
}
else
{
response = m_parent->GetDataKeys(table->second);
}
}
else
{
response = m_parent->GetDataTables();
}
std::string payload(response.body);
mg_websocket_write(conn, WEBSOCKET_OPCODE_TEXT, payload.c_str(), payload.size() + 1);
break;
}
case WEBSOCKET_OPCODE_BINARY:
break;
case WEBSOCKET_OPCODE_CONNECTION_CLOSE:
/* If client initiated close, respond with close message in acknowledgment */
mg_websocket_write(conn, WEBSOCKET_OPCODE_CONNECTION_CLOSE, "", 0);
return 0; /* time to close the connection */
break;
case WEBSOCKET_OPCODE_PING:
/* client sent PING, respond with PONG */
mg_websocket_write(conn, WEBSOCKET_OPCODE_PONG, "", 0);
break;
case WEBSOCKET_OPCODE_PONG:
/* received PONG to our PING, no action */
break;
default:
AZ_Error("Metastream", false, "Unknown flags: %02x\n", bits);
break;
}
}
return true;
}