Websoket fragments
Час добрый гуру! Есть кто тут работал над реализацией "веб" сокет сервера? Ни как не могу победить эти фреймы. Делаю всё следуя спецификации. Но у меня всё равно возникают сложнасти. Вот к примеру
let finmes: number = (data[0] & 0x80) >>> 7 // 0 or 1 - fragment in message let opcode: number = (data[0] & 0x0f) // 0x0 | 0x1 | 0x2 | ... let optype: string = getOpcodeType(opcode) // frame | text | ... let ismask: number = (data[1] & 0x80) >>> 7 // 0 or 1 let length: number = (data[1] & 0x7f) let offset: number = 2 // info // read 16 bit if (length === 0x7e) { length = getLength16(data, offset) offset = offset + 2 // length } // read 32 bit if (length === 0x7f) { length = getLength32(data, offset) offset = offset + 8 // length } let mask: Buffer = data.slice(offset, offset + 4) offset = offset + 4 // mask let body: Buffer = data.slice(offset) for (let i = 0; i < body.length; i ++) body[i] ^= mask[i & 3] И вроде бы всё хорошо работает, но только при условии, если запрос не фрагментирован. Т.е. если прилетает 2 и более, естественно ошибка. Смотрел как реализован socketio & websocketjs, там же в целом путаюсь на каждом шагу. Не могу понять зачем выполнять чтение циклично и неужели последующие фреймы могут прервать выполнение цикла? В общем, простите мне мою безолаберность от того и пишу тут. Ну и ладно, проблема скорее в другом. Начал смотреть только FIN & OPCODE, в документации пишут: В случае если фреймов 2 и более то только у последнего фрейма будет FIN = 1, у первых же FIN = 0. Мне с вебморды прилетает всегда по разному, т.е. 1 - 3 могут придти с FIN = 1. А все остальные с FIN = 0. Т.е. бог с ним, с началом, как узнать где конец если последний приходит с FIN = 0? А если верить документации то должен приходить с FIN = 1. Т.е. если запрос из 5ти фрагметов, закономерно FIN должен выглядеть так: FINS = [0, 0, 0, 0, 1] - так ведь? А мне приходит по разному, может [1, 1, 1, 0, 0], может и [1, 0, 0, 1, 0] и даже так [0, 0, 0, 1, 0]. Так же, только у первого указан OPCODE, в моём случае произвольно, где то есть а где то нет. Буду очень благодарен участникам! 4ый день бьюсь. |
Цитата:
|
Вот как это вижу я: GitHub(typescript document)
|
Часовой пояс GMT +3, время: 16:16. |