Module: sip-router
Branch: pd/websocket
Commit: 69c264b19f8b42e4700f9f8523912cf29eeadde5
URL:
http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=69c264b…
Author: Peter Dunkley <peter.dunkley(a)crocodile-rcs.com>
Committer: Peter Dunkley <peter.dunkley(a)crocodile-rcs.com>
Date: Sun Jun 17 21:30:33 2012 +0100
core: Fixed a problem with receiving WebSocket frames
- If two frames were pulled from the buffer at the same time the second
wasn't being processed.
---
tcp_read.c | 21 ++++++++++++---------
1 files changed, 12 insertions(+), 9 deletions(-)
diff --git a/tcp_read.c b/tcp_read.c
index 5c45469..d8b4653 100644
--- a/tcp_read.c
+++ b/tcp_read.c
@@ -1018,14 +1018,18 @@ int msrp_process_msg(char* tcpbuf, unsigned int len,
#ifdef READ_WS
static int tcp_read_ws(struct tcp_connection *c, int* read_flags)
{
- int bytes, pos, mask_present;
+ int bytes, size, pos, mask_present;
unsigned int len;
char *p;
struct tcp_req *r;
r=&c->req;
if (unlikely(r->parsed < r->pos))
+ {
+ LM_ERR("next frame...\n");
bytes = 0;
+ size = r->pos - r->parsed;
+ }
else
{
#ifdef USE_TLS
@@ -1035,10 +1039,10 @@ static int tcp_read_ws(struct tcp_connection *c, int* read_flags)
#endif
bytes = tcp_read(c, read_flags);
- LM_INFO("read %d bytes\n", bytes);
-
if (bytes <= 0)
return 0;
+
+ size = bytes;
}
p = r->parsed;
@@ -1069,7 +1073,7 @@ static int tcp_read_ws(struct tcp_connection *c, int* read_flags)
*/
/* Process first two bytes */
- if (bytes < pos + 2)
+ if (size < pos + 2)
goto skip;
pos++;
mask_present = p[pos] & 0x80;
@@ -1078,7 +1082,7 @@ static int tcp_read_ws(struct tcp_connection *c, int* read_flags)
/* Work out real length */
if (len == 126)
{
- if (bytes < pos + 2)
+ if (size < pos + 2)
goto skip;
len = ((p[pos + 0] & 0xff) << 8)
@@ -1087,7 +1091,7 @@ static int tcp_read_ws(struct tcp_connection *c, int* read_flags)
}
else if (len == 127)
{
- if (bytes < pos + 8)
+ if (size < pos + 8)
goto skip;
/* Only decoding the last four bytes of the length...
@@ -1103,17 +1107,16 @@ static int tcp_read_ws(struct tcp_connection *c, int* read_flags)
/* Skip mask */
if (mask_present)
{
- if (bytes < pos + 4)
+ if (size < pos + 4)
goto skip;
pos += 4;
}
/* Now check the whole message has been received */
- if (bytes < pos + len)
+ if (size < pos + len)
goto skip;
pos += len;
- r->bytes_to_go = bytes - pos;
r->flags |= F_TCP_REQ_COMPLETE;
r->parsed = &p[pos];