fix-rx-action-76.patch
authorAndy Green <andy@warmcat.com>
Thu, 11 Nov 2010 09:22:22 +0000 (09:22 +0000)
committerAndy Green <andy@warmcat.com>
Thu, 11 Nov 2010 09:22:22 +0000 (09:22 +0000)
Signed-off-by: Andy Green <andy@warmcat.com>
Makefile.am
Makefile.in
lib/parsers.c
lib/private-libwebsockets.h
test-server/test-server.c

index d206cec..9c544c3 100644 (file)
@@ -1,2 +1,3 @@
-SUBDIRS=lib test-server
+SUBDIRS=lib test-server 
+#communal-server
 
index c079e3e..1e2e098 100644 (file)
@@ -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.
index e52e443..abfa53d 100644 (file)
@@ -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;
 }
index 4009064..bf05758 100644 (file)
@@ -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;
index 755d932..74c3f61 100644 (file)
@@ -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 <andy@warmcat.com> "
-                                                      "licensed under GPL2\n");
+                       "(C) Copyright 2010 Andy Green <andy@warmcat.com> "
+                                                   "licensed under LGPL2.1\n");
        
        while (n >= 0) {
                n = getopt_long(argc, argv, "hp:r:", options, NULL);