summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorPaul Sokolovsky <pfalcon@users.sourceforge.net>2016-04-11 14:07:57 +0300
committerPaul Sokolovsky <pfalcon@users.sourceforge.net>2016-04-11 14:07:57 +0300
commitf8fb4470a04ee15d2fe2300c2749ee41602a176b (patch)
treefed6b7c863abcd2980c449440aa802e223412455
parent7063210014a7ef82afaabaf0f18ffa0cd7efd61f (diff)
downloadmicropython-f8fb4470a04ee15d2fe2300c2749ee41602a176b.tar.gz
micropython-f8fb4470a04ee15d2fe2300c2749ee41602a176b.zip
extmod/modwebsocket: write(): Support write size beyond 125 bytes.
-rw-r--r--extmod/modwebsocket.c16
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);
}