diff --git a/lib/client.c b/lib/client.c index 3eb73e46..7d37b38d 100755 --- a/lib/client.c +++ b/lib/client.c @@ -723,17 +723,12 @@ check_accept: libwebsocket_set_timeout(wsi, NO_PENDING_TIMEOUT, 0); /* free up his parsing allocations */ + if (wsi->u.hdr.ah) free(wsi->u.hdr.ah); - /* mark him as being alive */ - + lws_union_transition(wsi, LWS_CONNMODE_WS_CLIENT); wsi->state = WSI_STATE_ESTABLISHED; - wsi->mode = LWS_CONNMODE_WS_CLIENT; - - /* union transition */ - - memset(&wsi->u, 0, sizeof(wsi->u)); wsi->rxflow_change_to = LWS_RXFLOW_ALLOW; diff --git a/lib/libwebsockets.c b/lib/libwebsockets.c index 27201605..6a9f466b 100644 --- a/lib/libwebsockets.c +++ b/lib/libwebsockets.c @@ -847,3 +847,10 @@ lws_get_peer_write_allowance(struct libwebsocket *wsi) return -1; #endif } + +LWS_VISIBLE void +lws_union_transition(struct libwebsocket *wsi, enum connection_mode mode) +{ + memset(&wsi->u, 0, sizeof(wsi->u)); + wsi->mode = mode; +} diff --git a/lib/private-libwebsockets.h b/lib/private-libwebsockets.h index a843501d..2b3e10a1 100755 --- a/lib/private-libwebsockets.h +++ b/lib/private-libwebsockets.h @@ -957,6 +957,9 @@ lws_issue_raw_ext_access(struct libwebsocket *wsi, LWS_EXTERN int _libwebsocket_rx_flow_control(struct libwebsocket *wsi); +LWS_EXTERN void +lws_union_transition(struct libwebsocket *wsi, enum connection_mode mode); + LWS_EXTERN int user_callback_handle_rxflow(callback_function, struct libwebsocket_context *context, diff --git a/lib/server.c b/lib/server.c index 3d1d4c82..057ad69a 100644 --- a/lib/server.c +++ b/lib/server.c @@ -361,9 +361,7 @@ int lws_handshake_server(struct libwebsocket_context *context, ah = wsi->u.hdr.ah; - /* union transition */ - memset(&wsi->u, 0, sizeof(wsi->u)); - wsi->mode = LWS_CONNMODE_HTTP_SERVING_ACCEPTED; + lws_union_transition(wsi, LWS_CONNMODE_HTTP_SERVING_ACCEPTED); wsi->state = WSI_STATE_HTTP; wsi->u.http.fd = LWS_INVALID_FILE; @@ -407,10 +405,7 @@ upgrade_h2c: ah = wsi->u.hdr.ah; - wsi->mode = LWS_CONNMODE_HTTP2_SERVING; - - /* union transition */ - memset(&wsi->u, 0, sizeof(wsi->u)); + lws_union_transition(wsi, LWS_CONNMODE_HTTP2_SERVING); /* http2 union member has http union struct at start */ wsi->u.http.ah = ah; @@ -552,10 +547,7 @@ upgrade_ws: /* drop the header info -- no bail_nuke_ah after this */ lws_free_header_table(wsi); - wsi->mode = LWS_CONNMODE_WS_SERVING; - - /* union transition */ - memset(&wsi->u, 0, sizeof(wsi->u)); + lws_union_transition(wsi, LWS_CONNMODE_WS_SERVING); /* * create the frame buffer for this connection according to the diff --git a/lib/ssl-http2.c b/lib/ssl-http2.c index 832d9150..caa028ca 100644 --- a/lib/ssl-http2.c +++ b/lib/ssl-http2.c @@ -132,16 +132,13 @@ void lws_http2_configure_if_upgraded(struct libwebsocket *wsi) return; /* http2 */ - - wsi->mode = LWS_CONNMODE_HTTP2_SERVING; - wsi->state = WSI_STATE_HTTP2_AWAIT_CLIENT_PREFACE; /* adopt the header info */ ah = wsi->u.hdr.ah; - /* union transition */ - memset(&wsi->u, 0, sizeof(wsi->u)); + lws_union_transition(wsi, LWS_CONNMODE_HTTP2_SERVING); + wsi->state = WSI_STATE_HTTP2_AWAIT_CLIENT_PREFACE; /* http2 union member has http union struct at start */ wsi->u.http.ah = ah;