From 40e5c744dac364081fabe265d632d84d281b493e Mon Sep 17 00:00:00 2001
From: Sergey Lyubka <valenok@gmail.com>
Date: Fri, 17 Jan 2014 15:49:16 +0000
Subject: [PATCH] Calling long-running URI handlers on each poll iteration

---
 mongoose.c | 15 +++++++++------
 1 file changed, 9 insertions(+), 6 deletions(-)

diff --git a/mongoose.c b/mongoose.c
index ae753c94a..9542ceef7 100644
--- a/mongoose.c
+++ b/mongoose.c
@@ -318,7 +318,8 @@ enum connection_flags {
   CONN_HEADERS_SENT = 8,      // User callback has sent HTTP headers
   CONN_BUFFER = 16,           // CGI only. Holds data send until CGI prints
                               // all HTTP headers
-  CONN_CONNECTED = 32         // HTTP client has connected
+  CONN_CONNECTED = 32,        // HTTP client has connected
+  CONN_LONG_RUNNING = 64      // Long-running URI handlers
 };
 
 struct connection {
@@ -1917,6 +1918,8 @@ static void call_uri_handler(struct connection *conn) {
       write_terminating_chunk(conn);
     }
     close_local_endpoint(conn);
+  } else {
+    conn->flags |= CONN_LONG_RUNNING;
   }
 }
 
@@ -1940,11 +1943,6 @@ static void write_to_client(struct connection *conn) {
     conn->num_bytes_sent += n;
   }
 
-  if (conn->endpoint_type == EP_USER && !conn->mg_conn.is_websocket) {
-    conn->mg_conn.wsbits = conn->flags & CONN_CLOSE ? 1 : 0;
-    call_uri_handler(conn);
-  }
-
   if (io->len == 0 && conn->flags & CONN_SPOOL_DONE) {
     conn->flags |= CONN_CLOSE;
   }
@@ -3741,6 +3739,11 @@ unsigned int mg_poll_server(struct mg_server *server, int milliseconds) {
         conn->last_activity_time = current_time;
         write_to_client(conn);
       }
+
+      if (conn->flags & CONN_LONG_RUNNING) {
+        conn->mg_conn.wsbits = conn->flags & CONN_CLOSE ? 1 : 0;
+        call_uri_handler(conn);
+      }
     }
   }
 
-- 
GitLab