1
0
mirror of https://github.com/stefanocasazza/ULib.git synced 2025-09-28 19:05:55 +08:00

add U_WS_MESSAGE_TYPE_BROTLI

This commit is contained in:
stefanocasazza 2018-10-09 16:57:44 +02:00
parent be31bfab31
commit f3c8c10470
6 changed files with 59 additions and 20 deletions

View File

@ -67,7 +67,7 @@ public:
U_RETURN(false);
}
bool sendMessage(const UString& msg, int type = U_WS_MESSAGE_TYPE_TEXT)
bool sendMessage(const UString& msg, int type = U_WS_MESSAGE_TYPE_TEXT) // U_WS_MESSAGE_TYPE_BROTLI
{
U_TRACE(0, "UWebSocketClient::sendMessage(%V,%d)", msg.rep, type)

View File

@ -19,6 +19,7 @@
#define U_WS_MESSAGE_TYPE_INVALID -1
#define U_WS_MESSAGE_TYPE_TEXT 0
#define U_WS_MESSAGE_TYPE_BROTLI 6
#define U_WS_MESSAGE_TYPE_BINARY 128
#define U_WS_MESSAGE_TYPE_CLOSE 255
#define U_WS_MESSAGE_TYPE_PING 256
@ -27,6 +28,7 @@
#define U_WS_OPCODE_CONTINUATION 0x0
#define U_WS_OPCODE_TEXT 0x1
#define U_WS_OPCODE_BINARY 0x2
#define U_WS_OPCODE_BROTLI 0x6
#define U_WS_OPCODE_CLOSE 0x8
#define U_WS_OPCODE_PING 0x9
#define U_WS_OPCODE_PONG 0xA

View File

@ -76,7 +76,7 @@ if (isMessageForAnotherUSP(*UWebSocket::message))
}
else if (isMessageForAnotherWebSocket(*UWebSocket::message))
{
if (wsclient->connectServer(U_STRING_FROM_CONSTANT("ws://localhost:8888/websocket"))) (void) wsclient->sendMessage(*UWebSocket::message);
if (wsclient->connectServer(U_STRING_FROM_CONSTANT("ws://localhost:8888/websocket"))) (void) wsclient->sendMessage(*UWebSocket::message, U_WS_MESSAGE_TYPE_BROTLI);
// ...
}

View File

@ -83,8 +83,6 @@ USocket::USocket(bool bSocketIsIPv6, int fd)
U_TRACE_CTOR(0, USocket, "%b,%d", bSocketIsIPv6, fd)
flags = O_RDWR;
iState = CLOSE;
iSockDesc = fd;
iLocalPort =
iRemotePort = 0;
@ -94,9 +92,21 @@ USocket::USocket(bool bSocketIsIPv6, int fd)
U_socket_IPv6(this) = false;
#endif
U_socket_Type(this) = 0;
U_socket_LocalSet(this) = false;
if (fd == -1)
{
iSockDesc = -1;
iState = CLOSE;
U_socket_Type(this) = 0;
}
else
{
iSockDesc = fd;
iState = CONNECT;
U_socket_Type(this) = SK_STREAM;
}
#ifdef _MSWINDOWS_
fh = fd;
#endif

View File

@ -175,7 +175,7 @@ loop:
{
status_code = U_WS_STATUS_CODE_INTERNAL_ERROR;
U_RETURN(status_code);
U_RETURN(U_WS_STATUS_CODE_INTERNAL_ERROR);
}
block = (unsigned char*) rbuffer->data();
@ -199,7 +199,7 @@ loop:
status_code = U_WS_STATUS_CODE_PROTOCOL_ERROR;
U_RETURN(status_code);
U_RETURN(U_WS_STATUS_CODE_PROTOCOL_ERROR);
}
fin = U_WS_FRAME_GET_FIN( block[block_offset]);
@ -217,7 +217,7 @@ loop:
status_code = U_WS_STATUS_CODE_PROTOCOL_ERROR;
U_RETURN(status_code);
U_RETURN(U_WS_STATUS_CODE_PROTOCOL_ERROR);
}
frame = &UWebSocket::control_frame;
@ -236,7 +236,7 @@ loop:
status_code = U_WS_STATUS_CODE_PROTOCOL_ERROR;
U_RETURN(status_code);
U_RETURN(U_WS_STATUS_CODE_PROTOCOL_ERROR);
}
frame->opcode = opcode;
@ -249,7 +249,7 @@ loop:
status_code = U_WS_STATUS_CODE_PROTOCOL_ERROR;
U_RETURN(status_code);
U_RETURN(U_WS_STATUS_CODE_PROTOCOL_ERROR);
}
frame->fin = fin;
@ -295,7 +295,7 @@ loop:
status_code = U_WS_STATUS_CODE_PROTOCOL_ERROR;
U_RETURN(status_code);
U_RETURN(U_WS_STATUS_CODE_PROTOCOL_ERROR);
}
framing_state = U_WS_DATA_FRAMING_PAYLOAD_LENGTH_EXT; // 3
@ -329,7 +329,7 @@ loop:
status_code = U_WS_STATUS_CODE_MESSAGE_TOO_LARGE; // Invalid payload length
U_RETURN(status_code);
U_RETURN(U_WS_STATUS_CODE_MESSAGE_TOO_LARGE);
}
if (masking == 0)
@ -490,7 +490,7 @@ loop:
status_code = U_WS_STATUS_CODE_INVALID_UTF8;
U_RETURN(status_code);
U_RETURN(U_WS_STATUS_CODE_INVALID_UTF8);
}
message_type = U_WS_MESSAGE_TYPE_TEXT;
@ -498,6 +498,7 @@ loop:
break;
case U_WS_OPCODE_BINARY: message_type = U_WS_MESSAGE_TYPE_BINARY; break;
case U_WS_OPCODE_BROTLI: message_type = U_WS_MESSAGE_TYPE_BROTLI; break;
case U_WS_OPCODE_CLOSE:
{
@ -505,7 +506,7 @@ loop:
status_code = U_WS_STATUS_CODE_OK;
U_RETURN(status_code);
U_RETURN(U_WS_STATUS_CODE_OK);
}
case U_WS_OPCODE_PING:
@ -514,7 +515,7 @@ loop:
{
status_code = U_WS_STATUS_CODE_PROTOCOL_ERROR;
U_RETURN(status_code);
U_RETURN(U_WS_STATUS_CODE_PROTOCOL_ERROR);
}
}
break;
@ -527,7 +528,7 @@ loop:
status_code = U_WS_STATUS_CODE_PROTOCOL_ERROR;
U_RETURN(status_code);
U_RETURN(U_WS_STATUS_CODE_PROTOCOL_ERROR);
}
}
@ -547,7 +548,15 @@ loop:
status_code = U_WS_STATUS_CODE_OK;
U_RETURN(status_code);
# ifdef USE_LIBBROTLI
if (message_type == U_WS_MESSAGE_TYPE_BROTLI &&
UStringExt::isBrotli(*message))
{
*message = UStringExt::unbrotli(*message);
}
# endif
U_RETURN(U_WS_STATUS_CODE_OK);
}
frame->application_data = U_NULLPTR;
@ -569,7 +578,7 @@ loop:
status_code = U_WS_STATUS_CODE_PROTOCOL_ERROR;
U_RETURN(status_code);
U_RETURN(U_WS_STATUS_CODE_PROTOCOL_ERROR);
}
}
}
@ -591,7 +600,7 @@ bool UWebSocket::sendData(USocket* socket, int type, const char* data, uint32_t
uint8_t opcode, masking_key[4];
uint32_t header_length = 6U + (len > 125U ? 2U : 0) + (len > 0xffff ? 8U : 0), ncount = header_length + len;
UString tmp(ncount);
UString tmp(ncount), compressed;
unsigned char* header = (unsigned char*)tmp.data();
*((uint32_t*)masking_key) = u_get_num_random();
@ -603,6 +612,24 @@ bool UWebSocket::sendData(USocket* socket, int type, const char* data, uint32_t
opcode = U_WS_OPCODE_TEXT;
break;
case U_WS_MESSAGE_TYPE_BROTLI:
{
opcode = U_WS_OPCODE_TEXT;
# ifdef USE_LIBBROTLI
if (compressed = UStringExt::brotli(data, len, (U_PARALLELIZATION_CHILD ? BROTLI_MAX_QUALITY : UHTTP::brotli_level_for_dynamic_content)))
{
opcode = U_WS_OPCODE_BROTLI;
len = compressed.size();
data = compressed.data();
U_SRV_LOG("websocket compressed request: %u bytes - (%u%%) brotli compression ratio", len, 100-UStringExt::ratio);
}
# endif
}
break;
case U_WS_MESSAGE_TYPE_PING: opcode = U_WS_OPCODE_PING; break;
case U_WS_MESSAGE_TYPE_PONG: opcode = U_WS_OPCODE_PONG; break;
case U_WS_MESSAGE_TYPE_BINARY: opcode = U_WS_OPCODE_BINARY; break;

View File

@ -1 +1 @@
0424
0432