@@ -717,9 +717,10 @@ int ws_init(WebSocket *ws, int srv)
717717return -1 ;
718718
719719memset (ws , 0 , sizeof (* ws ));
720- ws -> srv = srv ;
720+ ws -> srv = srv ;
721721ws -> i_buf = p ;
722722ws -> o_buf = p + WS_BUF_SIZE ;
723+ ws -> utf8_on = 1 ;
723724
724725if (!srv ) {
725726ws -> sec = (char * )p + WS_BUF_SIZE * 2 ;
@@ -732,6 +733,7 @@ int ws_init(WebSocket *ws, int srv)
732733void ws_deinit (WebSocket * ws )
733734{
734735free (ws -> i_buf );
736+ memset (ws , sizeof (* ws ), 0 );
735737}
736738
737739void ws_set_bio (WebSocket * ws , void * opaque ,
@@ -908,9 +910,11 @@ ssize_t ws_txt_write(WebSocket *ws, const void *buf, size_t n)
908910if (!n )
909911return 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
915919return 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
953957put_u16 (data , ecode );
954958if (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+ }
958964memcpy (data + 2 , buf , n );
959965}
960966
@@ -1103,8 +1109,9 @@ static ssize_t ws_handler(WebSocket *ws, union ws_arg *arg, int hnd)
11031109ws -> 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 )) {
11081115rc = utf8len (ws -> i_data , ws -> i_left );
11091116if (rc < 0 )
11101117return WS_E_NON_UTF8 ;
@@ -1197,3 +1204,8 @@ void ws_set_data_limit(WebSocket *ws, size_t limit)
11971204ws -> limit = limit ;
11981205}
11991206
1207+ void ws_set_check_utf8 (WebSocket * ws , int v )
1208+ {
1209+ ws -> utf8_on = v ? 1 : 0 ;
1210+ }
1211+
0 commit comments