[mapguide-commits] r9685 - sandbox/jng/ogc_viewer_representation/Web/src/DevHttpServer

svn_mapguide at osgeo.org svn_mapguide at osgeo.org
Fri Jul 24 04:10:57 PDT 2020


Author: jng
Date: 2020-07-24 04:10:57 -0700 (Fri, 24 Jul 2020)
New Revision: 9685

Modified:
   sandbox/jng/ogc_viewer_representation/Web/src/DevHttpServer/main.cpp
Log:
Add graceful shutdown support (via window close or Ctrl-C)

Modified: sandbox/jng/ogc_viewer_representation/Web/src/DevHttpServer/main.cpp
===================================================================
--- sandbox/jng/ogc_viewer_representation/Web/src/DevHttpServer/main.cpp	2020-07-24 11:01:41 UTC (rev 9684)
+++ sandbox/jng/ogc_viewer_representation/Web/src/DevHttpServer/main.cpp	2020-07-24 11:10:57 UTC (rev 9685)
@@ -36,15 +36,35 @@
 int port = 8000;
 const char* host = "localhost";
 
-void OutputMgReader(httplib::Response& res, MgReader* reader)
+std::unique_ptr<httplib::Server> g_server;
+
+#ifdef _WIN32
+BOOL WINAPI ConsoleControlHandler(DWORD fdwCtrlType)
 {
-    res.set_chunked_content_provider(
-        [reader](size_t offset, httplib::DataSink& sink) {
-            
-            return true;
-        }
-    );
+    switch (fdwCtrlType)
+    {
+    case CTRL_C_EVENT:
+        printf("Ctrl-C: Shutdown server\n");
+        g_server->stop();
+        return TRUE;
+    case CTRL_CLOSE_EVENT: //FIXME: Huh? Closing the console window or stopping the VS debug session doesn't trigger this. VS reports non-zero exit code as a result!
+        printf("Application Close: Shutdown server\n");
+        g_server->stop();
+        return TRUE;
+    }
+    return FALSE;
 }
+#else
+volatile sig_atomic_t flag = 0;
+void LinuxControlHandler(int sig)
+{
+    if (!flag)
+    {
+        g_server->stop();
+        flag = 1;
+    }
+}
+#endif
 
 void OutputByteReader(httplib::Response& res, MgByteReader* outputReader)
 {
@@ -220,7 +240,6 @@
             std::string contentType = MgUtil::WideCharToMultiByte(result->GetResultContentType());
 
             auto br = dynamic_cast<MgByteReader*>(resultObj.p);
-            auto rdr = dynamic_cast<MgReader*>(resultObj.p);
             auto sc = dynamic_cast<MgStringCollection*>(resultObj.p);
             auto scr = dynamic_cast<MgSpatialContextReader*>(resultObj.p);
             auto ltr = dynamic_cast<MgLongTransactionReader*>(resultObj.p);
@@ -229,10 +248,6 @@
             {
                 OutputByteReader(res, br);
             }
-            else if (rdr != nullptr)
-            {
-                OutputMgReader(res, rdr);
-            }
             else if (sc != nullptr)
             {
                 Ptr<MgByteReader> byteReader = sc->ToXml();
@@ -371,18 +386,27 @@
         }
     }
 
-    httplib::Server server;
+    g_server.reset(new httplib::Server());
 
-    server.set_mount_point("/mapguide", "./wwwroot");
+    g_server->set_mount_point("/mapguide", "./wwwroot");
 
-    server.Post("/mapguide/mapagent/mapagent.fcgi", MapAgentHandler);
-    server.Get("/mapguide/mapagent/mapagent.fcgi", MapAgentHandler);
+    g_server->Post("/mapguide/mapagent/mapagent.fcgi", MapAgentHandler);
+    g_server->Get("/mapguide/mapagent/mapagent.fcgi", MapAgentHandler);
 
     printf("Listening on port %d\n", port);
-    //TODO: Gracefully handle Ctrl-C shutdown
-    server.listen("localhost", port);
 
+#ifdef _WIN32
+    if (!SetConsoleCtrlHandler(ConsoleControlHandler, TRUE))
     {
+        fprintf(stderr, "WARNING: Could not set console handler\n");
+    }
+#else
+    signal(SIGINT, LinuxControlHandler);
+#endif
+
+    g_server->listen("localhost", port);
+
+    {
         MG_TRY()
 
         MgUninitializeWebTier();



More information about the mapguide-commits mailing list