Skip to content

Commit ef19e40

Browse files
author
Mikhail Ilyin
committed
Add setting which enables or disables UTF8 check
1 parent a63fd65 commit ef19e40

File tree

2 files changed

+27
-9
lines changed

2 files changed

+27
-9
lines changed

src/ws.c

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -717,9 +717,10 @@ int ws_init(WebSocket *ws, int srv)
717717
return -1;
718718

719719
memset(ws, 0, sizeof(*ws));
720-
ws->srv = srv;
720+
ws->srv = srv;
721721
ws->i_buf = p;
722722
ws->o_buf = p + WS_BUF_SIZE;
723+
ws->utf8_on = 1;
723724

724725
if (!srv) {
725726
ws->sec = (char *)p + WS_BUF_SIZE * 2;
@@ -732,6 +733,7 @@ int ws_init(WebSocket *ws, int srv)
732733
void ws_deinit(WebSocket *ws)
733734
{
734735
free(ws->i_buf);
736+
memset(ws, sizeof(*ws), 0);
735737
}
736738

737739
void ws_set_bio(WebSocket *ws, void *opaque,
@@ -908,9 +910,11 @@ ssize_t ws_txt_write(WebSocket *ws, const void *buf, size_t n)
908910
if (!n)
909911
return 0;
910912

911-
rc = utf8len(buf, n);
912-
if (rc <= 0)
913-
return rc == 0 ? WS_E_UTF8_INCOPMLETE : WS_E_NON_UTF8;
913+
if (ws->utf8_on) {
914+
rc = utf8len(buf, n);
915+
if (rc <= 0)
916+
return rc == 0 ? WS_E_UTF8_INCOPMLETE : WS_E_NON_UTF8;
917+
}
914918

915919
return ws_write(ws, OP_TEXT, buf, rc);
916920
}
@@ -952,9 +956,11 @@ int ws_close(WebSocket *ws, uint16_t ecode, const void *buf, size_t n)
952956

953957
put_u16(data, ecode);
954958
if (n > 0) {
955-
rc = utf8len(buf, n);
956-
if (rc <= 0 || (size_t)rc != n)
957-
return WS_E_NON_UTF8;
959+
if (ws->utf8_on) {
960+
rc = utf8len(buf, n);
961+
if (rc <= 0 || (size_t)rc != n)
962+
return WS_E_NON_UTF8;
963+
}
958964
memcpy(data + 2, buf, n);
959965
}
960966

@@ -1103,8 +1109,9 @@ static ssize_t ws_handler(WebSocket *ws, union ws_arg *arg, int hnd)
11031109
ws->i_left -= 2;
11041110
}
11051111

1106-
if ((ws->op == OP_CLOSE && ws->i_left > 0) ||
1107-
ws->op == OP_TEXT) {
1112+
if (ws->utf8_on &&
1113+
((ws->op == OP_CLOSE && ws->i_left > 0) ||
1114+
ws->op == OP_TEXT)) {
11081115
rc = utf8len(ws->i_data, ws->i_left);
11091116
if (rc < 0)
11101117
return WS_E_NON_UTF8;
@@ -1197,3 +1204,8 @@ void ws_set_data_limit(WebSocket *ws, size_t limit)
11971204
ws->limit = limit;
11981205
}
11991206

1207+
void ws_set_check_utf8(WebSocket *ws, int v)
1208+
{
1209+
ws->utf8_on = v ? 1 : 0;
1210+
}
1211+

src/ws.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ struct WebSocket {
1414
unsigned charsrv;
1515
unsigned charop;
1616
unsigned charcont;
17+
unsigned charutf8_on;
1718
interr;
1819
unsigned char*ctrl;
1920
unsigned charctrlsz;
@@ -49,6 +50,8 @@ void ws_deinit(WebSocket *ws);
4950
ssize_t ws_txt_write(WebSocket *ws, const void *buf, size_t n);
5051
ssize_t ws_bin_write(WebSocket *ws, const void *buf, size_t n);
5152

53+
/* ws_read and ws_parse garantie to return utf8 complete
54+
* data for TEXT frame. */
5255
int ws_read(WebSocket *ws, void *buf, size_t n, int *txt);
5356
int ws_parse(WebSocket *ws, void *opaque,
5457
void (*hnd)(void *opaque, const void *buf, size_t n, int txt));
@@ -66,6 +69,9 @@ void ws_set_bio(WebSocket *ws, void *opaque,
6669

6770
void ws_set_data_limit(WebSocket *ws, size_t limit);
6871

72+
/* UTF-8 check is enabled by default. */
73+
void ws_set_check_utf8(WebSocket *ws, int v);
74+
6975
#define WS_E_FAULT_FRAME-0x1000
7076
#define WS_E_BAD_LEN-0x1001
7177
#define WS_E_NON_UTF8-0x1002

0 commit comments

Comments
 (0)