diff --git a/lib/handshake.c b/lib/handshake.c index 50138dd8..bfcad656 100644 --- a/lib/handshake.c +++ b/lib/handshake.c @@ -96,7 +96,7 @@ libwebsocket_read(struct libwebsocket_context *context, for (n = 0; n < len; n++) if (libwebsocket_parse(wsi, *buf++)) { lwsl_info("libwebsocket_parse failed\n"); - goto bail; + goto bail_nuke_ah; } if (wsi->u.hdr.parser_state != WSI_PARSING_COMPLETE) @@ -104,6 +104,8 @@ libwebsocket_read(struct libwebsocket_context *context, lwsl_parser("libwebsocket_parse sees parsing complete\n"); + wsi->mode = LWS_CONNMODE_PRE_WS_SERVING_ACCEPT; + /* is this websocket protocol or normal http 1.0? */ if (!lws_hdr_total_length(wsi, WSI_TOKEN_UPGRADE) || @@ -113,21 +115,14 @@ libwebsocket_read(struct libwebsocket_context *context, if (!lws_hdr_total_length(wsi, WSI_TOKEN_GET_URI)) { lwsl_warn("Missing URI in HTTP request\n"); - /* drop the header info */ - if (wsi->u.hdr.ah) - free(wsi->u.hdr.ah); - goto bail; + goto bail_nuke_ah; } lwsl_info("HTTP request for '%s'\n", lws_hdr_simple_ptr(wsi, WSI_TOKEN_GET_URI)); - if (libwebsocket_ensure_user_space(wsi)) { - /* drop the header info */ - if (wsi->u.hdr.ah) - free(wsi->u.hdr.ah); - goto bail; - } + if (libwebsocket_ensure_user_space(wsi)) + goto bail_nuke_ah; /* * Hm we still need the headers so the @@ -143,6 +138,7 @@ libwebsocket_read(struct libwebsocket_context *context, /* union transition */ memset(&wsi->u, 0, sizeof(wsi->u)); + wsi->mode = LWS_CONNMODE_HTTP_SERVING; wsi->state = WSI_STATE_HTTP; n = 0; if (wsi->protocol->callback) @@ -196,7 +192,7 @@ libwebsocket_read(struct libwebsocket_context *context, } else { lwsl_err("Req protocol %s not supported\n", lws_hdr_simple_ptr(wsi, WSI_TOKEN_PROTOCOL)); - goto bail; + goto bail_nuke_ah; } } @@ -299,6 +295,11 @@ libwebsocket_read(struct libwebsocket_context *context, return 0; +bail_nuke_ah: + /* drop the header info */ + if (wsi->u.hdr.ah) + free(wsi->u.hdr.ah); + bail: lwsl_info("closing connection at libwebsocket_read bail:\n"); diff --git a/lib/libwebsockets.c b/lib/libwebsockets.c index 0c85f0af..c3615279 100644 --- a/lib/libwebsockets.c +++ b/lib/libwebsockets.c @@ -207,6 +207,7 @@ libwebsocket_close_and_free_session(struct libwebsocket_context *context, wsi->u.ws.close_reason = reason; if (wsi->mode == LWS_CONNMODE_HTTP_SERVING && wsi->u.http.fd) { + lwsl_notice("closing http fd %d\n", wsi->u.http.fd); close(wsi->u.http.fd); wsi->u.http.fd = 0; } diff --git a/lib/private-libwebsockets.h b/lib/private-libwebsockets.h index f1ff5c8e..eecdd3d1 100644 --- a/lib/private-libwebsockets.h +++ b/lib/private-libwebsockets.h @@ -208,6 +208,7 @@ enum lws_rx_parse_state { enum connection_mode { LWS_CONNMODE_HTTP_SERVING, + LWS_CONNMODE_PRE_WS_SERVING_ACCEPT, LWS_CONNMODE_WS_SERVING, LWS_CONNMODE_WS_CLIENT,