out - stored pointed to extracted data
olen - stored length of the extracted data
oleft - number of unread bytes pending to that belongs to this frame
- endp - stored pointer to data immediately following the parsed data, if
- there is more data in there. NULL if there's no more data.
+ more - if there is more data in there
flags - stored bitmask about the frame
Returns CURLE_AGAIN if there is only a partial frame in the buffer. Then it
unsigned char *wpkt, size_t ilen,
unsigned char **out, size_t *olen,
curl_off_t *oleft,
- unsigned char **endp,
+ bool *more,
unsigned int *flags)
{
bool fin;
*oleft = total - dataindex;
payloadsize = total - dataindex;
}
- else
+ else {
*oleft = 0;
+ if(plen > total)
+ /* there is another fragment after */
+ *more = TRUE;
+ }
/* point to the payload */
*out = &p[dataindex];
/* return the payload length */
*olen = payloadsize;
- wsp->usedbuf = total; /* number of bytes "used" from the buffer */
- *endp = &p[total];
+
+ /* number of bytes "used" from the buffer */
+ wsp->usedbuf = dataindex + payloadsize;
infof(data, "WS: received %zu bytes payload (%zu left)",
payloadsize, *oleft);
return CURLE_OK;
size_t flen = 0;
size_t wrote = 0;
CURLcode result;
- unsigned char *endp;
+ bool more; /* there's is more to parse in the buffer */
curl_off_t oleft;
decode:
-
+ more = FALSE;
oleft = ws->ws.frame.bytesleft;
if(!oleft) {
unsigned int recvflags;
result = ws_decode(data, (unsigned char *)buffer, nitems,
- &frame, &flen, &oleft, &endp, &recvflags);
+ &frame, &flen, &oleft, &more, &recvflags);
if(result == CURLE_AGAIN)
/* insufficient amount of data, keep it for later */
return nitems;
else {
if(nitems > (size_t)ws->ws.frame.bytesleft) {
nitems = ws->ws.frame.bytesleft;
- endp = (unsigned char *)&buffer[nitems];
+ more = TRUE;
}
else
- endp = NULL;
+ more = FALSE;
ws->ws.frame.offset += nitems;
ws->ws.frame.bytesleft -= nitems;
frame = (unsigned char *)buffer;
ws->ws.frame.offset += flen;
/* the websocket frame has been delivered */
ws_decode_clear(data);
- if(endp) {
+ if(more) {
/* there's more websocket data to deal with in the buffer */
- buffer = NULL; /* don't pass in the data again */
+ buffer = NULL; /* the buffer as been drained already */
goto decode;
}
}
if(bytes) {
unsigned char *out;
size_t olen;
- unsigned char *endp;
+ bool more;
unsigned int recvflags;
curl_off_t oleft = wsp->frame.bytesleft;
infof(data, "WS: got %u websocket bytes to decode", (int)bytes);
if(!oleft && !drain) {
result = ws_decode(data, (unsigned char *)inbuf, bytes,
- &out, &olen, &oleft, &endp, &recvflags);
+ &out, &olen, &oleft, &more, &recvflags);
if(result == CURLE_AGAIN)
/* a packet fragment only */
break;