diff --git a/examples/websocket.c b/examples/websocket.c
index 602e687e31462f8f6fc3d36b4438b3eca9bfaa6f..5fbf5005f819b3248163025d9afe4c33b3cab00f 100644
--- a/examples/websocket.c
+++ b/examples/websocket.c
@@ -19,7 +19,7 @@ static int event_handler(struct mg_event *event) {
       } else {
         static const char *server_ready_message = "server ready";
         char *data;
-        int bits, len;
+        int bits, len, must_exit = 0;
 
         // Handshake, and send initial server message
         mg_websocket_handshake(event->conn);
@@ -27,17 +27,21 @@ static int event_handler(struct mg_event *event) {
                            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) {
+        while (must_exit == 0 &&
+               (len = mg_websocket_read(event->conn, &bits, &data)) > 0) {
+
           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);
-            break;
+            must_exit = 1;
           }
+
+          // It's our responsibility to free allocated message
+          free(data);
         }
       }
       return 1;