#include #ifdef PLATFORM_WIN32 #include #endif using namespace Upp; #define APP_VERSION "1.0.r2" #define APP_DATE Date(2008, 9, 22) bool service_stopped = false; #ifdef PLATFORM_WIN32 static BOOL WINAPI EventHandler(DWORD CtrlType) { RLOG("EventHandler (CtrlType = " << (int)CtrlType << ")"); if(CtrlType == CTRL_LOGOFF_EVENT) RLOG("LOGOFF_EVENT (ignored)"); else { RLOG("exiting"); service_stopped = true; } return true; } void InstallSignalHandler() { SetConsoleCtrlHandler(&EventHandler, true); } #endif #ifdef PLATFORM_POSIX static void QuitSignal(int signal) { RLOG("Received signal " << signal << ", quitting..."); service_stopped = true; } void InstallSignalHandler() { signal(SIGPIPE, SIG_IGN); signal(SIGINT, &QuitSignal); signal(SIGTERM, &QuitSignal); signal(SIGKILL, &QuitSignal); } #endif CONSOLE_APP_MAIN { InstallSignalHandler(); HttpServer server; int next_id = 0; server.Logging(); Vector cmd; cmd <<= CommandLine(); int port = 1536; if(cmd.GetCount() >= 1) port = Nvl(ScanInt(cmd[0]), port); if(!server.Open(port)) { puts(Socket::GetErrorText()); return; } while(!service_stopped) { server.DelayedWrite(); server.Wait(1000); if(server.IsError()) { puts("Server error: " + Socket::GetErrorText()); puts("Reopening socket..."); fflush(stdout); if(!server.Reopen()) { puts("Reopen on server socket failed: " + Socket::GetErrorText()); return; } } fputs(NFormat("\rserver(%d) running at %`", port, GetSysTime()), stdout); fflush(stdout); One request = server.GetRequest(); if(!request) continue; HttpQuery query = request->GetQuery(); String header, body; int items = query.GetInt("ITEMS", 0, 100000, 10); String svr = query.GetString("SVR"); Htmls image_page; int i; image_page << "CMDSRV, version " << APP_VERSION << ", release date: " << Format(APP_DATE) << "
\n" "Copyright © 2005 Tomas Rylek

\n" "CMDSRV parameters: <port number, default = 1536>

\n" "Current parameters: cmdsrv " << port << "

\n" "items (" << FormatInt(items) << ") = number of output lines to generate (default = 10)
\n" "svr (" << (IsNull(svr) ? "empty" : "" + svr + "") << ") = identifier for generated output lines (default = test)
\n" "Example: http://localhost"; String wisapi = GetFileName(query.GetString("$$WISAPI")); String sample_query; sample_query << "items=" << minmax(2 * items, 10, 100000) << "&svr=A"; if(!IsNull(wisapi)) image_page << "/dir/" << wisapi << "?"; else image_page << ':' << port << "/" << "any?"; image_page << sample_query << "

\n"; for(i = 0; i < items; i++) image_page << "Line #" << (i + 1) << ", svr=" << UrlEncode(svr) << "
\n"; image_page << "

\n" "Current request:
\n"; for(i = 0; i < query.GetCount(); i++) image_page << ToHtml(query.GetKey(i)) << "=" << ToHtml(query.GetValue(i)) << "
\n"; header = HttpContentType(HttpTextHtml(CHARSET_WIN1252)); body = HtmlTitlePage("Simple text HTTP server", image_page); request->Write(header, body); request.Clear(); } }