diff options
author | Paul Sokolovsky <pfalcon@users.sourceforge.net> | 2016-04-11 14:07:57 +0300 |
---|---|---|
committer | Paul Sokolovsky <pfalcon@users.sourceforge.net> | 2016-04-11 14:07:57 +0300 |
commit | f8fb4470a04ee15d2fe2300c2749ee41602a176b (patch) | |
tree | fed6b7c863abcd2980c449440aa802e223412455 | |
parent | 7063210014a7ef82afaabaf0f18ffa0cd7efd61f (diff) | |
download | micropython-f8fb4470a04ee15d2fe2300c2749ee41602a176b.tar.gz micropython-f8fb4470a04ee15d2fe2300c2749ee41602a176b.zip |
extmod/modwebsocket: write(): Support write size beyond 125 bytes.
-rw-r--r-- | extmod/modwebsocket.c | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/extmod/modwebsocket.c b/extmod/modwebsocket.c index 3175c61671..78bbe6d13e 100644 --- a/extmod/modwebsocket.c +++ b/extmod/modwebsocket.c @@ -180,8 +180,18 @@ STATIC mp_uint_t websocket_read(mp_obj_t self_in, void *buf, mp_uint_t size, int STATIC mp_uint_t websocket_write(mp_obj_t self_in, const void *buf, mp_uint_t size, int *errcode) { mp_obj_websocket_t *self = self_in; - assert(size < 126); - byte header[] = {0x80 | (self->opts & FRAME_OPCODE_MASK), size}; + assert(size < 0x10000); + byte header[4] = {0x80 | (self->opts & FRAME_OPCODE_MASK)}; + int hdr_sz; + if (size < 126) { + header[1] = size; + hdr_sz = 2; + } else { + header[1] = 126; + header[2] = size >> 8; + header[3] = size & 0xff; + hdr_sz = 4; + } mp_obj_t dest[3]; if (self->opts & BLOCKING_WRITE) { @@ -190,7 +200,7 @@ STATIC mp_uint_t websocket_write(mp_obj_t self_in, const void *buf, mp_uint_t si mp_call_method_n_kw(1, 0, dest); } - mp_uint_t out_sz = mp_stream_writeall(self->sock, header, sizeof(header), errcode); + mp_uint_t out_sz = mp_stream_writeall(self->sock, header, hdr_sz, errcode); if (out_sz != MP_STREAM_ERROR) { out_sz = mp_stream_writeall(self->sock, buf, size, errcode); } |