1
0
Fork 0
mirror of https://github.com/warmcat/libwebsockets.git synced 2025-03-09 00:00:04 +01:00

write client frames the new way for 07

Signed-off-by: Andy Green <andy@warmcat.com>
This commit is contained in:
Andy Green 2011-04-24 06:04:03 +01:00
parent 33872cd376
commit 4e752248eb

View file

@ -1244,6 +1244,9 @@ int libwebsocket_write(struct libwebsocket *wsi, unsigned char *buf,
int shift = 7;
struct lws_tokens eff_buf;
int ret;
int masked_7 = wsi->mode == LWS_CONNMODE_WS_CLIENT;
unsigned char *dropmask = NULL;
unsigned char is_masked_bit = 0;
if (len == 0 && protocol != LWS_WRITE_CLOSE) {
fprintf(stderr, "zero length libwebsocket_write attempt\n");
@ -1292,10 +1295,16 @@ int libwebsocket_write(struct libwebsocket *wsi, unsigned char *buf,
post = 1;
break;
case 7:
if (masked7) {
pre -= 4;
dropmask = &buf[pre];
is_masked_bit = 0x80;
}
/* fallthru */
case 4:
case 5:
case 6:
case 7:
switch (protocol & 0xf) {
case LWS_WRITE_TEXT:
n = LWS_WS_OPCODE_04__TEXT_FRAME;
@ -1376,18 +1385,18 @@ int libwebsocket_write(struct libwebsocket *wsi, unsigned char *buf,
if (len < 126) {
buf[pre - 2] = n;
buf[pre - 1] = len;
buf[pre - 1] = len | is_masked_bit;
pre += 2;
} else {
if (len < 65536) {
buf[pre - 4] = n;
buf[pre - 3] = 126;
buf[pre - 3] = 126 | is_masked_bit;
buf[pre - 2] = len >> 8;
buf[pre - 1] = len;
pre += 4;
} else {
buf[pre - 10] = n;
buf[pre - 9] = 127;
buf[pre - 9] = 127 | is_masked_bit;
#if defined __LP64__
buf[pre - 8] = (len >> 56) & 0x7f;
buf[pre - 7] = len >> 48;
@ -1445,12 +1454,17 @@ int libwebsocket_write(struct libwebsocket *wsi, unsigned char *buf,
for (n = 0; n < (len + pre + post); n++)
buf[n - pre] = wsi->xor_mask(wsi, buf[n - pre]);
if (wsi->ietf_spec_revision < 7) {
/* make space for the frame nonce in clear */
pre += 4;
/* make space for the frame nonce in clear */
pre += 4;
dropmask = &buf[0 - pre];
}
if (dropmask)
/* copy the frame nonce into place */
memcpy(dropmask, wsi->frame_masking_nonce_04, 4);
/* copy the frame nonce into place */
memcpy(&buf[0 - pre], wsi->frame_masking_nonce_04, 4);
} else {
/* make space for the frame nonce in clear */
pre += 4;