diff --git a/examples/websocket.c b/examples/websocket.c
index 4451969b5a046fbf27842e71975330c35535c98b..602e687e31462f8f6fc3d36b4438b3eca9bfaa6f 100644
--- a/examples/websocket.c
+++ b/examples/websocket.c
@@ -3,6 +3,7 @@
 
 #include <stdio.h>
 #include <string.h>
+#include <stdlib.h>
 #include "mongoose.h"
 
 static int event_handler(struct mg_event *event) {
@@ -25,14 +26,16 @@ static int event_handler(struct mg_event *event) {
         mg_websocket_write(event->conn, WEBSOCKET_OPCODE_TEXT,
                            server_ready_message, strlen(server_ready_message));
 
+        // Read messages sent by client. Echo them back.
         while ((len = mg_websocket_read(event->conn, &bits, &data)) > 0) {
-          // Echo message back to the client
-          mg_websocket_write(event->conn, WEBSOCKET_OPCODE_TEXT, data, len);
           printf("got message: [%.*s]\n", len, data);
+          mg_websocket_write(event->conn, WEBSOCKET_OPCODE_TEXT, data, len);
+          free(data); // It's our responsibility to free allocated message
+
+          // If the message is "exit", close the connection, exit the loop
           if (memcmp(data, "exit", 4) == 0) {
             mg_websocket_write(event->conn,
                                WEBSOCKET_OPCODE_CONNECTION_CLOSE, "", 0);
-            free(data);
             break;
           }
         }