diff --git a/examples/websocket.c b/examples/websocket.c
index 050c51e5dfd0112dbcfcd1ba4442e399b23b6762..4451969b5a046fbf27842e71975330c35535c98b 100644
--- a/examples/websocket.c
+++ b/examples/websocket.c
@@ -28,9 +28,11 @@ static int event_handler(struct mg_event *event) {
         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);
           if (memcmp(data, "exit", 4) == 0) {
             mg_websocket_write(event->conn,
                                WEBSOCKET_OPCODE_CONNECTION_CLOSE, "", 0);
+            free(data);
             break;
           }
         }
diff --git a/mongoose.c b/mongoose.c
index 7a97dd3fda74263cb99db32738d0df40e69584de..26e94e64f9f24ba434bf0c417009803e91870871 100644
--- a/mongoose.c
+++ b/mongoose.c
@@ -4090,14 +4090,7 @@ int mg_websocket_read(struct mg_connection *conn, int *bits, char **data) {
         }
       }
 
-      // Exit the loop if callback signalled to exit,
-      // or "connection close" opcode received.
-      if ((*bits & 0x0f) == WEBSOCKET_OPCODE_CONNECTION_CLOSE) {
-        return data_len;
-        stop = 1;
-      }
-
-      // Not breaking the loop, process next websocket frame.
+      return data_len;
     } else {
       // Buffering websocket request
       if ((n = pull(NULL, conn, conn->buf + conn->data_len,