mirror of
https://github.com/hyperion-project/hyperion.ng.git
synced 2025-03-01 10:33:28 +00:00
Json write (#313)
* always output latest version of config file to webui * fix permissions after default config export * tune code * set permissions for exported effects * use qt setperm instead of chmod update effects code style a bit * add fallback when config is not readable * ui: when sending config, convert to utf8 to save size and avoid jumbo frames (todo: minify it) jsonclient: add some constants for websocket frames (taken from https://github.com/zaphoyd/websocketpp/blob/master/websocketpp/frame.hpp) * webui: refactory of websocket connector sended json data is always convert to utf8
This commit is contained in:
@@ -74,7 +74,8 @@ void JsonClientConnection::readData()
|
||||
{
|
||||
// websocket mode, data frame
|
||||
handleWebSocketFrame();
|
||||
} else
|
||||
}
|
||||
else
|
||||
{
|
||||
// might be a handshake request or raw socket data
|
||||
if(_receiveBuffer.contains("Upgrade: websocket"))
|
||||
@@ -104,24 +105,25 @@ void JsonClientConnection::readData()
|
||||
|
||||
void JsonClientConnection::handleWebSocketFrame()
|
||||
{
|
||||
if ((_receiveBuffer.at(0) & 0x80) == 0x80)
|
||||
if ((_receiveBuffer.at(0) & BHB0_FIN) == BHB0_FIN)
|
||||
{
|
||||
// final bit found, frame complete
|
||||
quint8 * maskKey = NULL;
|
||||
quint8 opCode = _receiveBuffer.at(0) & 0x0F;
|
||||
bool isMasked = (_receiveBuffer.at(1) & 0x80) == 0x80;
|
||||
quint64 payloadLength = _receiveBuffer.at(1) & 0x7F;
|
||||
quint8 opCode = _receiveBuffer.at(0) & BHB0_OPCODE;
|
||||
bool isMasked = (_receiveBuffer.at(1) & BHB0_FIN) == BHB0_FIN;
|
||||
quint64 payloadLength = _receiveBuffer.at(1) & BHB1_PAYLOAD;
|
||||
quint32 index = 2;
|
||||
|
||||
switch (payloadLength)
|
||||
{
|
||||
case 126:
|
||||
case payload_size_code_16bit:
|
||||
payloadLength = ((_receiveBuffer.at(2) << 8) & 0xFF00) | (_receiveBuffer.at(3) & 0xFF);
|
||||
index += 2;
|
||||
break;
|
||||
case 127:
|
||||
case payload_size_code_64bit:
|
||||
payloadLength = 0;
|
||||
for (uint i=0; i < 8; i++) {
|
||||
for (uint i=0; i < 8; i++)
|
||||
{
|
||||
payloadLength |= ((quint64)(_receiveBuffer.at(index+i) & 0xFF)) << (8*(7-i));
|
||||
}
|
||||
index += 8;
|
||||
@@ -144,7 +146,7 @@ void JsonClientConnection::handleWebSocketFrame()
|
||||
// check the type of data frame
|
||||
switch (opCode)
|
||||
{
|
||||
case 0x01:
|
||||
case OPCODE::TEXT:
|
||||
{
|
||||
// frame contains text, extract it
|
||||
QByteArray result = _receiveBuffer.mid(index, payloadLength);
|
||||
@@ -167,25 +169,26 @@ void JsonClientConnection::handleWebSocketFrame()
|
||||
handleMessage(QString(result));
|
||||
}
|
||||
break;
|
||||
case 0x08:
|
||||
case OPCODE::CLOSE:
|
||||
{
|
||||
// close request, confirm
|
||||
quint8 close[] = {0x88, 0};
|
||||
quint8 close[] = {0x88, 0};
|
||||
_socket->write((const char*)close, 2);
|
||||
_socket->flush();
|
||||
_socket->close();
|
||||
}
|
||||
break;
|
||||
case 0x09:
|
||||
case OPCODE::PING:
|
||||
{
|
||||
// ping received, send pong
|
||||
quint8 pong[] = {0x0A, 0};
|
||||
quint8 pong[] = {OPCODE::PONG, 0};
|
||||
_socket->write((const char*)pong, 2);
|
||||
_socket->flush();
|
||||
}
|
||||
break;
|
||||
}
|
||||
} else
|
||||
}
|
||||
else
|
||||
{
|
||||
Error(_log, "Someone is sending very big messages over several frames... it's not supported yet");
|
||||
quint8 close[] = {0x88, 0};
|
||||
@@ -1165,7 +1168,7 @@ void JsonClientConnection::handleConfigSetCommand(const QJsonObject& message, co
|
||||
|
||||
QJsonObject hyperionConfig = message["config"].toObject();
|
||||
QJsonFactory::writeJson(QString::fromStdString(_hyperion->getConfigFileName()), hyperionConfig);
|
||||
|
||||
|
||||
sendSuccessReply(command, tan);
|
||||
}
|
||||
} else
|
||||
|
@@ -17,6 +17,63 @@
|
||||
|
||||
class ImageProcessor;
|
||||
|
||||
|
||||
/// Constants and utility functions related to WebSocket opcodes
|
||||
/**
|
||||
* WebSocket Opcodes are 4 bits. See RFC6455 section 5.2.
|
||||
*/
|
||||
namespace OPCODE {
|
||||
enum value {
|
||||
CONTINUATION = 0x0,
|
||||
TEXT = 0x1,
|
||||
BINARY = 0x2,
|
||||
RSV3 = 0x3,
|
||||
RSV4 = 0x4,
|
||||
RSV5 = 0x5,
|
||||
RSV6 = 0x6,
|
||||
RSV7 = 0x7,
|
||||
CLOSE = 0x8,
|
||||
PING = 0x9,
|
||||
PONG = 0xA,
|
||||
CONTROL_RSVB = 0xB,
|
||||
CONTROL_RSVC = 0xC,
|
||||
CONTROL_RSVD = 0xD,
|
||||
CONTROL_RSVE = 0xE,
|
||||
CONTROL_RSVF = 0xF
|
||||
};
|
||||
|
||||
/// Check if an opcode is reserved
|
||||
/**
|
||||
* @param v The opcode to test.
|
||||
* @return Whether or not the opcode is reserved.
|
||||
*/
|
||||
inline bool reserved(value v) {
|
||||
return (v >= RSV3 && v <= RSV7) || (v >= CONTROL_RSVB && v <= CONTROL_RSVF);
|
||||
}
|
||||
|
||||
/// Check if an opcode is invalid
|
||||
/**
|
||||
* Invalid opcodes are negative or require greater than 4 bits to store.
|
||||
*
|
||||
* @param v The opcode to test.
|
||||
* @return Whether or not the opcode is invalid.
|
||||
*/
|
||||
inline bool invalid(value v) {
|
||||
return (v > 0xF || v < 0);
|
||||
}
|
||||
|
||||
/// Check if an opcode is for a control frame
|
||||
/**
|
||||
* @param v The opcode to test.
|
||||
* @return Whether or not the opcode is a control opcode.
|
||||
*/
|
||||
inline bool is_control(value v) {
|
||||
return v >= 0x8;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
///
|
||||
/// The Connection object created by \a JsonServer when a new connection is establshed
|
||||
///
|
||||
@@ -228,7 +285,6 @@ private:
|
||||
///
|
||||
void forwardJsonMessage(const QJsonObject & message);
|
||||
|
||||
private:
|
||||
///
|
||||
/// Check if a JSON messag is valid according to a given JSON schema
|
||||
///
|
||||
@@ -270,4 +326,16 @@ private:
|
||||
QJsonObject _streaming_logging_reply;
|
||||
bool _streaming_logging_activated;
|
||||
|
||||
// masks for fields in the basic header
|
||||
static uint8_t const BHB0_OPCODE = 0x0F;
|
||||
static uint8_t const BHB0_RSV3 = 0x10;
|
||||
static uint8_t const BHB0_RSV2 = 0x20;
|
||||
static uint8_t const BHB0_RSV1 = 0x40;
|
||||
static uint8_t const BHB0_FIN = 0x80;
|
||||
|
||||
static uint8_t const BHB1_PAYLOAD = 0x7F;
|
||||
static uint8_t const BHB1_MASK = 0x80;
|
||||
|
||||
static uint8_t const payload_size_code_16bit = 0x7E; // 126
|
||||
static uint8_t const payload_size_code_64bit = 0x7F; // 127
|
||||
};
|
||||
|
Reference in New Issue
Block a user