[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