bool handleData()

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;
    }