From 6452f1eff619f5d18fa30ff2ea5422e38bb89d9a Mon Sep 17 00:00:00 2001 From: Andy Green Date: Thu, 11 Nov 2010 09:22:22 +0000 Subject: [PATCH] fix-rx-action-76.patch Signed-off-by: Andy Green --- Makefile.am | 3 ++- Makefile.in | 3 ++- lib/parsers.c | 27 +++++++++++++++++++++++---- lib/private-libwebsockets.h | 8 ++++++-- test-server/test-server.c | 4 ++-- 5 files changed, 35 insertions(+), 10 deletions(-) diff --git a/Makefile.am b/Makefile.am index d206cec..9c544c3 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,2 +1,3 @@ -SUBDIRS=lib test-server +SUBDIRS=lib test-server +#communal-server diff --git a/Makefile.in b/Makefile.in index c079e3e..1e2e098 100644 --- a/Makefile.in +++ b/Makefile.in @@ -211,7 +211,7 @@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ -SUBDIRS = lib test-server +SUBDIRS = lib test-server all: config.h $(MAKE) $(AM_MAKEFLAGS) all-recursive @@ -706,6 +706,7 @@ uninstall-am: mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ ps ps-am tags tags-recursive uninstall uninstall-am +#communal-server # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. diff --git a/lib/parsers.c b/lib/parsers.c index e52e443..abfa53d 100644 --- a/lib/parsers.c +++ b/lib/parsers.c @@ -210,6 +210,29 @@ static int libwebsocket_rx_sm(struct libwebsocket *wsi, unsigned char c) case 0: break; } + + if (c == 0) { + wsi->lws_rx_parse_state = LWS_RXPS_EAT_UNTIL_76_FF; + wsi->rx_user_buffer_head = 0; + } + break; + case LWS_RXPS_EAT_UNTIL_76_FF: + if (c == 0xff) { + wsi->lws_rx_parse_state = LWS_RXPS_NEW; + goto issue; + } + wsi->rx_user_buffer[LWS_SEND_BUFFER_PRE_PADDING + + (wsi->rx_user_buffer_head++)] = c; + + if (wsi->rx_user_buffer_head != MAX_USER_RX_BUFFER) + break; +issue: + if (wsi->callback) + wsi->callback(wsi, LWS_CALLBACK_RECEIVE, + &wsi->user_space[0], + &wsi->rx_user_buffer[LWS_SEND_BUFFER_PRE_PADDING], + wsi->rx_user_buffer_head); + wsi->rx_user_buffer_head = 0; break; case LWS_RXPS_SEEN_76_FF: if (c) @@ -254,10 +277,6 @@ int libwebsocket_interpret_incoming_packet(struct libwebsocket *wsi, LWS_RXPS_PAYLOAD_UNTIL_LENGTH_EXHAUSTED && n < len) if (libwebsocket_rx_sm(wsi, buf[n++]) < 0) return -1; - - if (n != len && wsi->callback) - wsi->callback(wsi, LWS_CALLBACK_RECEIVE, &wsi->user_space[0], - &buf[n], len - n); return -0; } diff --git a/lib/private-libwebsockets.h b/lib/private-libwebsockets.h index 4009064..bf05758 100644 --- a/lib/private-libwebsockets.h +++ b/lib/private-libwebsockets.h @@ -66,7 +66,7 @@ extern int use_ssl; #define LWS_MAX_HEADER_LEN 4096 #define LWS_INITIAL_HDR_ALLOC 256 #define LWS_ADDITIONAL_HDR_ALLOC 64 - +#define MAX_USER_RX_BUFFER 512 enum lws_connection_states { @@ -101,6 +101,7 @@ enum lws_rx_parse_state { LWS_RXPS_SEEN_76_FF, LWS_RXPS_PULLING_76_LENGTH, + LWS_RXPS_EAT_UNTIL_76_FF, LWS_RXPS_PAYLOAD_UNTIL_LENGTH_EXHAUSTED }; @@ -130,7 +131,10 @@ struct libwebsocket { enum lws_token_indexes parser_state; struct lws_tokens utf8_token[WSI_TOKEN_COUNT]; int ietf_spec_revision; - + char rx_user_buffer[LWS_SEND_BUFFER_PRE_PADDING + MAX_USER_RX_BUFFER + + LWS_SEND_BUFFER_POST_PADDING]; + int rx_user_buffer_head; + int sock; enum lws_rx_parse_state lws_rx_parse_state; diff --git a/test-server/test-server.c b/test-server/test-server.c index 755d932..74c3f61 100644 --- a/test-server/test-server.c +++ b/test-server/test-server.c @@ -170,8 +170,8 @@ int main(int argc, char **argv) LOCAL_RESOURCE_PATH"/libwebsockets-test-server.key.pem"; fprintf(stderr, "libwebsockets test server\n" - "Copyright 2010 Andy Green " - "licensed under GPL2\n"); + "(C) Copyright 2010 Andy Green " + "licensed under LGPL2.1\n"); while (n >= 0) { n = getopt_long(argc, argv, "hp:r:", options, NULL); -- 2.7.4